Skip to content

Commit

Permalink
fix(server): skip automatic Content-Length headers when not allowed
Browse files Browse the repository at this point in the history
Closes #2215
  • Loading branch information
psmit committed Jul 29, 2020
1 parent 2354a7e commit bb8e341
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 10 deletions.
25 changes: 17 additions & 8 deletions src/proto/h1/role.rs
Expand Up @@ -511,7 +511,7 @@ impl Http1Transaction for Server {
encoder = match msg.body {
Some(BodyLength::Unknown) => {
if msg.head.version == Version::HTTP_10
|| !Server::can_chunked(msg.req_method, msg.head.subject)
|| !Server::can_have_content_length(msg.req_method, msg.head.subject)
{
Encoder::close_delimited()
} else {
Expand All @@ -520,13 +520,13 @@ impl Http1Transaction for Server {
}
}
None | Some(BodyLength::Known(0)) => {
if msg.head.subject != StatusCode::NOT_MODIFIED {
if Server::can_have_content_length(msg.req_method, msg.head.subject) {
extend(dst, b"content-length: 0\r\n");
}
Encoder::length(0)
}
Some(BodyLength::Known(len)) => {
if msg.head.subject == StatusCode::NOT_MODIFIED {
if !Server::can_have_content_length(msg.req_method, msg.head.subject) {
Encoder::length(0)
} else {
extend(dst, b"content-length: ");
Expand Down Expand Up @@ -595,13 +595,22 @@ impl Server {
if method == &Some(Method::HEAD) || method == &Some(Method::CONNECT) && status.is_success()
{
false
} else if status.is_informational() {
false
} else {
match status {
StatusCode::NO_CONTENT | StatusCode::NOT_MODIFIED => false,
_ => true,
}
}
}

fn can_have_content_length(method: &Option<Method>, status: StatusCode) -> bool {
if status.is_informational() || method == &Some(Method::CONNECT) && status.is_success() {
false
} else {
match status {
// TODO: support for 1xx codes needs improvement everywhere
// would be 100...199 => false
StatusCode::SWITCHING_PROTOCOLS
| StatusCode::NO_CONTENT
| StatusCode::NOT_MODIFIED => false,
StatusCode::NO_CONTENT | StatusCode::NOT_MODIFIED => false,
_ => true,
}
}
Expand Down
5 changes: 3 additions & 2 deletions tests/server.rs
Expand Up @@ -1327,8 +1327,9 @@ async fn upgrades_new() {
let mut buf = [0; 256];
tcp.read(&mut buf).expect("read 1");

let expected = "HTTP/1.1 101 Switching Protocols\r\n";
assert_eq!(s(&buf[..expected.len()]), expected);
let response = s(&buf);
assert!(response.starts_with("HTTP/1.1 101 Switching Protocols\r\n"));
assert!(!has_header(&response, "content-length"));
let _ = read_101_tx.send(());

let n = tcp.read(&mut buf).expect("read 2");
Expand Down

0 comments on commit bb8e341

Please sign in to comment.