diff options
author | Ms2ger <Ms2ger@gmail.com> | 2016-12-08 11:46:57 -1000 |
---|---|---|
committer | Ms2ger <Ms2ger@gmail.com> | 2016-12-08 12:05:44 -1000 |
commit | 12aa4694cb7a982abf9c9709fe591bb30eeed6ac (patch) | |
tree | 7c2f479d757741152b932731aa6135d3882364fe /components/net/fetch/methods.rs | |
parent | 1e3d4d272de53e77334b1c32d3e3737f935c4cde (diff) | |
download | servo-12aa4694cb7a982abf9c9709fe591bb30eeed6ac.tar.gz servo-12aa4694cb7a982abf9c9709fe591bb30eeed6ac.zip |
Rewrite determine_request_referrer() to explicitly limit it to the checks it can do.
Checks for the Client value should reside in the script thread.
I also noted some other issues in this code.
Diffstat (limited to 'components/net/fetch/methods.rs')
-rw-r--r-- | components/net/fetch/methods.rs | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/components/net/fetch/methods.rs b/components/net/fetch/methods.rs index 994f3d36702..ebff48a80ba 100644 --- a/components/net/fetch/methods.rs +++ b/components/net/fetch/methods.rs @@ -21,6 +21,7 @@ use net_traits::response::{Response, ResponseBody, ResponseType}; use std::borrow::Cow; use std::fs::File; use std::io::Read; +use std::mem; use std::rc::Rc; use std::sync::mpsc::{Sender, Receiver}; @@ -154,15 +155,27 @@ pub fn main_fetch(request: Rc<Request>, request.referrer_policy.set(Some(referrer_policy)); // Step 8 - if *request.referrer.borrow() != Referrer::NoReferrer { - // remove Referrer headers set in past redirects/preflights - // this stops the assertion in determine_request_referrer from failing - request.headers.borrow_mut().remove::<RefererHeader>(); - let referrer_url = determine_request_referrer(&mut *request.headers.borrow_mut(), - referrer_policy, - request.referrer.borrow_mut().take(), - request.current_url().clone()); - *request.referrer.borrow_mut() = Referrer::from_url(referrer_url); + { + let mut referrer = request.referrer.borrow_mut(); + let referrer_url = match mem::replace(&mut *referrer, Referrer::NoReferrer) { + Referrer::NoReferrer => None, + Referrer::Client => { + // FIXME(#14507): We should never get this value here; it should + // already have been handled in the script thread. + request.headers.borrow_mut().remove::<RefererHeader>(); + None + }, + Referrer::ReferrerUrl(url) => { + request.headers.borrow_mut().remove::<RefererHeader>(); + determine_request_referrer(&mut *request.headers.borrow_mut(), + referrer_policy, + url, + request.current_url().clone()) + } + }; + if let Some(referrer_url) = referrer_url { + *referrer = Referrer::ReferrerUrl(referrer_url); + } } // Step 9 |