diff options
-rw-r--r-- | components/net/lib.rs | 3 | ||||
-rw-r--r-- | tests/unit/net/fetch.rs | 20 | ||||
-rw-r--r-- | tests/unit/net/http_loader.rs | 1274 | ||||
-rw-r--r-- | tests/unit/net/resource_thread.rs | 20 |
4 files changed, 182 insertions, 1135 deletions
diff --git a/components/net/lib.rs b/components/net/lib.rs index 97c8f4f962a..f6c85a4949c 100644 --- a/components/net/lib.rs +++ b/components/net/lib.rs @@ -76,6 +76,5 @@ pub mod fetch { /// A module for re-exports of items used in unit tests. pub mod test { pub use chrome_loader::resolve_chrome_url; - pub use http_loader::{HttpRequest, HttpRequestFactory, HttpResponse, HttpState}; - pub use http_loader::{LoadError, LoadErrorType, UIProvider, load}; + pub use http_loader::HttpState; } diff --git a/tests/unit/net/fetch.rs b/tests/unit/net/fetch.rs index be1878667a4..bc8ab6439d0 100644 --- a/tests/unit/net/fetch.rs +++ b/tests/unit/net/fetch.rs @@ -163,6 +163,26 @@ fn test_fetch_file() { } #[test] +fn test_fetch_ftp() { + let url = ServoUrl::parse("ftp://not-supported").unwrap(); + let origin = Origin::Origin(url.origin()); + let request = Request::new(url, Some(origin), false, None); + *request.referrer.borrow_mut() = Referrer::NoReferrer; + let fetch_response = fetch_sync(request, None); + assert!(fetch_response.is_network_error()); +} + +#[test] +fn test_fetch_bogus_scheme() { + let url = ServoUrl::parse("bogus://whatever").unwrap(); + let origin = Origin::Origin(url.origin()); + let request = Request::new(url, Some(origin), false, None); + *request.referrer.borrow_mut() = Referrer::NoReferrer; + let fetch_response = fetch_sync(request, None); + assert!(fetch_response.is_network_error()); +} + +#[test] fn test_cors_preflight_fetch() { static ACK: &'static [u8] = b"ACK"; let state = Arc::new(AtomicUsize::new(0)); diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index e7b2055fa3c..c2af331b348 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -13,87 +13,31 @@ use flate2::write::{DeflateEncoder, GzEncoder}; use hyper::LanguageTag; use hyper::header::{Accept, AcceptEncoding, ContentEncoding, ContentLength, Cookie as CookieHeader}; use hyper::header::{AcceptLanguage, Authorization, Basic, Date}; -use hyper::header::{Encoding, Headers, Host, Location, Quality, QualityItem, Referer, SetCookie, qitem}; +use hyper::header::{Encoding, Headers, Host, Location, Quality, QualityItem, SetCookie, qitem}; use hyper::header::{StrictTransportSecurity, UserAgent}; -use hyper::http::RawStatus; use hyper::method::Method; use hyper::mime::{Mime, SubLevel, TopLevel}; use hyper::server::{Request as HyperRequest, Response as HyperResponse}; use hyper::status::StatusCode; use hyper::uri::RequestUri; use make_server; -use msg::constellation_msg::{PipelineId, TEST_PIPELINE_ID}; +use msg::constellation_msg::TEST_PIPELINE_ID; use net::cookie::Cookie; use net::cookie_storage::CookieStorage; use net::fetch::methods::fetch; -use net::hsts::HstsEntry; -use net::resource_thread::{AuthCacheEntry, CancellationListener}; -use net::test::{HttpRequest, HttpRequestFactory, HttpState, LoadError, UIProvider, load}; -use net::test::{HttpResponse, LoadErrorType}; -use net_traits::{CookieSource, IncludeSubdomains, LoadContext, LoadData}; -use net_traits::{CustomResponse, LoadOrigin, Metadata, NetworkError, ReferrerPolicy}; +use net::resource_thread::AuthCacheEntry; +use net_traits::{CookieSource, NetworkError}; use net_traits::hosts::replace_host_table; use net_traits::request::{Request, RequestInit, CredentialsMode, Destination}; use net_traits::response::ResponseBody; use new_fetch_context; use servo_url::ServoUrl; -use std::borrow::Cow; use std::collections::HashMap; -use std::io::{self, Cursor, Read, Write}; +use std::io::{Read, Write}; use std::rc::Rc; use std::sync::{Arc, Mutex, RwLock, mpsc}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::mpsc::Receiver; -use std::thread; - -const DEFAULT_USER_AGENT: &'static str = "Test-agent"; - -struct HttpTest; - -impl LoadOrigin for HttpTest { - fn referrer_url(&self) -> Option<ServoUrl> { - None - } - fn referrer_policy(&self) -> Option<ReferrerPolicy> { - None - } - fn pipeline_id(&self) -> Option<PipelineId> { - Some(TEST_PIPELINE_ID) - } -} - -struct LoadOriginInfo<'a> { - referrer_url: &'a str, - referrer_policy: Option<ReferrerPolicy>, -} - -impl<'a> LoadOrigin for LoadOriginInfo<'a> { - fn referrer_url(&self) -> Option<ServoUrl> { - Some(ServoUrl::parse(self.referrer_url).unwrap()) - } - fn referrer_policy(&self) -> Option<ReferrerPolicy> { - self.referrer_policy.clone() - } - fn pipeline_id(&self) -> Option<PipelineId> { - None - } -} - -fn respond_with(body: Vec<u8>) -> MockResponse { - let headers = Headers::new(); - respond_with_headers(body, headers) -} - -fn respond_with_headers(body: Vec<u8>, mut headers: Headers) -> MockResponse { - headers.set(ContentLength(body.len() as u64)); - - MockResponse::new( - headers, - StatusCode::Ok, - RawStatus(200, Cow::Borrowed("OK")), - body - ) -} fn read_response(reader: &mut Read) -> String { let mut buf = vec![0; 1024]; @@ -107,184 +51,6 @@ fn read_response(reader: &mut Read) -> String { } } -struct MockResponse { - h: Headers, - sc: StatusCode, - sr: RawStatus, - msg: Cursor<Vec<u8>> -} - -impl MockResponse { - fn new(h: Headers, sc: StatusCode, sr: RawStatus, msg: Vec<u8>) -> MockResponse { - MockResponse { h: h, sc: sc, sr: sr, msg: Cursor::new(msg) } - } -} - -impl Read for MockResponse { - fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { - self.msg.read(buf) - } -} - -impl HttpResponse for MockResponse { - fn headers(&self) -> &Headers { &self.h } - fn status(&self) -> StatusCode { self.sc } - fn status_raw(&self) -> &RawStatus { &self.sr } -} - -fn redirect_to(host: String) -> MockResponse { - let mut headers = Headers::new(); - headers.set(Location(host.to_owned())); - - MockResponse::new( - headers, - StatusCode::MovedPermanently, - RawStatus(301, Cow::Borrowed("Moved Permanently")), - b"".to_vec() - ) -} - -struct TestProvider { - username: String, - password: String, -} - -impl TestProvider { - fn new() -> TestProvider { - TestProvider { username: "default".to_owned(), password: "default".to_owned() } - } -} -impl UIProvider for TestProvider { - fn input_username_and_password(&self, _prompt: &str) -> (Option<String>, Option<String>) { - (Some(self.username.to_owned()), - Some(self.password.to_owned())) - } -} - -fn basic_auth(headers: Headers) -> MockResponse { - MockResponse::new( - headers, - StatusCode::Unauthorized, - RawStatus(401, Cow::Borrowed("Unauthorized")), - b"".to_vec() - ) -} - -fn redirect_with_headers(host: String, mut headers: Headers) -> MockResponse { - headers.set(Location(host.to_string())); - - MockResponse::new( - headers, - StatusCode::MovedPermanently, - RawStatus(301, Cow::Borrowed("Moved Permanently")), - b"".to_vec() - ) -} - -fn respond_404() -> MockResponse { - MockResponse::new( - Headers::new(), - StatusCode::NotFound, - RawStatus(404, Cow::Borrowed("Not Found")), - b"".to_vec() - ) -} - -enum ResponseType { - Redirect(String), - RedirectWithHeaders(String, Headers), - Text(Vec<u8>), - WithHeaders(Vec<u8>, Headers), - NeedsAuth(Headers), - Dummy404 -} - -struct MockRequest { - t: ResponseType -} - -impl MockRequest { - fn new(t: ResponseType) -> MockRequest { - MockRequest { t: t } - } -} - -fn response_for_request_type(t: ResponseType) -> Result<MockResponse, LoadError> { - match t { - ResponseType::Redirect(location) => { - Ok(redirect_to(location)) - }, - ResponseType::RedirectWithHeaders(location, headers) => { - Ok(redirect_with_headers(location, headers)) - }, - ResponseType::Text(b) => { - Ok(respond_with(b)) - }, - ResponseType::WithHeaders(b, h) => { - Ok(respond_with_headers(b, h)) - }, - ResponseType::NeedsAuth(h) => { - Ok(basic_auth(h)) - }, - ResponseType::Dummy404 => { - Ok(respond_404()) - } - } -} - -impl HttpRequest for MockRequest { - type R = MockResponse; - - fn send(self, _: &Option<Vec<u8>>) -> Result<MockResponse, LoadError> { - response_for_request_type(self.t) - } -} - -struct AssertAuthHeaderRequestFactory { - expected_headers: Headers, - body: Vec<u8> -} - -impl HttpRequestFactory for AssertAuthHeaderRequestFactory { - type R = MockRequest; - - fn create(&self, _: ServoUrl, _: Method, headers: Headers) -> Result<MockRequest, LoadError> { - let request = if headers.has::<Authorization<Basic>>() { - assert_headers_included(&self.expected_headers, &headers); - MockRequest::new(ResponseType::Text(self.body.clone())) - } else { - let mut headers = Headers::new(); - headers.set_raw("WWW-Authenticate", vec![b"Basic realm=\"Test realm\"".to_vec()]); - MockRequest::new(ResponseType::NeedsAuth(headers)) - }; - - Ok(request) - } -} - -fn assert_headers_included(expected: &Headers, request: &Headers) { - assert!(expected.len() != 0); - for header in expected.iter() { - assert!(request.get_raw(header.name()).is_some()); - assert_eq!(request.get_raw(header.name()).unwrap(), - expected.get_raw(header.name()).unwrap()) - } -} - -struct AssertMustIncludeHeadersRequestFactory { - expected_headers: Headers, - body: Vec<u8> -} - -impl HttpRequestFactory for AssertMustIncludeHeadersRequestFactory { - type R = MockRequest; - - fn create(&self, _: ServoUrl, _: Method, headers: Headers) -> Result<MockRequest, LoadError> { - assert_headers_included(&self.expected_headers, &headers); - Ok(MockRequest::new(ResponseType::Text(self.body.clone()))) - } -} - fn assert_cookie_for_domain(cookie_jar: Arc<RwLock<CookieStorage>>, domain: &str, cookie: Option<&str>) { let mut cookie_jar = cookie_jar.write().unwrap(); let url = ServoUrl::parse(&*domain).unwrap(); @@ -292,24 +58,6 @@ fn assert_cookie_for_domain(cookie_jar: Arc<RwLock<CookieStorage>>, domain: &str assert_eq!(cookies.as_ref().map(|c| &**c), cookie); } -struct AssertMustNotIncludeHeadersRequestFactory { - headers_not_expected: Vec<String>, - body: Vec<u8> -} - -impl HttpRequestFactory for AssertMustNotIncludeHeadersRequestFactory { - type R = MockRequest; - - fn create(&self, _: ServoUrl, _: Method, headers: Headers) -> Result<MockRequest, LoadError> { - assert!(self.headers_not_expected.len() != 0); - for header in &self.headers_not_expected { - assert!(headers.get_raw(header).is_none()); - } - - Ok(MockRequest::new(ResponseType::Text(self.body.clone()))) - } -} - pub fn expect_devtools_http_request(devtools_port: &Receiver<DevtoolsControlMsg>) -> DevtoolsHttpRequest { match devtools_port.recv().unwrap() { DevtoolsControlMsg::FromChrome( @@ -757,39 +505,6 @@ fn test_load_doesnt_add_host_to_sts_list_when_url_is_http_even_if_sts_headers_ar } #[test] -fn test_load_adds_host_to_sts_list_when_url_is_https_and_sts_headers_are_present() { - struct Factory; - - impl HttpRequestFactory for Factory { - type R = MockRequest; - - fn create(&self, _: ServoUrl, _: Method, _: Headers) -> Result<MockRequest, LoadError> { - let content = <[_]>::to_vec("Yay!".as_bytes()); - let mut headers = Headers::new(); - headers.set(StrictTransportSecurity::excluding_subdomains(31536000)); - Ok(MockRequest::new(ResponseType::WithHeaders(content, headers))) - } - } - - let url = ServoUrl::parse("https://mozilla.com").unwrap(); - - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); - - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - - let _ = load(&load_data, - &ui_provider, &http_state, - None, - &Factory, - DEFAULT_USER_AGENT.into(), - &CancellationListener::new(None), - None); - - assert!(http_state.hsts_list.read().unwrap().is_host_secure("mozilla.com")); -} - -#[test] fn test_load_sets_cookies_in_the_resource_manager_when_it_get_set_cookie_header_in_response() { let handler = move |_: HyperRequest, mut response: HyperResponse| { response.headers_mut().set(SetCookie(vec![CookiePair::new("mozillaIs".to_owned(), "theBest".to_owned())])); @@ -859,48 +574,6 @@ fn test_load_sets_requests_cookies_header_for_url_by_getting_cookies_from_the_re } #[test] -fn test_load_sends_secure_cookie_if_http_changed_to_https_due_to_entry_in_hsts_store() { - let url = ServoUrl::parse("http://mozilla.com").unwrap(); - let secured_url = ServoUrl::parse("https://mozilla.com").unwrap(); - let ui_provider = TestProvider::new(); - let http_state = HttpState::new(); - { - let mut hsts_list = http_state.hsts_list.write().unwrap(); - let entry = HstsEntry::new( - "mozilla.com".to_owned(), IncludeSubdomains::Included, Some(1000000) - ).unwrap(); - hsts_list.push(entry); - } - - { - let mut cookie_jar = http_state.cookie_jar.write().unwrap(); - let cookie_url = secured_url.clone(); - let mut cookie_pair = CookiePair::new("mozillaIs".to_owned(), "theBest".to_owned()); - cookie_pair.secure = true; - - let cookie = Cookie::new_wrapped( - cookie_pair, - &cookie_url, - CookieSource::HTTP - ).unwrap(); - cookie_jar.push(cookie, CookieSource::HTTP); - } - - let mut load_data = LoadData::new(LoadContext::Browsing, url, &HttpTest); - load_data.data = Some(<[_]>::to_vec("Yay!".as_bytes())); - - let mut headers = Headers::new(); - headers.set_raw("Cookie".to_owned(), vec![<[_]>::to_vec("mozillaIs=theBest".as_bytes())]); - - let _ = load( - &load_data.clone(), &ui_provider, &http_state, None, - &AssertMustIncludeHeadersRequestFactory { - expected_headers: headers, - body: <[_]>::to_vec(&*load_data.data.unwrap()) - }, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); -} - -#[test] fn test_load_sends_cookie_if_nonhttp() { let handler = move |request: HyperRequest, response: HyperResponse| { assert_eq!(request.headers.get::<CookieHeader>(), @@ -1007,38 +680,6 @@ fn test_when_cookie_received_marked_secure_is_ignored_for_http() { } #[test] -fn test_when_cookie_set_marked_httpsonly_secure_isnt_sent_on_http_request() { - let sec_url = ServoUrl::parse("https://mozilla.com").unwrap(); - let url = ServoUrl::parse("http://mozilla.com").unwrap(); - - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - - { - let mut cookie_jar = http_state.cookie_jar.write().unwrap(); - let cookie_url = sec_url.clone(); - let cookie = Cookie::new_wrapped( - CookiePair::parse("mozillaIs=theBest; Secure;").unwrap(), - &cookie_url, - CookieSource::HTTP - ).unwrap(); - cookie_jar.push(cookie, CookieSource::HTTP); - } - - let mut load_data = LoadData::new(LoadContext::Browsing, url, &HttpTest); - load_data.data = Some(<[_]>::to_vec("Yay!".as_bytes())); - - assert_cookie_for_domain(http_state.cookie_jar.clone(), "https://mozilla.com", Some("mozillaIs=theBest")); - - let _ = load( - &load_data.clone(), &ui_provider, &http_state, None, - &AssertMustNotIncludeHeadersRequestFactory { - headers_not_expected: vec!["Cookie".to_owned()], - body: <[_]>::to_vec(&*load_data.data.unwrap()) - }, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); -} - -#[test] fn test_load_sets_content_length_to_length_of_request_body() { let content = b"This is a request body"; let content_length = ContentLength(content.len() as u64); @@ -1260,131 +901,38 @@ fn test_load_succeeds_with_a_redirect_loop() { #[test] fn test_load_follows_a_redirect() { - struct Factory; - - impl HttpRequestFactory for Factory { - type R = MockRequest; - - fn create(&self, url: ServoUrl, _: Method, _: Headers) -> Result<MockRequest, LoadError> { - if url.domain().unwrap() == "mozilla.com" { - Ok(MockRequest::new(ResponseType::Redirect("http://mozilla.org".to_owned()))) - } else if url.domain().unwrap() == "mozilla.org" { - Ok( - MockRequest::new( - ResponseType::Text( - <[_]>::to_vec("Yay!".as_bytes()) - ) - ) - ) - } else { - panic!("unexpected host {:?}", url) - } - } - } - - let url = ServoUrl::parse("http://mozilla.com").unwrap(); - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - - match load(&load_data, &ui_provider, &http_state, None, &Factory, - DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None) { - Err(e) => panic!("expected to follow a redirect {:?}", e), - Ok(mut lr) => { - let response = read_response(&mut lr); - assert_eq!(response, "Yay!".to_owned()); - } - } -} - -struct DontConnectFactory; - -impl HttpRequestFactory for DontConnectFactory { - type R = MockRequest; - - fn create(&self, url: ServoUrl, _: Method, _: Headers) -> Result<MockRequest, LoadError> { - Err(LoadError::new(url, LoadErrorType::Connection { reason: "should not have connected".into() })) - } -} + let post_handler = move |request: HyperRequest, response: HyperResponse| { + assert_eq!(request.method, Method::Get); + response.send(b"Yay!").unwrap(); + }; + let (mut post_server, post_url) = make_server(post_handler); -#[test] -fn test_load_errors_when_scheme_is_not_http_or_https() { - let url = ServoUrl::parse("ftp://not-supported").unwrap(); - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); - - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - - match load(&load_data, - &ui_provider, &http_state, - None, - &DontConnectFactory, - DEFAULT_USER_AGENT.into(), - &CancellationListener::new(None), None) { - Err(ref load_err) if load_err.error == LoadErrorType::UnsupportedScheme { scheme: "ftp".into() } => (), - _ => panic!("expected ftp scheme to be unsupported") - } -} + let post_redirect_url = post_url.clone(); + let pre_handler = move |request: HyperRequest, mut response: HyperResponse| { + assert_eq!(request.method, Method::Get); + response.headers_mut().set(Location(post_redirect_url.to_string())); + *response.status_mut() = StatusCode::MovedPermanently; + response.send(b"").unwrap(); + }; + let (mut pre_server, pre_url) = make_server(pre_handler); -#[test] -fn test_load_errors_when_viewing_source_and_inner_url_scheme_is_not_http_or_https() { - let url = ServoUrl::parse("view-source:ftp://not-supported").unwrap(); - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); - - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - - match load(&load_data, - &ui_provider, &http_state, - None, - &DontConnectFactory, - DEFAULT_USER_AGENT.into(), - &CancellationListener::new(None), None) { - Err(ref load_err) if load_err.error == LoadErrorType::UnsupportedScheme { scheme: "ftp".into() } => (), - _ => panic!("expected ftp scheme to be unsupported") - } -} + let request = Request::from_init(RequestInit { + url: pre_url.clone(), + method: Method::Get, + destination: Destination::Document, + origin: pre_url.clone(), + pipeline_id: Some(TEST_PIPELINE_ID), + .. RequestInit::default() + }); + let response = fetch_sync(request, None); -#[test] -fn test_load_errors_when_cancelled() { - use ipc_channel::ipc; - use net::resource_thread::CancellableResource; - use net_traits::ResourceId; - - struct Factory; - - impl HttpRequestFactory for Factory { - type R = MockRequest; - - fn create(&self, _: ServoUrl, _: Method, _: Headers) -> Result<MockRequest, LoadError> { - let mut headers = Headers::new(); - headers.set(Host { hostname: "Kaboom!".to_owned(), port: None }); - Ok(MockRequest::new( - ResponseType::WithHeaders(<[_]>::to_vec("BOOM!".as_bytes()), headers)) - ) - } - } + let _ = pre_server.close(); + let _ = post_server.close(); - let (id_sender, _id_receiver) = ipc::channel().unwrap(); - let (cancel_sender, cancel_receiver) = mpsc::channel(); - let cancel_resource = CancellableResource::new(cancel_receiver, ResourceId(0), id_sender); - let cancel_listener = CancellationListener::new(Some(cancel_resource)); - cancel_sender.send(()).unwrap(); - - let url = ServoUrl::parse("https://mozilla.com").unwrap(); - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - - match load(&load_data, - &ui_provider, &http_state, - None, - &Factory, - DEFAULT_USER_AGENT.into(), - &cancel_listener, None) { - Err(ref load_err) if load_err.error == LoadErrorType::Cancelled => (), - _ => panic!("expected load cancelled error!") - } + let response = response.to_actual(); + assert!(response.status.unwrap().is_success()); + assert_eq!(*response.body.lock().unwrap(), + ResponseBody::Done(b"Yay!".to_vec())); } #[test] @@ -1466,683 +1014,183 @@ fn test_redirect_from_x_to_y_provides_y_cookies_from_y() { #[test] fn test_redirect_from_x_to_x_provides_x_with_cookie_from_first_response() { - let url = ServoUrl::parse("http://mozilla.org/initial/").unwrap(); - - struct Factory; - - impl HttpRequestFactory for Factory { - type R = MockRequest; - - fn create(&self, url: ServoUrl, _: Method, headers: Headers) -> Result<MockRequest, LoadError> { - if url.path_segments().unwrap().next().unwrap() == "initial" { - let mut initial_answer_headers = Headers::new(); - initial_answer_headers.set_raw("set-cookie", vec![b"mozillaIs=theBest; path=/;".to_vec()]); - Ok(MockRequest::new( - ResponseType::RedirectWithHeaders("http://mozilla.org/subsequent/".to_owned(), - initial_answer_headers))) - } else if url.path_segments().unwrap().next().unwrap() == "subsequent" { - let mut expected_subsequent_headers = Headers::new(); - expected_subsequent_headers.set_raw("Cookie", vec![b"mozillaIs=theBest".to_vec()]); - assert_headers_included(&expected_subsequent_headers, &headers); - Ok(MockRequest::new(ResponseType::Text(b"Yay!".to_vec()))) - } else { - panic!("unexpected host {:?}", url) - } - } - } - - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); - - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - - match load(&load_data, - &ui_provider, &http_state, - None, - &Factory, - DEFAULT_USER_AGENT.into(), - &CancellationListener::new(None), None) { - Err(e) => panic!("expected to follow a redirect {:?}", e), - Ok(mut lr) => { - let response = read_response(&mut lr); - assert_eq!(response, "Yay!".to_owned()); - } - } -} - -#[test] -fn test_if_auth_creds_not_in_url_but_in_cache_it_sets_it() { - let url = ServoUrl::parse("http://mozilla.com").unwrap(); - - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - - let auth_entry = AuthCacheEntry { - user_name: "username".to_owned(), - password: "test".to_owned(), - }; - - http_state.auth_cache.write().unwrap().entries.insert(url.origin().clone().ascii_serialization(), auth_entry); - - let mut load_data = LoadData::new(LoadContext::Browsing, url, &HttpTest); - load_data.credentials_flag = true; - - let mut auth_header = Headers::new(); - - auth_header.set( - Authorization( - Basic { - username: "username".to_owned(), - password: Some("test".to_owned()) - } - ) - ); - - let _ = load( - &load_data, &ui_provider, &http_state, - None, &AssertMustIncludeHeadersRequestFactory { - expected_headers: auth_header, - body: <[_]>::to_vec(&[]) - }, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); -} - -#[test] -fn test_auth_ui_sets_header_on_401() { - let url = ServoUrl::parse("http://mozilla.com").unwrap(); - let http_state = HttpState::new(); - let ui_provider = TestProvider { username: "test".to_owned(), password: "test".to_owned() }; - - let mut auth_header = Headers::new(); - - auth_header.set( - Authorization( - Basic { - username: "test".to_owned(), - password: Some("test".to_owned()) - } - ) - ); - - let load_data = LoadData::new(LoadContext::Browsing, url, &HttpTest); - - match load( - &load_data, &ui_provider, &http_state, - None, &AssertAuthHeaderRequestFactory { - expected_headers: auth_header, - body: <[_]>::to_vec(&[]) - }, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None) { - Err(e) => panic!("response contained error {:?}", e), - Ok(response) => { - assert_eq!(response.metadata.status, - Some((200, b"OK".to_vec()))); - } - } -} - -#[test] -fn test_auth_ui_needs_www_auth() { - let url = ServoUrl::parse("http://mozilla.com").unwrap(); - let http_state = HttpState::new(); - struct AuthProvider; - impl UIProvider for AuthProvider { - fn input_username_and_password(&self, _prompt: &str) -> (Option<String>, Option<String>) { - panic!("shouldn't be invoked") - } - } - - struct Factory; - - impl HttpRequestFactory for Factory { - type R = MockRequest; - - fn create(&self, _: ServoUrl, _: Method, _: Headers) -> Result<MockRequest, LoadError> { - Ok(MockRequest::new(ResponseType::NeedsAuth(Headers::new()))) - } - } - - let load_data = LoadData::new(LoadContext::Browsing, url, &HttpTest); - - let response = load(&load_data, &AuthProvider, &http_state, - None, &Factory, DEFAULT_USER_AGENT.into(), - &CancellationListener::new(None), None); - match response { - Err(e) => panic!("response contained error {:?}", e), - Ok(response) => { - assert_eq!(response.metadata.status, - Some((401, "Unauthorized".as_bytes().to_vec()))); + let handler = move |request: HyperRequest, mut response: HyperResponse| { + let path = match request.uri { + ::hyper::uri::RequestUri::AbsolutePath(path) => path, + uri => panic!("Unexpected uri: {:?}", uri), + }; + if path == "/initial/" { + response.headers_mut().set_raw("set-cookie", vec![b"mozillaIs=theBest; path=/;".to_vec()]); + let location = "/subsequent/".to_string(); + response.headers_mut().set(Location(location)); + *response.status_mut() = StatusCode::MovedPermanently; + response.send(b"").unwrap(); + } else if path == "/subsequent/" { + assert_eq!(request.headers.get(), + Some(&CookieHeader(vec![CookiePair::new("mozillaIs".to_owned(), "theBest".to_owned())]))); + response.send(b"Yay!").unwrap(); + } else { + panic!("unexpected path {:?}", path) } - } -} - -fn assert_referrer_header_matches(origin_info: &LoadOrigin, - request_url: &str, - expected_referrer: &str) { - let url = ServoUrl::parse(request_url).unwrap(); - let ui_provider = TestProvider::new(); - - let load_data = LoadData::new(LoadContext::Browsing, - url.clone(), - origin_info); - - let mut referrer_headers = Headers::new(); - referrer_headers.set(Referer(expected_referrer.to_owned())); - - let http_state = HttpState::new(); - - let _ = load(&load_data.clone(), &ui_provider, &http_state, None, - &AssertMustIncludeHeadersRequestFactory { - expected_headers: referrer_headers, - body: <[_]>::to_vec(&[]) - }, DEFAULT_USER_AGENT.into(), - &CancellationListener::new(None), None); -} - -fn assert_referrer_header_not_included(origin_info: &LoadOrigin, request_url: &str) { - let url = ServoUrl::parse(request_url).unwrap(); - let ui_provider = TestProvider::new(); - - let load_data = LoadData::new(LoadContext::Browsing, - url.clone(), - origin_info); - - let http_state = HttpState::new(); - - let _ = load( - &load_data.clone(), &ui_provider, &http_state, None, - &AssertMustNotIncludeHeadersRequestFactory { - headers_not_expected: vec!["Referer".to_owned()], - body: <[_]>::to_vec(&[]) - }, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); -} - -#[test] -fn test_referrer_set_to_origin_with_origin_policy() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@someurl.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::Origin); - let expected_referrer = "http://someurl.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy }; + let (mut server, url) = make_server(handler); - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_set_to_ref_url_with_sameorigin_policy_same_orig() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::SameOrigin); - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_no_referrer_set_with_sameorigin_policy_cross_orig() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@someurl.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::SameOrigin); - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_not_included(&origin_info, request_url); -} - -#[test] -fn test_referrer_set_to_stripped_url_with_unsafeurl_policy() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@someurl.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::UnsafeUrl); - let expected_referrer = "http://someurl.com/some/path"; - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_with_originwhencrossorigin_policy_cross_orig() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@someurl.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::OriginWhenCrossOrigin); - let expected_referrer = "http://someurl.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_with_originwhencrossorigin_policy_same_orig() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::OriginWhenCrossOrigin); - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_http_to_https_considered_cross_origin_for_referrer_header_logic() { - let request_url = "https://mozilla.com"; - let referrer_url = "http://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::OriginWhenCrossOrigin); - let expected_referrer = "http://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_with_strictorigin_policy_http_to_https() { - let request_url = "https://mozilla.com"; - let referrer_url = "http://mozilla.com"; - let referrer_policy = Some(ReferrerPolicy::StrictOrigin); - let expected_referrer = "http://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_no_referrer_with_strictorigin_policy_https_to_http() { - let request_url = "http://mozilla.com"; - let referrer_url = "https://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOrigin); - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_not_included(&origin_info, request_url); -} - -#[test] -fn test_referrer_with_strictorigin_policy_http_to_http() { - let request_url = "http://mozilla.com/"; - let referrer_url = "http://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOrigin); - let expected_referrer = "http://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_with_strictorigin_policy_https_to_https() { - let request_url = "https://mozilla.com/"; - let referrer_url = "https://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOrigin); - let expected_referrer = "https://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_with_strictoriginwhencrossorigin_policy_https_to_https_same_origin() { - let request_url = "https://mozilla.com"; - let referrer_url = "https://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOriginWhenCrossOrigin); - let expected_referrer = "https://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_with_strictoriginwhencrossorigin_policy_https_to_https_cross_origin() { - let request_url = "https://servo.mozilla.com"; - let referrer_url = "https://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOriginWhenCrossOrigin); - let expected_referrer = "https://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; + let url = url.join("/initial/").unwrap(); - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} + let request = Request::from_init(RequestInit { + url: url.clone(), + method: Method::Get, + destination: Destination::Document, + origin: url.clone(), + pipeline_id: Some(TEST_PIPELINE_ID), + credentials_mode: CredentialsMode::Include, + .. RequestInit::default() + }); + let response = fetch_sync(request, None); -#[test] -fn test_referrer_set_with_strictoriginwhencrossorigin_policy_http_to_http_cross_orig() { - let request_url = "http://servo.mozilla.com"; - let referrer_url = "http://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOriginWhenCrossOrigin); - let expected_referrer = "http://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; + let _ = server.close(); - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); + let response = response.to_actual(); + assert!(response.status.unwrap().is_success()); + assert_eq!(*response.body.lock().unwrap(), + ResponseBody::Done(b"Yay!".to_vec())); } #[test] -fn test_referrer_set_with_strictoriginwhencrossorigin_policy_http_to_http_same_orig() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOriginWhenCrossOrigin); - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy +fn test_if_auth_creds_not_in_url_but_in_cache_it_sets_it() { + let handler = move |request: HyperRequest, response: HyperResponse| { + let expected = Authorization(Basic { + username: "username".to_owned(), + password: Some("test".to_owned()) + }); + assert_eq!(request.headers.get(), Some(&expected)); + response.send(b"").unwrap(); }; + let (mut server, url) = make_server(handler); - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} + let request = Request::from_init(RequestInit { + url: url.clone(), + method: Method::Get, + body: None, + destination: Destination::Document, + origin: url.clone(), + pipeline_id: Some(TEST_PIPELINE_ID), + credentials_mode: CredentialsMode::Include, + .. RequestInit::default() + }); + let context = new_fetch_context(None); -#[test] -fn test_referrer_set_with_strictoriginwhencrossorigin_policy_http_to_https_cross_orig() { - let request_url = "https://servo.mozilla.com"; - let referrer_url = "http://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOriginWhenCrossOrigin); - let expected_referrer = "http://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy + let auth_entry = AuthCacheEntry { + user_name: "username".to_owned(), + password: "test".to_owned(), }; - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_set_with_strictoriginwhencrossorigin_policy_http_to_https_same_orig() { - let request_url = "https://mozilla.com"; - let referrer_url = "http://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOriginWhenCrossOrigin); - let expected_referrer = "http://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; + context.state.auth_cache.write().unwrap().entries.insert(url.origin().clone().ascii_serialization(), auth_entry); - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} + let response = fetch(Rc::new(request), &mut None, &context); -#[test] -fn test_referrer_set_to_ref_url_with_noreferrerwhendowngrade_policy_https_to_https() { - let request_url = "https://mozilla.com"; - let referrer_url = "https://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::NoReferrerWhenDowngrade); - let expected_referrer = "https://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy, - }; + let _ = server.close(); - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); + assert!(response.status.unwrap().is_success()); } #[test] -fn test_no_referrer_set_with_noreferrerwhendowngrade_policy_https_to_http() { - let request_url = "http://mozilla.com"; - let referrer_url = "https://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::NoReferrerWhenDowngrade); - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy +fn test_auth_ui_needs_www_auth() { + let handler = move |_: HyperRequest, mut response: HyperResponse| { + *response.status_mut() = StatusCode::Unauthorized; + response.send(b"").unwrap(); }; + let (mut server, url) = make_server(handler); - assert_referrer_header_not_included(&origin_info, request_url) -} - -#[test] -fn test_referrer_set_to_ref_url_with_noreferrerwhendowngrade_policy_http_to_https() { - let request_url = "https://mozilla.com"; - let referrer_url = "http://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::NoReferrerWhenDowngrade); - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; + let request = Request::from_init(RequestInit { + url: url.clone(), + method: Method::Get, + body: None, + destination: Destination::Document, + origin: url.clone(), + pipeline_id: Some(TEST_PIPELINE_ID), + credentials_mode: CredentialsMode::Include, + .. RequestInit::default() + }); - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} + let response = fetch_sync(request, None); -#[test] -fn test_referrer_set_to_ref_url_with_noreferrerwhendowngrade_policy_http_to_http() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::NoReferrerWhenDowngrade); - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; + let _ = server.close(); - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); + assert_eq!(response.status.unwrap(), StatusCode::Unauthorized); } #[test] -fn test_no_referrer_policy_follows_noreferrerwhendowngrade_https_to_https() { - let request_url = "https://mozilla.com"; - let referrer_url = "https://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = None; - let expected_referrer = "https://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy +fn test_content_blocked() { + let handler = move |_: HyperRequest, response: HyperResponse| { + response.send(b"Yay!").unwrap(); }; + let (mut server, url) = make_server(handler); - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} + let url_filter = url.as_str().replace("http://", "https?://"); + let blocked_content_list = format!("[{{ \ + \"trigger\": {{ \"url-filter\": \"{}\" }}, \ + \"action\": {{ \"type\": \"block\" }} \ + }}]", url_filter); -#[test] -fn test_no_referrer_policy_follows_noreferrerwhendowngrade_https_to_http() { - let request_url = "http://mozilla.com"; - let referrer_url = "https://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = None; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_not_included(&origin_info, request_url); -} + let mut context = new_fetch_context(None); + context.state.blocked_content = Arc::new(Some(parse_list(&blocked_content_list).unwrap())); -#[test] -fn test_no_referrer_policy_follows_noreferrerwhendowngrade_http_to_https() { - let request_url = "https://mozilla.com"; - let referrer_url = "http://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = None; - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; + let request = Request::from_init(RequestInit { + url: url.clone(), + method: Method::Get, + body: None, + destination: Destination::Document, + origin: url.clone(), + .. RequestInit::default() + }); - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} + let response = fetch(Rc::new(request), &mut None, &context); -#[test] -fn test_no_referrer_policy_follows_noreferrerwhendowngrade_http_to_http() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = None; - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; + let _ = server.close(); - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); + // TODO(#14307): this should fail. + assert!(response.status.unwrap().is_success()); } #[test] -fn test_no_referrer_set_with_noreferrer_policy() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://someurl.com"; - let referrer_policy = Some(ReferrerPolicy::NoReferrer); - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy, +fn test_cookies_blocked() { + let handler = move |request: HyperRequest, response: HyperResponse| { + assert_eq!(request.headers.get::<CookieHeader>(), None); + response.send(b"hi").unwrap(); }; + let (mut server, url) = make_server(handler); - assert_referrer_header_not_included(&origin_info, request_url) -} - -fn load_request_for_custom_response(expected_body: Vec<u8>) -> (Metadata, String) { - use ipc_channel::ipc; - let (sender, receiver) = ipc::channel().unwrap(); - - struct Factory; - impl HttpRequestFactory for Factory { - type R = MockRequest; - fn create(&self, _: ServoUrl, _: Method, _: Headers) -> Result<MockRequest, LoadError> { - Ok(MockRequest::new(ResponseType::Dummy404)) - } - } - - let mock_response = CustomResponse::new( - Headers::new(), - RawStatus(200, Cow::Borrowed("OK")), - expected_body - ); - let url = ServoUrl::parse("http://mozilla.com").unwrap(); - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); - - let join_handle = thread::spawn(move || { - let response = load(&load_data.clone(), &ui_provider, &http_state, - None, &Factory, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), Some(sender)); - match response { - Ok(mut response) => { - let metadata = response.metadata.clone(); - let body = read_response(&mut response); - (metadata, body) - } - Err(e) => panic!("Error Getting Response: {:?}", e) - } - }); - - let mediator = receiver.recv().unwrap(); - mediator.response_chan.send(Some(mock_response)).unwrap(); - let (metadata, body) = join_handle.join().unwrap(); - (metadata, body) -} - -#[test] -fn test_custom_response() { - let expected_body = b"Yay!".to_vec(); - let (metadata, body) = load_request_for_custom_response(expected_body.clone()); - assert_eq!(metadata.status, Some((200, b"OK".to_vec()))); - assert_eq!(body, String::from_utf8(expected_body).unwrap()); -} - -#[test] -fn test_content_blocked() { - struct Factory; - impl HttpRequestFactory for Factory { - type R = MockRequest; - - fn create(&self, _url: ServoUrl, _method: Method, _: Headers) -> Result<MockRequest, LoadError> { - Ok(MockRequest::new(ResponseType::Text(<[_]>::to_vec("Yay!".as_bytes())))) - } - } - - let blocked_url = ServoUrl::parse("http://mozilla.com").unwrap(); - let url_without_cookies = ServoUrl::parse("http://mozilla2.com").unwrap(); - let mut http_state = HttpState::new(); - - let blocked_content_list = "[{ \"trigger\": { \"url-filter\": \"https?://mozilla.com\" }, \ - \"action\": { \"type\": \"block\" } },\ - { \"trigger\": { \"url-filter\": \"https?://mozilla2.com\" }, \ - \"action\": { \"type\": \"block-cookies\" } }]"; - http_state.blocked_content = Arc::new(parse_list(blocked_content_list).ok()); - assert!(http_state.blocked_content.is_some()); + let url_filter = url.as_str().replace("http://", "https?://"); + let blocked_content_list = format!("[{{ \ + \"trigger\": {{ \"url-filter\": \"{}\" }}, \ + \"action\": {{ \"type\": \"block-cookies\" }} \ + }}]", url_filter); + let mut context = new_fetch_context(None); + context.state.blocked_content = Arc::new(Some(parse_list(&blocked_content_list).unwrap())); { - let mut cookie_jar = http_state.cookie_jar.write().unwrap(); + let mut cookie_jar = context.state.cookie_jar.write().unwrap(); let cookie = Cookie::new_wrapped( - CookiePair::parse("mozillaIs=theBest;").unwrap(), - &url_without_cookies, + CookiePair::new("mozillaIs".to_owned(), "theBest".to_owned()), + &url, CookieSource::HTTP ).unwrap(); cookie_jar.push(cookie, CookieSource::HTTP); } - let ui_provider = TestProvider::new(); - - let load_data = LoadData::new(LoadContext::Browsing, url_without_cookies, &HttpTest); + let request = Request::from_init(RequestInit { + url: url.clone(), + method: Method::Get, + body: None, + destination: Destination::Document, + origin: url.clone(), + .. RequestInit::default() + }); - let response = load( - &load_data, &ui_provider, &http_state, - None, &AssertMustNotIncludeHeadersRequestFactory { - headers_not_expected: vec!["Cookie".to_owned()], - body: b"hi".to_vec(), - }, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); - match response { - Ok(_) => {}, - _ => panic!("request should have succeeded without cookies"), - } + let response = fetch(Rc::new(request), &mut None, &context); - let load_data = LoadData::new(LoadContext::Browsing, blocked_url, &HttpTest); + let _ = server.close(); - let response = load( - &load_data, &ui_provider, &http_state, - None, &Factory, - DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); - match response { - Err(LoadError { error: LoadErrorType::ContentBlocked, .. }) => {}, - _ => panic!("request should have been blocked"), - } + assert!(response.status.unwrap().is_success()); } diff --git a/tests/unit/net/resource_thread.rs b/tests/unit/net/resource_thread.rs index a11e2c001ae..2ffc0a2cd36 100644 --- a/tests/unit/net/resource_thread.rs +++ b/tests/unit/net/resource_thread.rs @@ -44,26 +44,6 @@ fn test_exit() { } #[test] -fn test_bad_scheme() { - let (tx, _rx) = ipc::channel().unwrap(); - let (sender, receiver) = ipc::channel().unwrap(); - let (resource_thread, _) = new_core_resource_thread( - "".into(), None, ProfilerChan(tx), None); - let (start_chan, start) = ipc::channel().unwrap(); - let url = ServoUrl::parse("bogus://whatever").unwrap(); - resource_thread.send(CoreResourceMsg::Load(LoadData::new(LoadContext::Browsing, url, &ResourceTest), - - LoadConsumer::Channel(start_chan), None)).unwrap(); - let response = start.recv().unwrap(); - match response.progress_port.recv().unwrap() { - ProgressMsg::Done(result) => { assert!(result.is_err()) } - _ => panic!("bleh") - } - resource_thread.send(CoreResourceMsg::Exit(sender)).unwrap(); - receiver.recv().unwrap(); -} - -#[test] fn test_parse_hostsfile() { let mock_hosts_file_content = "127.0.0.1 foo.bar.com\n127.0.0.2 servo.test.server"; let hosts_table = parse_hostsfile(mock_hosts_file_content); |