fix(http1): fix server misinterpretting multiple Transfer-Encoding headers
When a request arrived with multiple `Transfer-Encoding` headers, hyper would check each if they ended with `chunked`. It should have only checked if the *last* header ended with `chunked`. See https://github.com/hyperium/hyper/security/advisories/GHSA-6hfq-h8hq-87mf
This commit is contained in:
@@ -213,6 +213,8 @@ impl Http1Transaction for Server {
|
||||
if headers::is_chunked_(&value) {
|
||||
is_te_chunked = true;
|
||||
decoder = DecodedLength::CHUNKED;
|
||||
} else {
|
||||
is_te_chunked = false;
|
||||
}
|
||||
}
|
||||
header::CONTENT_LENGTH => {
|
||||
@@ -1444,6 +1446,16 @@ mod tests {
|
||||
"transfer-encoding doesn't end in chunked",
|
||||
);
|
||||
|
||||
parse_err(
|
||||
"\
|
||||
POST / HTTP/1.1\r\n\
|
||||
transfer-encoding: chunked\r\n\
|
||||
transfer-encoding: afterlol\r\n\
|
||||
\r\n\
|
||||
",
|
||||
"transfer-encoding multiple lines doesn't end in chunked",
|
||||
);
|
||||
|
||||
// http/1.0
|
||||
|
||||
assert_eq!(
|
||||
|
||||
Reference in New Issue
Block a user