@@ -1454,6 +1454,91 @@ async fn extended_connect_request() {
14541454 join ( srv, h2) . await ;
14551455}
14561456
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+
14571542const SETTINGS : & [ u8 ] = & [ 0 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 0 ] ;
14581543const SETTINGS_ACK : & [ u8 ] = & [ 0 , 0 , 0 , 4 , 1 , 0 , 0 , 0 , 0 ] ;
14591544
0 commit comments