fix(client): HTTP/1 client "Transfer-Encoding" repair code would panic (#2410)
Closes #2409
This commit is contained in:
@@ -117,9 +117,9 @@ pub(super) fn add_chunked(mut entry: http::header::OccupiedEntry<'_, HeaderValue
|
|||||||
// + 2 for ", "
|
// + 2 for ", "
|
||||||
let new_cap = line.as_bytes().len() + CHUNKED.len() + 2;
|
let new_cap = line.as_bytes().len() + CHUNKED.len() + 2;
|
||||||
let mut buf = BytesMut::with_capacity(new_cap);
|
let mut buf = BytesMut::with_capacity(new_cap);
|
||||||
buf.copy_from_slice(line.as_bytes());
|
buf.extend_from_slice(line.as_bytes());
|
||||||
buf.copy_from_slice(b", ");
|
buf.extend_from_slice(b", ");
|
||||||
buf.copy_from_slice(CHUNKED.as_bytes());
|
buf.extend_from_slice(CHUNKED.as_bytes());
|
||||||
|
|
||||||
*line = HeaderValue::from_maybe_shared(buf.freeze())
|
*line = HeaderValue::from_maybe_shared(buf.freeze())
|
||||||
.expect("original header value plus ascii is valid");
|
.expect("original header value plus ascii is valid");
|
||||||
|
|||||||
@@ -401,6 +401,36 @@ test! {
|
|||||||
body: None,
|
body: None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test! {
|
||||||
|
name: client_transfer_encoding_repair,
|
||||||
|
|
||||||
|
server:
|
||||||
|
expected: "\
|
||||||
|
GET / HTTP/1.1\r\n\
|
||||||
|
transfer-encoding: foo, chunked\r\n\
|
||||||
|
host: {addr}\r\n\
|
||||||
|
\r\n\
|
||||||
|
5\r\n\
|
||||||
|
hello\r\n\
|
||||||
|
0\r\n\r\n\
|
||||||
|
",
|
||||||
|
reply: REPLY_OK,
|
||||||
|
|
||||||
|
client:
|
||||||
|
request: {
|
||||||
|
method: GET,
|
||||||
|
url: "http://{addr}/",
|
||||||
|
headers: {
|
||||||
|
"transfer-encoding" => "foo",
|
||||||
|
},
|
||||||
|
body: "hello", // not Body::empty
|
||||||
|
},
|
||||||
|
response:
|
||||||
|
status: OK,
|
||||||
|
headers: {},
|
||||||
|
body: None,
|
||||||
|
}
|
||||||
|
|
||||||
test! {
|
test! {
|
||||||
name: client_get_req_body_chunked_http10,
|
name: client_get_req_body_chunked_http10,
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user