diff --git a/src/proto/h1/role.rs b/src/proto/h1/role.rs index 46b8b2646e..2e91d9ec75 100644 --- a/src/proto/h1/role.rs +++ b/src/proto/h1/role.rs @@ -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 { @@ -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: "); @@ -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, 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, } } diff --git a/tests/server.rs b/tests/server.rs index 19b4cac25b..d9c5008442 100644 --- a/tests/server.rs +++ b/tests/server.rs @@ -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");