diff --git a/components/constellation/network_listener.rs b/components/constellation/network_listener.rs index 239a6089f406..038d304fae4d 100644 --- a/components/constellation/network_listener.rs +++ b/components/constellation/network_listener.rs @@ -103,6 +103,7 @@ impl NetworkListener { self.res_init = Some(ResponseInit { url: metadata.final_url.clone(), + location_url: metadata.location_url.clone(), headers: headers.clone().into_inner(), referrer: metadata.referrer.clone(), }); diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs index 7e841fd645bf..562f2e5a15d8 100644 --- a/components/net_traits/lib.rs +++ b/components/net_traits/lib.rs @@ -411,6 +411,9 @@ pub struct Metadata { /// Final URL after redirects. pub final_url: ServoUrl, + /// Location URL from the response headers. + pub location_url: Option>, + #[ignore_heap_size_of = "Defined in hyper"] /// MIME type / subtype. pub content_type: Option>, @@ -440,6 +443,7 @@ impl Metadata { pub fn default(url: ServoUrl) -> Self { Metadata { final_url: url, + location_url: None, content_type: None, charset: None, headers: None, diff --git a/components/net_traits/response.rs b/components/net_traits/response.rs index 4796ee81806f..823e26cad6fa 100644 --- a/components/net_traits/response.rs +++ b/components/net_traits/response.rs @@ -82,6 +82,7 @@ pub struct ResponseInit { #[ignore_heap_size_of = "Defined in hyper"] pub headers: Headers, pub referrer: Option, + pub location_url: Option>, } /// A [Response](https://fetch.spec.whatwg.org/#concept-response) as defined by the Fetch spec @@ -138,6 +139,7 @@ impl Response { pub fn from_init(init: ResponseInit) -> Response { let mut res = Response::new(init.url); + res.location_url = init.location_url; res.headers = init.headers; res.referrer = init.referrer; res @@ -287,6 +289,7 @@ impl Response { Some(&ContentType(ref mime)) => Some(mime), None => None, }); + metadata.location_url = response.location_url.clone(); metadata.headers = Some(Serde(response.headers.clone())); metadata.status = response.raw_status.clone(); metadata.https_state = response.https_state;