Skip to content

Commit

Permalink
fix(http1): fix response with non-chunked transfer-encoding to be clo…
Browse files Browse the repository at this point in the history
…se-delimited

Closes #2058
  • Loading branch information
seanmonstar committed Dec 12, 2019
1 parent e123290 commit cb71d2c
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 3 deletions.
17 changes: 15 additions & 2 deletions src/proto/h1/role.rs
Original file line number Diff line number Diff line change
Expand Up @@ -800,7 +800,7 @@ impl Client {
Ok(Some((DecodedLength::CHUNKED, false)))
} else {
trace!("not chunked, read till eof");
Ok(Some((DecodedLength::CHUNKED, false)))
Ok(Some((DecodedLength::CLOSE_DELIMITED, false)))
}
} else if let Some(len) = headers::content_length_parse_all(&inc.headers) {
Ok(Some((DecodedLength::checked_new(len)?, false)))
Expand Down Expand Up @@ -1441,7 +1441,7 @@ mod tests {
",
);

// transfer-encoding
// transfer-encoding: chunked
assert_eq!(
parse(
"\
Expand All @@ -1454,6 +1454,19 @@ mod tests {
DecodedLength::CHUNKED
);

// transfer-encoding not-chunked is close-delimited
assert_eq!(
parse(
"\
HTTP/1.1 200 OK\r\n\
transfer-encoding: yolo\r\n\
\r\n\
"
)
.decode,
DecodedLength::CLOSE_DELIMITED
);

// transfer-encoding and content-length = chunked
assert_eq!(
parse(
Expand Down
12 changes: 11 additions & 1 deletion src/proto/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ pub(crate) enum Dispatched {
mod body_length {
use std::fmt;

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[derive(Clone, Copy, PartialEq, Eq)]
pub(crate) struct DecodedLength(u64);

const MAX_LEN: u64 = ::std::u64::MAX - 2;
Expand Down Expand Up @@ -92,6 +92,16 @@ mod body_length {
}
}

impl fmt::Debug for DecodedLength {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match *self {
DecodedLength::CLOSE_DELIMITED => f.write_str("CLOSE_DELIMITED"),
DecodedLength::CHUNKED => f.write_str("CHUNKED"),
DecodedLength(n) => f.debug_tuple("DecodedLength").field(&n).finish(),
}
}
}

impl fmt::Display for DecodedLength {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match *self {
Expand Down
29 changes: 29 additions & 0 deletions tests/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -655,6 +655,35 @@ test! {
body: None,
}

test! {
name: client_response_transfer_encoding_not_chunked,

server:
expected: "\
GET /te-not-chunked HTTP/1.1\r\n\
host: {addr}\r\n\
\r\n\
",
reply: "\
HTTP/1.1 200 OK\r\n\
transfer-encoding: yolo\r\n\
\r\n\
hallo\
",

client:
request: {
method: GET,
url: "http://{addr}/te-not-chunked",
},
response:
status: OK,
headers: {
"transfer-encoding" => "yolo",
},
body: &b"hallo"[..],
}

test! {
name: client_pipeline_responses_extra,

Expand Down

0 comments on commit cb71d2c

Please sign in to comment.