diff options
Diffstat (limited to 'components')
-rw-r--r-- | components/net/fetch/methods.rs | 38 | ||||
-rw-r--r-- | components/net/http_loader.rs | 62 |
2 files changed, 57 insertions, 43 deletions
diff --git a/components/net/fetch/methods.rs b/components/net/fetch/methods.rs index 1f003b539cc..41aadda700c 100644 --- a/components/net/fetch/methods.rs +++ b/components/net/fetch/methods.rs @@ -8,12 +8,12 @@ use data_loader::decode; use devtools_traits::DevtoolsControlMsg; use fetch::cors_cache::CorsCache; use filemanager_thread::FileManager; -use http_loader::{HttpState, determine_request_referrer, http_fetch, set_default_accept_language}; +use http_loader::{HttpState, determine_request_referrer, http_fetch}; +use http_loader::{set_default_accept, set_default_accept_language}; use hyper::{Error, Result as HyperResult}; use hyper::client::Pool; use hyper::header::{Accept, AcceptLanguage, ContentLanguage, ContentType}; -use hyper::header::{Header, HeaderFormat, HeaderView, Headers, QualityItem}; -use hyper::header::{Referer as RefererHeader, q, qitem}; +use hyper::header::{Header, HeaderFormat, HeaderView, Headers, Referer as RefererHeader}; use hyper::method::Method; use hyper::mime::{Mime, SubLevel, TopLevel}; use hyper::status::StatusCode; @@ -75,37 +75,7 @@ pub fn fetch_with_cors_cache(request: &mut Request, } // Step 3. - if !request.headers.has::<Accept>() { - let value = match request.type_ { - // Step 3.2. - _ if request.is_navigation_request() => - vec![qitem(mime!(Text / Html)), - // FIXME: This should properly generate a MimeType that has a - // SubLevel of xhtml+xml (https://github.com/hyperium/mime.rs/issues/22) - qitem(mime!(Application / ("xhtml+xml") )), - QualityItem::new(mime!(Application / Xml), q(0.9)), - QualityItem::new(mime!(_ / _), q(0.8))], - - // Step 3.3. - Type::Image => - vec![qitem(mime!(Image / Png)), - // FIXME: This should properly generate a MimeType that has a - // SubLevel of svg+xml (https://github.com/hyperium/mime.rs/issues/22) - qitem(mime!(Image / ("svg+xml") )), - QualityItem::new(mime!(Image / _), q(0.8)), - QualityItem::new(mime!(_ / _), q(0.5))], - - // Step 3.3. - Type::Style => - vec![qitem(mime!(Text / Css)), - QualityItem::new(mime!(_ / _), q(0.1))], - // Step 3.1. - _ => vec![qitem(mime!(_ / _))] - }; - - // Step 3.4. - request.headers.set(Accept(value)); - } + set_default_accept(request.type_, request.destination, &mut request.headers); // Step 4. set_default_accept_language(&mut request.headers); diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs index f55b94b533c..d4ed98d54ce 100644 --- a/components/net/http_loader.rs +++ b/components/net/http_loader.rs @@ -16,14 +16,16 @@ use hyper::Error as HttpError; use hyper::LanguageTag; use hyper::client::{Pool, Request as HyperRequest, Response as HyperResponse}; use hyper::client::pool::PooledStream; -use hyper::header::{AcceptEncoding, AcceptLanguage, AccessControlAllowCredentials}; -use hyper::header::{AccessControlAllowOrigin, AccessControlAllowHeaders, AccessControlAllowMethods}; -use hyper::header::{AccessControlRequestHeaders, AccessControlMaxAge, AccessControlRequestMethod}; -use hyper::header::{Authorization, Basic, CacheControl, CacheDirective, ContentEncoding}; -use hyper::header::{ContentLength, Encoding, Header, Headers, Host, IfMatch, IfRange}; -use hyper::header::{IfUnmodifiedSince, IfModifiedSince, IfNoneMatch, Location, Pragma, Quality}; -use hyper::header::{QualityItem, Referer, SetCookie, UserAgent, qitem}; -use hyper::header::Origin as HyperOrigin; +use hyper::header::{Accept, AccessControlAllowCredentials, AccessControlAllowHeaders}; +use hyper::header::{AccessControlAllowMethods, AccessControlAllowOrigin}; +use hyper::header::{AccessControlMaxAge, AccessControlRequestHeaders}; +use hyper::header::{AccessControlRequestMethod, AcceptEncoding, AcceptLanguage}; +use hyper::header::{Authorization, Basic, CacheControl, CacheDirective}; +use hyper::header::{ContentEncoding, ContentLength, Encoding, Header, Headers}; +use hyper::header::{Host, Origin as HyperOrigin, IfMatch, IfRange}; +use hyper::header::{IfUnmodifiedSince, IfModifiedSince, IfNoneMatch, Location}; +use hyper::header::{Pragma, Quality, QualityItem, Referer, SetCookie}; +use hyper::header::{UserAgent, q, qitem}; use hyper::method::Method; use hyper::net::{Fresh, HttpStream, HttpsStream, NetworkConnector}; use hyper::status::StatusCode; @@ -34,7 +36,8 @@ use msg::constellation_msg::PipelineId; use net_traits::{CookieSource, FetchMetadata, NetworkError, ReferrerPolicy}; use net_traits::hosts::replace_host; use net_traits::request::{CacheMode, CredentialsMode, Destination, Origin}; -use net_traits::request::{RedirectMode, Referrer, Request, RequestMode, ResponseTainting}; +use net_traits::request::{RedirectMode, Referrer, Request, RequestMode}; +use net_traits::request::{ResponseTainting, Type}; use net_traits::response::{HttpsState, Response, ResponseBody, ResponseType}; use resource_thread::AuthCache; use servo_url::{ImmutableOrigin, ServoUrl}; @@ -141,6 +144,47 @@ impl NetworkHttpRequestFactory { } } +// Step 3 of https://fetch.spec.whatwg.org/#concept-fetch. +pub fn set_default_accept(type_: Type, destination: Destination, headers: &mut Headers) { + if headers.has::<Accept>() { + return; + } + let value = match (type_, destination) { + // Step 3.2. + (_, Destination::Document) => { + vec![ + qitem(mime!(Text / Html)), + qitem(mime!(Application / ("xhtml+xml"))), + QualityItem::new(mime!(Application / Xml), q(0.9)), + QualityItem::new(mime!(_ / _), q(0.8)), + ] + }, + // Step 3.3. + (Type::Image, _) => { + vec![ + qitem(mime!(Image / Png)), + qitem(mime!(Image / ("svg+xml") )), + QualityItem::new(mime!(Image / _), q(0.8)), + QualityItem::new(mime!(_ / _), q(0.5)), + ] + }, + // Step 3.3. + (Type::Style, _) => { + vec![ + qitem(mime!(Text / Css)), + QualityItem::new(mime!(_ / _), q(0.1)) + ] + }, + // Step 3.1. + _ => { + vec![qitem(mime!(_ / _))] + }, + }; + + // Step 3.4. + headers.set(Accept(value)); +} + fn set_default_accept_encoding(headers: &mut Headers) { if headers.has::<AcceptEncoding>() { return |