0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-02-01 12:16:11 -05:00

fix(ext/fetch): set accept-encoding: identity if range header is present (#16197)

https://fetch.spec.whatwg.org/#http-network-or-cache-fetch

> If httpRequest’s header list contains `Range`, then append
(`Accept-Encoding`, `identity`)
> to httpRequest’s header list.
> 
> This avoids a failure when handling content codings with a part of an
encoded response.
> Additionally, many servers mistakenly ignore `Range` headers if a
non-identity encoding is accepted.
This commit is contained in:
Marcos Casagrande 2022-10-17 15:39:41 +02:00 committed by Bartek Iwańczuk
parent 6dddc87c02
commit 8d5c431453
No known key found for this signature in database
GPG key ID: 0C6BCDDC3B3AD750
2 changed files with 13 additions and 3 deletions

View file

@ -34,7 +34,9 @@ use http::header::CONTENT_LENGTH;
use reqwest::header::HeaderMap; use reqwest::header::HeaderMap;
use reqwest::header::HeaderName; use reqwest::header::HeaderName;
use reqwest::header::HeaderValue; use reqwest::header::HeaderValue;
use reqwest::header::ACCEPT_ENCODING;
use reqwest::header::HOST; use reqwest::header::HOST;
use reqwest::header::RANGE;
use reqwest::header::USER_AGENT; use reqwest::header::USER_AGENT;
use reqwest::redirect::Policy; use reqwest::redirect::Policy;
use reqwest::Body; use reqwest::Body;
@ -288,16 +290,26 @@ where
None None
}; };
let mut header_map = HeaderMap::new();
for (key, value) in headers { for (key, value) in headers {
let name = HeaderName::from_bytes(&key) let name = HeaderName::from_bytes(&key)
.map_err(|err| type_error(err.to_string()))?; .map_err(|err| type_error(err.to_string()))?;
let v = HeaderValue::from_bytes(&value) let v = HeaderValue::from_bytes(&value)
.map_err(|err| type_error(err.to_string()))?; .map_err(|err| type_error(err.to_string()))?;
if !matches!(name, HOST | CONTENT_LENGTH) { if !matches!(name, HOST | CONTENT_LENGTH) {
request = request.header(name, v); header_map.append(name, v);
} }
} }
if header_map.contains_key(RANGE) {
// https://fetch.spec.whatwg.org/#http-network-or-cache-fetch step 18
// If httpRequests header list contains `Range`, then append (`Accept-Encoding`, `identity`)
header_map
.insert(ACCEPT_ENCODING, HeaderValue::from_static("identity"));
}
request = request.headers(header_map);
let options = state.borrow::<Options>(); let options = state.borrow::<Options>();
if let Some(request_builder_hook) = options.request_builder_hook { if let Some(request_builder_hook) = options.request_builder_hook {
request = request_builder_hook(request); request = request_builder_hook(request);

View file

@ -3266,12 +3266,10 @@
"range": { "range": {
"general.any.html": [ "general.any.html": [
"Privileged header not allowed for guard type: request-no-cors", "Privileged header not allowed for guard type: request-no-cors",
"Fetch with range header will be sent with Accept-Encoding: identity",
"Cross Origin Fetch with non safe range header" "Cross Origin Fetch with non safe range header"
], ],
"general.any.worker.html": [ "general.any.worker.html": [
"Privileged header not allowed for guard type: request-no-cors", "Privileged header not allowed for guard type: request-no-cors",
"Fetch with range header will be sent with Accept-Encoding: identity",
"Cross Origin Fetch with non safe range header" "Cross Origin Fetch with non safe range header"
], ],
"general.window.html": false "general.window.html": false