diff --git a/actix-files/src/named.rs b/actix-files/src/named.rs index 9e4a37737..52abb12f4 100644 --- a/actix-files/src/named.rs +++ b/actix-files/src/named.rs @@ -534,27 +534,6 @@ impl NamedFile { length = ranges[0].length; offset = ranges[0].start; - // When a Content-Encoding header is present in a 206 partial content response - // for video content, it prevents browser video players from starting playback - // before loading the whole video and also prevents seeking. - // - // See: https://github.com/actix/actix-web/issues/2815 - // - // The assumption of this fix is that the video player knows to not send an - // Accept-Encoding header for this request and that downstream middleware will - // not attempt compression for requests without it. - // - // TODO: Solve question around what to do if self.encoding is set and partial - // range is requested. Reject request? Ignoring self.encoding seems wrong, too. - // In practice, it should not come up. - if req.headers().contains_key(&header::ACCEPT_ENCODING) { - // don't allow compression middleware to modify partial content - res.insert_header(( - header::CONTENT_ENCODING, - HeaderValue::from_static("identity"), - )); - } - res.insert_header(( header::CONTENT_RANGE, format!("bytes {}-{}/{}", offset, offset + length - 1, self.md.len()), diff --git a/actix-files/tests/encoding.rs b/actix-files/tests/encoding.rs index 3c8bdb59b..aee409478 100644 --- a/actix-files/tests/encoding.rs +++ b/actix-files/tests/encoding.rs @@ -35,31 +35,3 @@ async fn test_utf8_file_contents() { Some(&HeaderValue::from_static("text/plain")), ); } - -#[actix_web::test] -async fn partial_range_response_encoding() { - let srv = test::init_service(App::new().default_service(web::to(|| async { - NamedFile::open_async("./tests/test.binary").await.unwrap() - }))) - .await; - - // range request without accept-encoding returns no content-encoding header - let req = TestRequest::with_uri("/") - .append_header((header::RANGE, "bytes=10-20")) - .to_request(); - let res = test::call_service(&srv, req).await; - assert_eq!(res.status(), StatusCode::PARTIAL_CONTENT); - assert!(!res.headers().contains_key(header::CONTENT_ENCODING)); - - // range request with accept-encoding returns a content-encoding header - let req = TestRequest::with_uri("/") - .append_header((header::RANGE, "bytes=10-20")) - .append_header((header::ACCEPT_ENCODING, "identity")) - .to_request(); - let res = test::call_service(&srv, req).await; - assert_eq!(res.status(), StatusCode::PARTIAL_CONTENT); - assert_eq!( - res.headers().get(header::CONTENT_ENCODING).unwrap(), - "identity" - ); -} diff --git a/actix-http/src/encoding/encoder.rs b/actix-http/src/encoding/encoder.rs index 180927ac6..5177cfe40 100644 --- a/actix-http/src/encoding/encoder.rs +++ b/actix-http/src/encoding/encoder.rs @@ -70,6 +70,7 @@ impl Encoder { let should_encode = !(head.headers().contains_key(&CONTENT_ENCODING) || head.status == StatusCode::SWITCHING_PROTOCOLS || head.status == StatusCode::NO_CONTENT + || head.status == StatusCode::PARTIAL_CONTENT || encoding == ContentEncoding::Identity); let body = match body.try_into_bytes() {