@@ -195,7 +195,6 @@ class TestStreamsClosedByEndStream(object):
195195 @pytest .mark .parametrize (
196196 "frame" ,
197197 [
198- lambda self , ff : ff .build_data_frame (b'hello' ),
199198 lambda self , ff : ff .build_headers_frame (
200199 self .example_request_headers , flags = ['END_STREAM' ]),
201200 lambda self , ff : ff .build_headers_frame (
@@ -245,7 +244,6 @@ def test_frames_after_recv_end_will_error(self,
245244 @pytest .mark .parametrize (
246245 "frame" ,
247246 [
248- lambda self , ff : ff .build_data_frame (b'hello' ),
249247 lambda self , ff : ff .build_headers_frame (
250248 self .example_response_headers , flags = ['END_STREAM' ]),
251249 lambda self , ff : ff .build_headers_frame (
@@ -344,15 +342,15 @@ class TestStreamsClosedByRstStream(object):
344342 self .example_request_headers ),
345343 lambda self , ff : ff .build_headers_frame (
346344 self .example_request_headers , flags = ['END_STREAM' ]),
347- lambda self , ff : ff .build_data_frame (b'hello' ),
348345 ]
349346 )
350347 def test_resets_further_frames_after_recv_reset (self ,
351348 frame_factory ,
352349 frame ):
353350 """
354351 A stream that is closed by receive RST_STREAM can receive further
355- frames: it simply sends RST_STREAM for it.
352+ frames: it simply sends RST_STREAM for it, and additionally
353+ WINDOW_UPDATE for DATA frames.
356354 """
357355 c = h2 .connection .H2Connection (config = self .server_config )
358356 c .receive_data (frame_factory .preamble ())
@@ -396,14 +394,66 @@ def test_resets_further_frames_after_recv_reset(self,
396394 assert not events
397395 assert c .data_to_send () == rst_frame .serialize () * 3
398396
397+ def test_resets_further_data_frames_after_recv_reset (self ,
398+ frame_factory ):
399+ """
400+ A stream that is closed by receive RST_STREAM can receive further
401+ DATA frames: it simply sends WINDOW_UPDATE for the connection flow
402+ window, and RST_STREAM for the stream.
403+ """
404+ c = h2 .connection .H2Connection (config = self .server_config )
405+ c .receive_data (frame_factory .preamble ())
406+ c .initiate_connection ()
407+
408+ header_frame = frame_factory .build_headers_frame (
409+ self .example_request_headers , flags = ['END_STREAM' ]
410+ )
411+ c .receive_data (header_frame .serialize ())
412+
413+ c .send_headers (
414+ stream_id = 1 ,
415+ headers = self .example_response_headers ,
416+ end_stream = False
417+ )
418+
419+ rst_frame = frame_factory .build_rst_stream_frame (
420+ 1 , h2 .errors .ErrorCodes .STREAM_CLOSED
421+ )
422+ c .receive_data (rst_frame .serialize ())
423+ c .clear_outbound_data_buffer ()
424+
425+ f = frame_factory .build_data_frame (
426+ data = b'some data'
427+ )
428+
429+ events = c .receive_data (f .serialize ())
430+ assert not events
431+
432+ expected = frame_factory .build_rst_stream_frame (
433+ stream_id = 1 ,
434+ error_code = h2 .errors .ErrorCodes .STREAM_CLOSED ,
435+ ).serialize ()
436+ assert c .data_to_send () == expected
437+
438+ events = c .receive_data (f .serialize () * 3 )
439+ assert not events
440+ assert c .data_to_send () == expected * 3
441+
442+ # Iterate over the streams to make sure it's gone, then confirm the
443+ # behaviour is unchanged.
444+ c .open_outbound_streams
445+
446+ events = c .receive_data (f .serialize () * 3 )
447+ assert not events
448+ assert c .data_to_send () == expected * 3
449+
399450 @pytest .mark .parametrize (
400451 "frame" ,
401452 [
402453 lambda self , ff : ff .build_headers_frame (
403454 self .example_request_headers ),
404455 lambda self , ff : ff .build_headers_frame (
405456 self .example_request_headers , flags = ['END_STREAM' ]),
406- lambda self , ff : ff .build_data_frame (b'hello' ),
407457 ]
408458 )
409459 def test_resets_further_frames_after_send_reset (self ,
@@ -455,3 +505,51 @@ def test_resets_further_frames_after_send_reset(self,
455505 events = c .receive_data (f .serialize () * 3 )
456506 assert not events
457507 assert c .data_to_send () == rst_frame .serialize () * 3
508+
509+ def test_resets_further_data_frames_after_send_reset (self ,
510+ frame_factory ):
511+ """
512+ A stream that is closed by sent RST_STREAM can receive further
513+ data frames: it simply sends WINDOW_UPDATE and RST_STREAM for it.
514+ """
515+ c = h2 .connection .H2Connection (config = self .server_config )
516+ c .receive_data (frame_factory .preamble ())
517+ c .initiate_connection ()
518+
519+ header_frame = frame_factory .build_headers_frame (
520+ self .example_request_headers , flags = ['END_STREAM' ]
521+ )
522+ c .receive_data (header_frame .serialize ())
523+
524+ c .send_headers (
525+ stream_id = 1 ,
526+ headers = self .example_response_headers ,
527+ end_stream = False
528+ )
529+
530+ c .reset_stream (1 , h2 .errors .ErrorCodes .INTERNAL_ERROR )
531+
532+ c .clear_outbound_data_buffer ()
533+
534+ f = frame_factory .build_data_frame (
535+ data = b'some data'
536+ )
537+ events = c .receive_data (f .serialize ())
538+ assert not events
539+ expected = frame_factory .build_rst_stream_frame (
540+ stream_id = 1 ,
541+ error_code = h2 .errors .ErrorCodes .STREAM_CLOSED ,
542+ ).serialize ()
543+ assert c .data_to_send () == expected
544+
545+ events = c .receive_data (f .serialize () * 3 )
546+ assert not events
547+ assert c .data_to_send () == expected * 3
548+
549+ # Iterate over the streams to make sure it's gone, then confirm the
550+ # behaviour is unchanged.
551+ c .open_outbound_streams
552+
553+ events = c .receive_data (f .serialize () * 3 )
554+ assert not events
555+ assert c .data_to_send () == expected * 3
0 commit comments