diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-12-09 13:13:27 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-09 13:13:27 -0800 |
commit | 882d5512bb9aa7263864fb18d702c1efb6401914 (patch) | |
tree | 8f3017739783a3043568ed8208ccbb9d5b35f527 /components/net/fetch/methods.rs | |
parent | e5f995e7c42528f1bdd13ab37a8691d91bbd36ba (diff) | |
parent | 12aa4694cb7a982abf9c9709fe591bb30eeed6ac (diff) | |
download | servo-882d5512bb9aa7263864fb18d702c1efb6401914.tar.gz servo-882d5512bb9aa7263864fb18d702c1efb6401914.zip |
Auto merge of #14508 - servo:determine_request_referrer, r=jdm,frewsxcv
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.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/14508)
<!-- Reviewable:end -->
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 |