@@ -1171,6 +1171,50 @@ async fn malformed_response_headers_dont_unlink_stream() {
11711171 join ( srv, client) . await ;
11721172}
11731173
1174+ #[ tokio:: test]
1175+ async fn allow_empty_data_for_head ( ) {
1176+ h2_support:: trace_init!( ) ;
1177+ let ( io, mut srv) = mock:: new ( ) ;
1178+
1179+ let srv = async move {
1180+ let settings = srv. assert_client_handshake ( ) . await ;
1181+ assert_default_settings ! ( settings) ;
1182+ srv. recv_frame (
1183+ frames:: headers ( 1 )
1184+ . request ( "HEAD" , "https://example.com/" )
1185+ . eos ( ) ,
1186+ )
1187+ . await ;
1188+ srv. send_frame (
1189+ frames:: headers ( 1 )
1190+ . response ( 200 )
1191+ . field ( "content-length" , 100 ) ,
1192+ )
1193+ . await ;
1194+ srv. send_frame ( frames:: data ( 1 , "" ) . eos ( ) ) . await ;
1195+ } ;
1196+
1197+ let h2 = async move {
1198+ let ( mut client, h2) = client:: Builder :: new ( )
1199+ . handshake :: < _ , Bytes > ( io)
1200+ . await
1201+ . unwrap ( ) ;
1202+ tokio:: spawn ( async {
1203+ h2. await . expect ( "connection failed" ) ;
1204+ } ) ;
1205+ let request = Request :: builder ( )
1206+ . method ( Method :: HEAD )
1207+ . uri ( "https://example.com/" )
1208+ . body ( ( ) )
1209+ . unwrap ( ) ;
1210+ let ( response, _) = client. send_request ( request, true ) . unwrap ( ) ;
1211+ let ( _, mut body) = response. await . unwrap ( ) . into_parts ( ) ;
1212+ assert_eq ! ( body. data( ) . await . unwrap( ) . unwrap( ) , "" ) ;
1213+ } ;
1214+
1215+ join ( srv, h2) . await ;
1216+ }
1217+
11741218const SETTINGS : & ' static [ u8 ] = & [ 0 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 0 ] ;
11751219const SETTINGS_ACK : & ' static [ u8 ] = & [ 0 , 0 , 0 , 4 , 1 , 0 , 0 , 0 , 0 ] ;
11761220
0 commit comments