refactor(http1): reject newlines in chunked extensions
We don't really care what bytes are in chunked extensions. We ignore them until we find a CRLF. However, some other HTTP implementations may only look for a LF, and forget that chunked requires the CR as well. To save them from themselves, this makes hyper reject any chunked extensions that include an LF byte. This isn't a *bug*. No one ever cares what's in the extensions. This is meant as a way to help implementations that don't decoded chunked encoding correctly. This shouldn't affect really anyone in the real world.
This commit is contained in:
@@ -268,8 +268,18 @@ impl ChunkedState {
|
|||||||
rdr: &mut R,
|
rdr: &mut R,
|
||||||
) -> Poll<Result<ChunkedState, io::Error>> {
|
) -> Poll<Result<ChunkedState, io::Error>> {
|
||||||
trace!("read_extension");
|
trace!("read_extension");
|
||||||
|
// We don't care about extensions really at all. Just ignore them.
|
||||||
|
// They "end" at the next CRLF.
|
||||||
|
//
|
||||||
|
// However, some implementations may not check for the CR, so to save
|
||||||
|
// them from themselves, we reject extensions containing plain LF as
|
||||||
|
// well.
|
||||||
match byte!(rdr, cx) {
|
match byte!(rdr, cx) {
|
||||||
b'\r' => Poll::Ready(Ok(ChunkedState::SizeLf)),
|
b'\r' => Poll::Ready(Ok(ChunkedState::SizeLf)),
|
||||||
|
b'\n' => Poll::Ready(Err(io::Error::new(
|
||||||
|
io::ErrorKind::InvalidData,
|
||||||
|
"invalid chunk extension contains newline",
|
||||||
|
))),
|
||||||
_ => Poll::Ready(Ok(ChunkedState::Extension)), // no supported extensions
|
_ => Poll::Ready(Ok(ChunkedState::Extension)), // no supported extensions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -537,6 +547,7 @@ mod tests {
|
|||||||
read_err("1 invalid extension\r\n", InvalidInput).await;
|
read_err("1 invalid extension\r\n", InvalidInput).await;
|
||||||
read_err("1 A\r\n", InvalidInput).await;
|
read_err("1 A\r\n", InvalidInput).await;
|
||||||
read_err("1;no CRLF", UnexpectedEof).await;
|
read_err("1;no CRLF", UnexpectedEof).await;
|
||||||
|
read_err("1;reject\nnewlines\r\n", InvalidData).await;
|
||||||
// Overflow
|
// Overflow
|
||||||
read_err("f0000000000000003\r\n", InvalidData).await;
|
read_err("f0000000000000003\r\n", InvalidData).await;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user