Skip to content

Commit 0ba7d13

Browse files
authored
Allow responses of HEAD requests to have empty DATA frames (#490)
1 parent cb2c7ac commit 0ba7d13

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

src/proto/streams/stream.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,11 @@ impl Stream {
286286
Some(val) => *rem = val,
287287
None => return Err(()),
288288
},
289-
ContentLength::Head => return Err(()),
289+
ContentLength::Head => {
290+
if len != 0 {
291+
return Err(());
292+
}
293+
}
290294
_ => {}
291295
}
292296

tests/h2-tests/tests/client_request.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
11741218
const SETTINGS: &'static [u8] = &[0, 0, 0, 4, 0, 0, 0, 0, 0];
11751219
const SETTINGS_ACK: &'static [u8] = &[0, 0, 0, 4, 1, 0, 0, 0, 0];
11761220

0 commit comments

Comments
 (0)