diff --git a/actix-http/CHANGES.md b/actix-http/CHANGES.md index aaf84d765..abb044ca4 100644 --- a/actix-http/CHANGES.md +++ b/actix-http/CHANGES.md @@ -7,6 +7,10 @@ - Add `body::to_body_limit()` function. - Add `body::BodyLimitExceeded` error type. +### Fixed + +- Fix `MessageType::set_headers` not using the correct payload decoder when Transfer-Encoding and Content-Length are absent. + ## 3.3.1 - 2023-03-02 ### Fixed diff --git a/actix-http/src/h1/decoder.rs b/actix-http/src/h1/decoder.rs index 0b06bfe24..0c862c34f 100644 --- a/actix-http/src/h1/decoder.rs +++ b/actix-http/src/h1/decoder.rs @@ -395,8 +395,20 @@ impl MessageType for ResponseHead { // switching protocol or connect PayloadType::Stream(PayloadDecoder::eof()) } else { - // for HTTP/1.0 read to eof and close connection - if msg.version == Version::HTTP_10 { + let body_allowed = match msg.status.as_u16() { + 100..=199 => false, + 204 => false, + 304 => false, + _ => true, + }; + // for HTTP/1.0 and HTTP/1.1 read to eof and close connection + if msg.version == Version::HTTP_11 && body_allowed { + if let Some(ConnectionType::Close) = msg.conn_type() { + PayloadType::Payload(PayloadDecoder::eof()) + } else { + PayloadType::None + } + } else if msg.version == Version::HTTP_10 { msg.set_connection_type(ConnectionType::Close); PayloadType::Payload(PayloadDecoder::eof()) } else { diff --git a/awc/tests/test_client.rs b/awc/tests/test_client.rs index 9c3543ff0..87d905df2 100644 --- a/awc/tests/test_client.rs +++ b/awc/tests/test_client.rs @@ -769,7 +769,7 @@ async fn client_unread_response() { // awc does not read all bytes unless content-length is specified let bytes = res.body().await.unwrap(); - assert_eq!(bytes, Bytes::from_static(b"")); + assert_eq!(bytes, Bytes::from_static(b"welcome!")); } #[actix_rt::test]