@@ -1454,6 +1454,91 @@ async fn extended_connect_request() {
1454
1454
join ( srv, h2) . await ;
1455
1455
}
1456
1456
1457
+ #[ tokio:: test]
1458
+ async fn rogue_server_odd_headers ( ) {
1459
+ h2_support:: trace_init!( ) ;
1460
+ let ( io, mut srv) = mock:: new ( ) ;
1461
+
1462
+ let srv = async move {
1463
+ let settings = srv. assert_client_handshake ( ) . await ;
1464
+ assert_default_settings ! ( settings) ;
1465
+ srv. send_frame ( frames:: headers ( 1 ) ) . await ;
1466
+ srv. recv_frame ( frames:: go_away ( 0 ) . protocol_error ( ) ) . await ;
1467
+ } ;
1468
+
1469
+ let h2 = async move {
1470
+ let ( _client, h2) = client:: handshake ( io) . await . unwrap ( ) ;
1471
+
1472
+ let err = h2. await . unwrap_err ( ) ;
1473
+ assert ! ( err. is_go_away( ) ) ;
1474
+ assert_eq ! ( err. reason( ) , Some ( Reason :: PROTOCOL_ERROR ) ) ;
1475
+ } ;
1476
+
1477
+ join ( srv, h2) . await ;
1478
+ }
1479
+
1480
+ #[ tokio:: test]
1481
+ async fn rogue_server_even_headers ( ) {
1482
+ h2_support:: trace_init!( ) ;
1483
+ let ( io, mut srv) = mock:: new ( ) ;
1484
+
1485
+ let srv = async move {
1486
+ let settings = srv. assert_client_handshake ( ) . await ;
1487
+ assert_default_settings ! ( settings) ;
1488
+ srv. send_frame ( frames:: headers ( 2 ) ) . await ;
1489
+ srv. recv_frame ( frames:: go_away ( 0 ) . protocol_error ( ) ) . await ;
1490
+ } ;
1491
+
1492
+ let h2 = async move {
1493
+ let ( _client, h2) = client:: handshake ( io) . await . unwrap ( ) ;
1494
+
1495
+ let err = h2. await . unwrap_err ( ) ;
1496
+ assert ! ( err. is_go_away( ) ) ;
1497
+ assert_eq ! ( err. reason( ) , Some ( Reason :: PROTOCOL_ERROR ) ) ;
1498
+ } ;
1499
+
1500
+ join ( srv, h2) . await ;
1501
+ }
1502
+
1503
+ #[ tokio:: test]
1504
+ async fn rogue_server_reused_headers ( ) {
1505
+ h2_support:: trace_init!( ) ;
1506
+ let ( io, mut srv) = mock:: new ( ) ;
1507
+
1508
+ let srv = async move {
1509
+ let settings = srv. assert_client_handshake ( ) . await ;
1510
+ assert_default_settings ! ( settings) ;
1511
+
1512
+ srv. recv_frame (
1513
+ frames:: headers ( 1 )
1514
+ . request ( "GET" , "https://camembert.fromage" )
1515
+ . eos ( ) ,
1516
+ )
1517
+ . await ;
1518
+ srv. send_frame ( frames:: headers ( 1 ) . response ( 200 ) . eos ( ) ) . await ;
1519
+ srv. send_frame ( frames:: headers ( 1 ) ) . await ;
1520
+ srv. recv_frame ( frames:: reset ( 1 ) . stream_closed ( ) ) . await ;
1521
+ } ;
1522
+
1523
+ let h2 = async move {
1524
+ let ( mut client, mut h2) = client:: handshake ( io) . await . unwrap ( ) ;
1525
+
1526
+ h2. drive ( async {
1527
+ let request = Request :: builder ( )
1528
+ . method ( Method :: GET )
1529
+ . uri ( "https://camembert.fromage" )
1530
+ . body ( ( ) )
1531
+ . unwrap ( ) ;
1532
+ let _res = client. send_request ( request, true ) . unwrap ( ) . 0 . await . unwrap ( ) ;
1533
+ } )
1534
+ . await ;
1535
+
1536
+ h2. await . unwrap ( ) ;
1537
+ } ;
1538
+
1539
+ join ( srv, h2) . await ;
1540
+ }
1541
+
1457
1542
const SETTINGS : & [ u8 ] = & [ 0 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 0 ] ;
1458
1543
const SETTINGS_ACK : & [ u8 ] = & [ 0 , 0 , 0 , 4 , 1 , 0 , 0 , 0 , 0 ] ;
1459
1544
0 commit comments