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:
parent
6dddc87c02
commit
8d5c431453
2 changed files with 13 additions and 3 deletions
|
@ -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 httpRequest’s 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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue