@@ -367,6 +367,60 @@ fn recv_goaway_finishes_processed_streams() {
367
367
h2. join ( srv) . wait ( ) . expect ( "wait" ) ;
368
368
}
369
369
370
+ #[ test]
371
+ fn skipped_stream_ids_are_implicitly_closed ( ) {
372
+ let _ = :: env_logger:: init ( ) ;
373
+ let ( io, srv) = mock:: new ( ) ;
374
+
375
+ let srv = srv
376
+ . assert_client_handshake ( )
377
+ . expect ( "handshake" )
378
+ . recv_settings ( )
379
+ . recv_frame ( frames:: headers ( 5 )
380
+ . request ( "GET" , "https://example.com/" )
381
+ . eos ( ) ,
382
+ )
383
+ // send the response on a lower-numbered stream, which should be
384
+ // implicitly closed.
385
+ . send_frame ( frames:: headers ( 3 ) . response ( 200 ) ) ;
386
+
387
+ let h2 = Client :: builder ( )
388
+ . initial_stream_id ( 5 )
389
+ . handshake :: < _ , Bytes > ( io)
390
+ . expect ( "handshake" )
391
+ . and_then ( |( mut client, h2) | {
392
+ let request = Request :: builder ( )
393
+ . method ( Method :: GET )
394
+ . uri ( "https://example.com/" )
395
+ . body ( ( ) )
396
+ . unwrap ( ) ;
397
+
398
+ let req = client. send_request ( request, true )
399
+ . unwrap ( )
400
+ . 0 . then ( |res| {
401
+ let err = res. unwrap_err ( ) ;
402
+ assert_eq ! (
403
+ err. to_string( ) ,
404
+ "protocol error: unspecific protocol error detected" ) ;
405
+ Ok :: < ( ) , ( ) > ( ( ) )
406
+ } ) ;
407
+ // client should see a conn error
408
+ let conn = h2. then ( |res| {
409
+ let err = res. unwrap_err ( ) ;
410
+ assert_eq ! (
411
+ err. to_string( ) ,
412
+ "protocol error: unspecific protocol error detected"
413
+ ) ;
414
+ Ok :: < ( ) , ( ) > ( ( ) )
415
+ } ) ;
416
+ conn. unwrap ( ) . join ( req)
417
+ } ) ;
418
+
419
+
420
+ h2. join ( srv) . wait ( ) . expect ( "wait" ) ;
421
+
422
+ }
423
+
370
424
/*
371
425
#[test]
372
426
fn send_data_after_headers_eos() {
0 commit comments