Skip to content

Commit 6579a47

Browse files
seanmonstar0xE282B0
authored andcommitted
fix(http1): properly end chunked bodies when it was known to be empty (hyperium#3254)
Closes hyperium#3252 Signed-off-by: Sven Pfennig <[email protected]>
1 parent 916346c commit 6579a47

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
@@ -368,7 +368,12 @@ where
368368
self.conn.end_body()?;
369369
}
370370
} else {
371-
return Poll::Pending;
371+
// If there's no body_rx, end the body
372+
if self.conn.can_write_body() {
373+
self.conn.end_body()?;
374+
} else {
375+
return Poll::Pending;
376+
}
372377
}
373378
}
374379
}

tests/server.rs

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

9494
fn run_test(case: TestCase) {
95+
let _ = pretty_env_logger::try_init();
9596
assert!(
9697
case.version == 0 || case.version == 1,
9798
"TestCase.version must 0 or 1"
@@ -155,18 +156,22 @@ mod response_body_lengths {
155156
let n = body.find("\r\n\r\n").unwrap() + 4;
156157

157158
if case.expects_chunked {
158-
let len = body.len();
159-
assert_eq!(
160-
&body[n + 1..n + 3],
161-
"\r\n",
162-
"expected body chunk size header"
163-
);
164-
assert_eq!(&body[n + 3..len - 7], body_str, "expected body");
165-
assert_eq!(
166-
&body[len - 7..],
167-
"\r\n0\r\n\r\n",
168-
"expected body final chunk size header"
169-
);
159+
if body_str.len() > 0 {
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+
);
172+
} else {
173+
assert_eq!(&body[n..], "0\r\n\r\n");
174+
}
170175
} else {
171176
assert_eq!(&body[n..], body_str, "expected body");
172177
}
@@ -217,6 +222,17 @@ mod response_body_lengths {
217222
});
218223
}
219224

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

0 commit comments

Comments
 (0)