From f7ceff81dc493d90d914a3303d956b4195eda5c6 Mon Sep 17 00:00:00 2001 From: Peter Smit Date: Wed, 3 Jun 2020 11:54:41 +0200 Subject: [PATCH] fix(server): skip automatic Content-Length headers when not allowed Closes #2215 --- src/proto/h1/role.rs | 12 +++++------- tests/server.rs | 8 +++++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/proto/h1/role.rs b/src/proto/h1/role.rs index 46b8b2646e..606d995bdb 100644 --- a/src/proto/h1/role.rs +++ b/src/proto/h1/role.rs @@ -520,13 +520,13 @@ impl Http1Transaction for Server { } } None | Some(BodyLength::Known(0)) => { - if msg.head.subject != StatusCode::NOT_MODIFIED { + if Server::can_have_body(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_body(msg.req_method, msg.head.subject) { Encoder::length(0) } else { extend(dst, b"content-length: "); @@ -595,13 +595,11 @@ impl Server { if method == &Some(Method::HEAD) || method == &Some(Method::CONNECT) && status.is_success() { false + } else if status.is_informational() { + 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, } } diff --git a/tests/server.rs b/tests/server.rs index 19b4cac25b..aaff5983c8 100644 --- a/tests/server.rs +++ b/tests/server.rs @@ -498,7 +498,7 @@ fn head_response_doesnt_send_body() { let mut response = String::new(); req.read_to_string(&mut response).unwrap(); - assert!(response.contains("content-length: 11\r\n")); + assert!(!has_header(&response, "content-length")); let mut lines = response.lines(); assert_eq!(lines.next(), Some("HTTP/1.1 200 OK")); @@ -1327,13 +1327,15 @@ 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"); assert_eq!(s(&buf[..n]), "foo=bar"); tcp.write_all(b"bar=foo").expect("write 2"); + }); let (upgrades_tx, upgrades_rx) = mpsc::channel();