Skip to content

Commit 32422c4

Browse files
committed
fix(http1): properly end chunked bodies when it was known to be empty (#3254)
Closes #3252
1 parent 297dc4c commit 32422c4

File tree

2 files changed

+34
-13
lines changed

2 files changed

+34
-13
lines changed

src/proto/h1/dispatch.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,12 @@ where
367367
self.conn.end_body()?;
368368
}
369369
} else {
370-
return Poll::Pending;
370+
// If there's no body_rx, end the body
371+
if self.conn.can_write_body() {
372+
self.conn.end_body()?;
373+
} else {
374+
return Poll::Pending;
375+
}
371376
}
372377
}
373378
}

tests/server.rs

+28-12
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ mod response_body_lengths {
9393
}
9494

9595
fn run_test(case: TestCase) {
96+
let _ = pretty_env_logger::try_init();
9697
assert!(
9798
case.version == 0 || case.version == 1,
9899
"TestCase.version must 0 or 1"
@@ -157,18 +158,22 @@ mod response_body_lengths {
157158
let n = body.find("\r\n\r\n").unwrap() + 4;
158159

159160
if case.expects_chunked {
160-
let len = body.len();
161-
assert_eq!(
162-
&body[n + 1..n + 3],
163-
"\r\n",
164-
"expected body chunk size header"
165-
);
166-
assert_eq!(&body[n + 3..len - 7], body_str, "expected body");
167-
assert_eq!(
168-
&body[len - 7..],
169-
"\r\n0\r\n\r\n",
170-
"expected body final chunk size header"
171-
);
161+
if body_str.len() > 0 {
162+
let len = body.len();
163+
assert_eq!(
164+
&body[n + 1..n + 3],
165+
"\r\n",
166+
"expected body chunk size header"
167+
);
168+
assert_eq!(&body[n + 3..len - 7], body_str, "expected body");
169+
assert_eq!(
170+
&body[len - 7..],
171+
"\r\n0\r\n\r\n",
172+
"expected body final chunk size header"
173+
);
174+
} else {
175+
assert_eq!(&body[n..], "0\r\n\r\n");
176+
}
172177
} else {
173178
assert_eq!(&body[n..], body_str, "expected body");
174179
}
@@ -219,6 +224,17 @@ mod response_body_lengths {
219224
});
220225
}
221226

227+
#[test]
228+
fn chunked_response_known_empty() {
229+
run_test(TestCase {
230+
version: 1,
231+
headers: &[("transfer-encoding", "chunked")],
232+
body: Bd::Known(""),
233+
expects_chunked: true, // should still send chunked, and 0\r\n\r\n
234+
expects_con_len: false,
235+
});
236+
}
237+
222238
#[test]
223239
fn chunked_response_unknown() {
224240
run_test(TestCase {

0 commit comments

Comments
 (0)