This repository was archived by the owner on Jan 13, 2021. It is now read-only.
File tree Expand file tree Collapse file tree 4 files changed +41
-3
lines changed Expand file tree Collapse file tree 4 files changed +41
-3
lines changed Original file line number Diff line number Diff line change @@ -4,6 +4,10 @@ Release History
4
4
dev
5
5
---
6
6
7
+ *Bugfixes *
8
+
9
+ - Tolerate errors when attempting to send a RST_STREAM frame.
10
+
7
11
0.6.0 (2016-05-06)
8
12
------------------
9
13
Original file line number Diff line number Diff line change @@ -727,7 +727,7 @@ def _recv_cb(self, stream_id=0):
727
727
# Ignore this read if some other thread has recently read data from
728
728
# from the requested stream.
729
729
#
730
- # The lock here looks broad, but is need to ensure correct behavior
730
+ # The lock here looks broad, but is needed to ensure correct behavior
731
731
# when there are multiple readers of the same stream. It is
732
732
# re-acquired in the calls to self._single_read.
733
733
#
Original file line number Diff line number Diff line change 13
13
Each stream is identified by a monotonically increasing integer, assigned to
14
14
the stream by the endpoint that initiated the stream.
15
15
"""
16
+ import h2 .exceptions
17
+
16
18
from ..common .headers import HTTPHeaderMap
17
19
from .util import h2_safe_headers
18
20
import logging
@@ -275,8 +277,16 @@ def close(self, error_code=None):
275
277
"""
276
278
# FIXME: I think this is overbroad, but for now it's probably ok.
277
279
if not (self .remote_closed and self .local_closed ):
278
- self ._conn .reset_stream (self .stream_id , error_code or 0 )
279
- self ._send_cb (self ._conn .data_to_send ())
280
+ try :
281
+ self ._conn .reset_stream (self .stream_id , error_code or 0 )
282
+ except h2 .exceptions .ProtocolError :
283
+ # If for any reason we can't reset the stream, just tolerate
284
+ # it.
285
+ pass
286
+ else :
287
+ self ._send_cb (
288
+ self ._conn .data_to_send (), tolerate_peer_gone = True
289
+ )
280
290
self .remote_closed = True
281
291
self .local_closed = True
282
292
Original file line number Diff line number Diff line change @@ -1067,6 +1067,29 @@ def test_goaway_frame_invalid_error_code(self):
1067
1067
1068
1068
assert str (f .error_code ) in err_msg
1069
1069
1070
+ def test_resetting_streams_after_close (self ):
1071
+ """
1072
+ Attempts to reset streams when the connection is torn down are
1073
+ tolerated.
1074
+ """
1075
+ f = SettingsFrame (0 )
1076
+
1077
+ c = HTTP20Connection ('www.google.com' )
1078
+ c ._sock = DummySocket ()
1079
+ c ._sock .buffer = BytesIO (f .serialize ())
1080
+
1081
+ # Open stream 1.
1082
+ c .request ('GET' , '/' )
1083
+
1084
+ # Swap out the buffer to get a GoAway frame.
1085
+ f = GoAwayFrame (0 )
1086
+ f .error_code = 1
1087
+ c ._sock .buffer = BytesIO (f .serialize ())
1088
+
1089
+ # "Read" the GoAway
1090
+ with pytest .raises (ConnectionError ):
1091
+ c ._single_read ()
1092
+
1070
1093
1071
1094
# Some utility classes for the tests.
1072
1095
class NullEncoder (object ):
@@ -1107,6 +1130,7 @@ def buffer(self):
1107
1130
@buffer .setter
1108
1131
def buffer (self , value ):
1109
1132
self ._buffer = value
1133
+ self ._read_counter = 0
1110
1134
1111
1135
def advance_buffer (self , amt ):
1112
1136
self ._read_counter += amt
You can’t perform that action at this time.
0 commit comments