diff options
Diffstat (limited to 'components/net/http_loader.rs')
-rw-r--r-- | components/net/http_loader.rs | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs index 95ecd161aff..f06323ac348 100644 --- a/components/net/http_loader.rs +++ b/components/net/http_loader.rs @@ -108,22 +108,29 @@ reason: \"certificate verify failed\" }]"; } }; + // Preserve the `host` header set automatically by Request. + let host = req.headers().get::<Host>().unwrap().clone(); + // Avoid automatically preserving request headers when redirects occur. // See https://bugzilla.mozilla.org/show_bug.cgi?id=401564 and - // https://bugzilla.mozilla.org/show_bug.cgi?id=216828 + // https://bugzilla.mozilla.org/show_bug.cgi?id=216828 . + // Only preserve ones which have been explicitly marked as such. if iters == 1 { - // Preserve the `host` header set automatically by Request. - let host = req.headers().get::<Host>().unwrap().clone(); - *req.headers_mut() = load_data.headers.clone(); - req.headers_mut().set(host); + let mut combined_headers = load_data.headers.clone(); + combined_headers.extend(load_data.preserved_headers.iter()); + *req.headers_mut() = combined_headers; + } else { + *req.headers_mut() = load_data.preserved_headers.clone(); } + req.headers_mut().set(host); + let (tx, rx) = channel(); cookies_chan.send(ControlMsg::GetCookiesForUrl(url.clone(), tx, CookieSource::HTTP)); if let Some(cookie_list) = rx.recv().unwrap() { let mut v = Vec::new(); v.push(cookie_list.into_bytes()); - load_data.headers.set_raw("Cookie".to_owned(), v); + req.headers_mut().set_raw("Cookie".to_owned(), v); } // FIXME(seanmonstar): use AcceptEncoding from Hyper once available |