diff --git a/components/net/fetch/methods.rs b/components/net/fetch/methods.rs index 976b1e0b5ee..f55f1b1daff 100644 --- a/components/net/fetch/methods.rs +++ b/components/net/fetch/methods.rs @@ -112,9 +112,9 @@ fn main_fetch(request: Rc, cors_flag: bool, recursive_flag: bool) -> Re // Step 2 if request.local_urls_only { match &*request.current_url().scheme { - "about" | "blob" | "data" | "filesystem" => response = Some(Response::network_error()), - _ => { } - }; + "about" | "blob" | "data" | "filesystem" => (), // Ok, the URL is local. + _ => response = Some(Response::network_error()) + } } // Step 3 diff --git a/components/net_traits/request.rs b/components/net_traits/request.rs index 74742703035..5c0f7ec2200 100644 --- a/components/net_traits/request.rs +++ b/components/net_traits/request.rs @@ -152,7 +152,7 @@ impl Request { pub fn new(url: Url, origin: Option, is_service_worker_global_scope: bool) -> Request { - Request { + Request { method: RefCell::new(Method::Get), local_urls_only: false, sandboxed_storage_area_urls: false, diff --git a/tests/unit/net/fetch.rs b/tests/unit/net/fetch.rs index 1a6168f77d6..46f1bd224eb 100644 --- a/tests/unit/net/fetch.rs +++ b/tests/unit/net/fetch.rs @@ -282,6 +282,38 @@ fn test_fetch_response_is_opaque_redirect_filtered() { } } +#[test] +fn test_fetch_with_local_urls_only() { + // If flag `local_urls_only` is set, fetching a non-local URL must result in network error. + + static MESSAGE: &'static [u8] = b""; + let handler = move |_: HyperRequest, response: HyperResponse| { + response.send(MESSAGE).unwrap(); + }; + let (mut server, server_url) = make_server(handler); + + let do_fetch = |url: Url| { + let origin = Origin::Origin(url.origin()); + let mut request = Request::new(url, Some(origin), false); + request.referer = Referer::NoReferer; + + // Set the flag. + request.local_urls_only = true; + + let wrapped_request = Rc::new(request); + fetch(wrapped_request) + }; + + let local_url = Url::parse("about:blank").unwrap(); + let local_response = do_fetch(local_url); + let server_response = do_fetch(server_url); + + let _ = server.close(); + + assert!(!local_response.is_network_error()); + assert!(server_response.is_network_error()); +} + fn test_fetch_redirect_count(message: &'static [u8], redirect_cap: u32) -> Response { let handler = move |request: HyperRequest, mut response: HyperResponse| {