mirror of
https://github.com/fafhrd91/actix-web
synced 2025-03-16 05:02:43 +01:00
Remove the usage of content-encoding identity header, disallow compression for partial content in general
This commit is contained in:
parent
b6bee346f7
commit
cd2f082e77
@ -534,27 +534,6 @@ impl NamedFile {
|
|||||||
length = ranges[0].length;
|
length = ranges[0].length;
|
||||||
offset = ranges[0].start;
|
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((
|
res.insert_header((
|
||||||
header::CONTENT_RANGE,
|
header::CONTENT_RANGE,
|
||||||
format!("bytes {}-{}/{}", offset, offset + length - 1, self.md.len()),
|
format!("bytes {}-{}/{}", offset, offset + length - 1, self.md.len()),
|
||||||
|
@ -35,31 +35,3 @@ async fn test_utf8_file_contents() {
|
|||||||
Some(&HeaderValue::from_static("text/plain")),
|
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"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
@ -70,6 +70,7 @@ impl<B: MessageBody> Encoder<B> {
|
|||||||
let should_encode = !(head.headers().contains_key(&CONTENT_ENCODING)
|
let should_encode = !(head.headers().contains_key(&CONTENT_ENCODING)
|
||||||
|| head.status == StatusCode::SWITCHING_PROTOCOLS
|
|| head.status == StatusCode::SWITCHING_PROTOCOLS
|
||||||
|| head.status == StatusCode::NO_CONTENT
|
|| head.status == StatusCode::NO_CONTENT
|
||||||
|
|| head.status == StatusCode::PARTIAL_CONTENT
|
||||||
|| encoding == ContentEncoding::Identity);
|
|| encoding == ContentEncoding::Identity);
|
||||||
|
|
||||||
let body = match body.try_into_bytes() {
|
let body = match body.try_into_bytes() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user