From c8bf60de571fbed61f5297c47892de5f9e248ad0 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 9 Jun 2016 22:03:40 +0100 Subject: [PATCH] Add a default Accept-Language header to HTTP requests. --- components/net/http_loader.rs | 20 +++++++++++- tests/unit/net/http_loader.rs | 32 ++++++++++++++++++- .../send-accept-language.htm.ini | 5 --- 3 files changed, 50 insertions(+), 7 deletions(-) delete mode 100644 tests/wpt/metadata/XMLHttpRequest/send-accept-language.htm.ini diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs index a6b810cc18a..4a70669baba 100644 --- a/components/net/http_loader.rs +++ b/components/net/http_loader.rs @@ -13,9 +13,10 @@ use devtools_traits::{HttpResponse as DevtoolsHttpResponse, NetworkEvent}; use flate2::read::{DeflateDecoder, GzDecoder}; use hsts::{HstsEntry, HstsList, secure_url}; use hyper::Error as HttpError; +use hyper::LanguageTag; use hyper::client::{Pool, Request, Response}; use hyper::header::{Accept, AcceptEncoding, ContentLength, ContentEncoding, ContentType, Host, Referer}; -use hyper::header::{Authorization, Basic}; +use hyper::header::{Authorization, AcceptLanguage, Basic}; use hyper::header::{Encoding, Header, Headers, Quality, QualityItem}; use hyper::header::{Location, SetCookie, StrictTransportSecurity, UserAgent, qitem}; use hyper::http::RawStatus; @@ -389,6 +390,22 @@ fn set_default_accept(headers: &mut Headers) { } } +fn set_default_accept_language(headers: &mut Headers) { + if headers.has::() { + return; + } + + let mut en_us: LanguageTag = Default::default(); + en_us.language = Some("en".to_owned()); + en_us.region = Some("US".to_owned()); + let mut en: LanguageTag = Default::default(); + en.language = Some("en".to_owned()); + headers.set(AcceptLanguage(vec![ + qitem(en_us), + QualityItem::new(en, Quality(500)), + ])); +} + /// https://w3c.github.io/webappsec-referrer-policy/#referrer-policy-state-no-referrer-when-downgrade fn no_ref_when_downgrade_header(referrer_url: Url, url: Url) -> Option { if referrer_url.scheme() == "https" && url.scheme() != "https" { @@ -616,6 +633,7 @@ pub fn modify_request_headers(headers: &mut Headers, } set_default_accept(headers); + set_default_accept_language(headers); set_default_accept_encoding(headers); *referrer_url = determine_request_referrer(headers, diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index ba1a7d6f2b0..f472c2c5163 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -9,8 +9,9 @@ use devtools_traits::HttpResponse as DevtoolsHttpResponse; use devtools_traits::{ChromeToDevtoolsControlMsg, DevtoolsControlMsg, NetworkEvent}; use flate2::Compression; use flate2::write::{GzEncoder, DeflateEncoder}; +use hyper::LanguageTag; use hyper::header::{Accept, AcceptEncoding, ContentEncoding, ContentLength, Cookie as CookieHeader}; -use hyper::header::{Authorization, Basic}; +use hyper::header::{Authorization, AcceptLanguage, Basic}; use hyper::header::{Encoding, Headers, Host, Location, Quality, QualityItem, qitem, Referer, SetCookie}; use hyper::header::{StrictTransportSecurity, UserAgent}; use hyper::http::RawStatus; @@ -393,10 +394,13 @@ fn test_check_default_headers_loaded_in_every_request() { load_data.method = Method::Get; let mut headers = Headers::new(); + headers.set(AcceptEncoding(vec![qitem(Encoding::Gzip), qitem(Encoding::Deflate), qitem(Encoding::EncodingExt("br".to_owned()))])); + headers.set(Host { hostname: "mozilla.com".to_owned() , port: None }); + let accept = Accept(vec![ qitem(Mime(TopLevel::Text, SubLevel::Html, vec![])), qitem(Mime(TopLevel::Application, SubLevel::Ext("xhtml+xml".to_owned()), vec![])), @@ -404,6 +408,17 @@ fn test_check_default_headers_loaded_in_every_request() { QualityItem::new(Mime(TopLevel::Star, SubLevel::Star, vec![]), Quality(800u16)), ]); headers.set(accept); + + let mut en_us: LanguageTag = Default::default(); + en_us.language = Some("en".to_owned()); + en_us.region = Some("US".to_owned()); + let mut en: LanguageTag = Default::default(); + en.language = Some("en".to_owned()); + headers.set(AcceptLanguage(vec![ + qitem(en_us), + QualityItem::new(en, Quality(500)), + ])); + headers.set(UserAgent(DEFAULT_USER_AGENT.to_owned())); // Testing for method.GET @@ -483,12 +498,15 @@ fn test_request_and_response_data_with_network_messages() { //Creating default headers for request let mut headers = Headers::new(); + headers.set(AcceptEncoding(vec![ qitem(Encoding::Gzip), qitem(Encoding::Deflate), qitem(Encoding::EncodingExt("br".to_owned())) ])); + headers.set(Host { hostname: "mozilla.com".to_owned() , port: None }); + let accept = Accept(vec![ qitem(Mime(TopLevel::Text, SubLevel::Html, vec![])), qitem(Mime(TopLevel::Application, SubLevel::Ext("xhtml+xml".to_owned()), vec![])), @@ -496,7 +514,19 @@ fn test_request_and_response_data_with_network_messages() { QualityItem::new(Mime(TopLevel::Star, SubLevel::Star, vec![]), Quality(800u16)), ]); headers.set(accept); + + let mut en_us: LanguageTag = Default::default(); + en_us.language = Some("en".to_owned()); + en_us.region = Some("US".to_owned()); + let mut en: LanguageTag = Default::default(); + en.language = Some("en".to_owned()); + headers.set(AcceptLanguage(vec![ + qitem(en_us), + QualityItem::new(en, Quality(500)), + ])); + headers.set(UserAgent(DEFAULT_USER_AGENT.to_owned())); + let httprequest = DevtoolsHttpRequest { url: url, method: Method::Get, diff --git a/tests/wpt/metadata/XMLHttpRequest/send-accept-language.htm.ini b/tests/wpt/metadata/XMLHttpRequest/send-accept-language.htm.ini deleted file mode 100644 index ff883265c07..00000000000 --- a/tests/wpt/metadata/XMLHttpRequest/send-accept-language.htm.ini +++ /dev/null @@ -1,5 +0,0 @@ -[send-accept-language.htm] - type: testharness - [Send "sensible" default value, whatever that means] - expected: FAIL -