mirror of
https://github.com/servo/servo.git
synced 2025-07-23 07:13:52 +01:00
Auto merge of #25294 - Darkspirit:h2, r=jdm
Let hyper automatically set the host header if needed Google's gws web server did not expect to receive an unneeded Host header via HTTP/2, therefore it responded with 400 Bad Request over a working HTTP/2 connection. https://tools.ietf.org/html/rfc7540#page-55 > Clients that generate HTTP/2 requests directly SHOULD use the ":authority" pseudo-header field instead of the Host header field. It's hyper's job to take care of this for the HTTP/1 case, therefore we can remove old code. When calling [Client::builder()](1974c875a1/components/net/connector.rs (L116-L119)
) we do not disable hyper's default [set_host](4b6099c7aa/src/client/mod.rs (L1019-L1024)
) config option, therefore hyper [automatically adds a Host header for non-HTTP/2 connections](4b6099c7aa/src/client/mod.rs (L289-L292)
) based on the [URI](3f663d7ab2/components/net/http_loader.rs (L418-L421)
). r? @jdm --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #25286.
This commit is contained in:
commit
79408fa36b
4 changed files with 7 additions and 40 deletions
|
@ -24,11 +24,8 @@ use headers::{
|
||||||
};
|
};
|
||||||
use headers::{AccessControlAllowOrigin, AccessControlMaxAge};
|
use headers::{AccessControlAllowOrigin, AccessControlMaxAge};
|
||||||
use headers::{CacheControl, ContentEncoding, ContentLength};
|
use headers::{CacheControl, ContentEncoding, ContentLength};
|
||||||
use headers::{
|
use headers::{IfModifiedSince, LastModified, Origin as HyperOrigin, Pragma, Referer, UserAgent};
|
||||||
Host, IfModifiedSince, LastModified, Origin as HyperOrigin, Pragma, Referer, UserAgent,
|
|
||||||
};
|
|
||||||
use http::header::{self, HeaderName, HeaderValue};
|
use http::header::{self, HeaderName, HeaderValue};
|
||||||
use http::uri::Authority;
|
|
||||||
use http::{HeaderMap, Request as HyperRequest};
|
use http::{HeaderMap, Request as HyperRequest};
|
||||||
use hyper::{Body, Client, Method, Response as HyperResponse, StatusCode};
|
use hyper::{Body, Client, Method, Response as HyperResponse, StatusCode};
|
||||||
use hyper_serde::Serde;
|
use hyper_serde::Serde;
|
||||||
|
@ -995,24 +992,7 @@ fn http_network_or_cache_fetch(
|
||||||
|
|
||||||
// Step 5.16
|
// Step 5.16
|
||||||
let current_url = http_request.current_url();
|
let current_url = http_request.current_url();
|
||||||
if let Ok(host) = format!(
|
http_request.headers.remove(header::HOST);
|
||||||
"{}{}",
|
|
||||||
current_url.host_str().unwrap(),
|
|
||||||
current_url
|
|
||||||
.port()
|
|
||||||
.map(|v| format!(":{}", v))
|
|
||||||
.unwrap_or("".into())
|
|
||||||
)
|
|
||||||
.parse::<Authority>()
|
|
||||||
.map(Host::from)
|
|
||||||
{
|
|
||||||
http_request.headers.typed_insert(host);
|
|
||||||
} else {
|
|
||||||
// This error should only happen in cases where hyper and rust-url disagree
|
|
||||||
// about how to parse an authority.
|
|
||||||
// https://github.com/servo/servo/issues/24175
|
|
||||||
error!("Failed to parse {} as authority", current_url);
|
|
||||||
}
|
|
||||||
|
|
||||||
// unlike http_loader, we should not set the accept header
|
// unlike http_loader, we should not set the accept header
|
||||||
// here, according to the fetch spec
|
// here, according to the fetch spec
|
||||||
|
@ -1434,7 +1414,7 @@ fn http_network_fetch(
|
||||||
};
|
};
|
||||||
|
|
||||||
if log_enabled!(log::Level::Info) {
|
if log_enabled!(log::Level::Info) {
|
||||||
info!("response for {}", url);
|
info!("{:?} response for {}", res.version(), url);
|
||||||
for header in res.headers().iter() {
|
for header in res.headers().iter() {
|
||||||
info!(" - {:?}", header);
|
info!(" - {:?}", header);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
//! A thread that takes a URL and streams back the binary data.
|
//! A thread that takes a URL and streams back the binary data.
|
||||||
|
|
||||||
use crate::connector::{create_http_client, create_tls_config, ALPN_H1};
|
use crate::connector::{create_http_client, create_tls_config, ALPN_H2_H1};
|
||||||
use crate::cookie;
|
use crate::cookie;
|
||||||
use crate::cookie_storage::CookieStorage;
|
use crate::cookie_storage::CookieStorage;
|
||||||
use crate::fetch::cors_cache::CorsCache;
|
use crate::fetch::cors_cache::CorsCache;
|
||||||
|
@ -149,7 +149,7 @@ fn create_http_states(
|
||||||
http_cache: RwLock::new(http_cache),
|
http_cache: RwLock::new(http_cache),
|
||||||
http_cache_state: Mutex::new(HashMap::new()),
|
http_cache_state: Mutex::new(HashMap::new()),
|
||||||
client: create_http_client(
|
client: create_http_client(
|
||||||
create_tls_config(&certs, ALPN_H1),
|
create_tls_config(&certs, ALPN_H2_H1),
|
||||||
HANDLE.lock().unwrap().executor(),
|
HANDLE.lock().unwrap().executor(),
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
@ -162,7 +162,7 @@ fn create_http_states(
|
||||||
http_cache: RwLock::new(HttpCache::new()),
|
http_cache: RwLock::new(HttpCache::new()),
|
||||||
http_cache_state: Mutex::new(HashMap::new()),
|
http_cache_state: Mutex::new(HashMap::new()),
|
||||||
client: create_http_client(
|
client: create_http_client(
|
||||||
create_tls_config(&certs, ALPN_H1),
|
create_tls_config(&certs, ALPN_H2_H1),
|
||||||
HANDLE.lock().unwrap().executor(),
|
HANDLE.lock().unwrap().executor(),
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
|
@ -14,11 +14,8 @@ use devtools_traits::HttpRequest as DevtoolsHttpRequest;
|
||||||
use devtools_traits::HttpResponse as DevtoolsHttpResponse;
|
use devtools_traits::HttpResponse as DevtoolsHttpResponse;
|
||||||
use headers::{AccessControlAllowCredentials, AccessControlAllowHeaders, AccessControlAllowOrigin};
|
use headers::{AccessControlAllowCredentials, AccessControlAllowHeaders, AccessControlAllowOrigin};
|
||||||
use headers::{AccessControlAllowMethods, AccessControlMaxAge, HeaderMapExt};
|
use headers::{AccessControlAllowMethods, AccessControlMaxAge, HeaderMapExt};
|
||||||
use headers::{
|
use headers::{CacheControl, ContentLength, ContentType, Expires, LastModified, Pragma, UserAgent};
|
||||||
CacheControl, ContentLength, ContentType, Expires, Host, LastModified, Pragma, UserAgent,
|
|
||||||
};
|
|
||||||
use http::header::{self, HeaderMap, HeaderName, HeaderValue};
|
use http::header::{self, HeaderMap, HeaderName, HeaderValue};
|
||||||
use http::uri::Authority;
|
|
||||||
use http::{Method, StatusCode};
|
use http::{Method, StatusCode};
|
||||||
use hyper::body::Body;
|
use hyper::body::Body;
|
||||||
use hyper::{Request as HyperRequest, Response as HyperResponse};
|
use hyper::{Request as HyperRequest, Response as HyperResponse};
|
||||||
|
@ -1067,11 +1064,6 @@ fn test_fetch_with_devtools() {
|
||||||
header::ACCEPT_ENCODING,
|
header::ACCEPT_ENCODING,
|
||||||
HeaderValue::from_static("gzip, deflate, br"),
|
HeaderValue::from_static("gzip, deflate, br"),
|
||||||
);
|
);
|
||||||
headers.typed_insert(Host::from(
|
|
||||||
format!("{}:{}", url.host_str().unwrap(), url.port().unwrap())
|
|
||||||
.parse::<Authority>()
|
|
||||||
.unwrap(),
|
|
||||||
));
|
|
||||||
|
|
||||||
headers.insert(header::ACCEPT, HeaderValue::from_static("*/*"));
|
headers.insert(header::ACCEPT, HeaderValue::from_static("*/*"));
|
||||||
|
|
||||||
|
|
|
@ -257,11 +257,6 @@ fn test_request_and_response_data_with_network_messages() {
|
||||||
header::ACCEPT_ENCODING,
|
header::ACCEPT_ENCODING,
|
||||||
HeaderValue::from_static("gzip, deflate, br"),
|
HeaderValue::from_static("gzip, deflate, br"),
|
||||||
);
|
);
|
||||||
headers.typed_insert(Host::from(
|
|
||||||
format!("{}:{}", url.host_str().unwrap(), url.port().unwrap())
|
|
||||||
.parse::<Authority>()
|
|
||||||
.unwrap(),
|
|
||||||
));
|
|
||||||
|
|
||||||
headers.insert(
|
headers.insert(
|
||||||
header::ACCEPT,
|
header::ACCEPT,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue