aboutsummaryrefslogtreecommitdiffstats
path: root/components/net/fetch/methods.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-12-09 13:13:27 -0800
committerGitHub <noreply@github.com>2016-12-09 13:13:27 -0800
commit882d5512bb9aa7263864fb18d702c1efb6401914 (patch)
tree8f3017739783a3043568ed8208ccbb9d5b35f527 /components/net/fetch/methods.rs
parente5f995e7c42528f1bdd13ab37a8691d91bbd36ba (diff)
parent12aa4694cb7a982abf9c9709fe591bb30eeed6ac (diff)
downloadservo-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.rs31
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