aboutsummaryrefslogtreecommitdiffstats
path: root/components/net_traits/request.rs
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2016-06-06 18:58:50 +0530
committerManish Goregaokar <manishsmail@gmail.com>2016-06-10 20:55:25 +0530
commitfd6f9bd4110e9fa725a257148d537fa6f0392a61 (patch)
tree0cc46ce816fc4b847b33d8dd261fff924da24b5e /components/net_traits/request.rs
parentf4e3e8e38e0db0cbc958019cc8ab182e3e755b26 (diff)
downloadservo-fd6f9bd4110e9fa725a257148d537fa6f0392a61.tar.gz
servo-fd6f9bd4110e9fa725a257148d537fa6f0392a61.zip
Test fixes; update for changes in spec
Diffstat (limited to 'components/net_traits/request.rs')
-rw-r--r--components/net_traits/request.rs40
1 files changed, 39 insertions, 1 deletions
diff --git a/components/net_traits/request.rs b/components/net_traits/request.rs
index 6909d7b25e7..4c7f4081f77 100644
--- a/components/net_traits/request.rs
+++ b/components/net_traits/request.rs
@@ -4,7 +4,9 @@
use hyper::header::Headers;
use hyper::method::Method;
+use msg::constellation_msg::ReferrerPolicy;
use std::cell::{Cell, RefCell};
+use std::mem::swap;
use url::{Origin as UrlOrigin, Url};
/// An [initiator](https://fetch.spec.whatwg.org/#concept-request-initiator)
@@ -125,6 +127,9 @@ pub struct RequestInit {
// this should actually be set by fetch, but fetch
// doesn't have info about the client right now
pub origin: Url,
+ // XXXManishearth these should be part of the client object
+ pub referer_url: Option<Url>,
+ pub referrer_policy: Option<ReferrerPolicy>,
}
/// A [Request](https://fetch.spec.whatwg.org/#requests) as defined by the Fetch spec
@@ -151,8 +156,9 @@ pub struct Request {
pub origin: RefCell<Origin>,
pub omit_origin_header: Cell<bool>,
pub same_origin_data: Cell<bool>,
+ /// https://fetch.spec.whatwg.org/#concept-request-referrer
pub referer: RefCell<Referer>,
- // TODO: referrer policy
+ pub referrer_policy: Cell<Option<ReferrerPolicy>>,
pub synchronous: bool,
pub mode: RequestMode,
pub use_cors_preflight: bool,
@@ -191,6 +197,7 @@ impl Request {
omit_origin_header: Cell::new(false),
same_origin_data: Cell::new(false),
referer: RefCell::new(Referer::Client),
+ referrer_policy: Cell::new(None),
synchronous: false,
mode: RequestMode::NoCORS,
use_cors_preflight: false,
@@ -220,6 +227,12 @@ impl Request {
req.credentials_mode = init.credentials_mode;
req.use_url_credentials = init.use_url_credentials;
*req.origin.borrow_mut() = Origin::Origin(init.origin.origin());
+ *req.referer.borrow_mut() = if let Some(url) = init.referer_url {
+ Referer::RefererUrl(url)
+ } else {
+ Referer::NoReferer
+ };
+ req.referrer_policy.set(init.referrer_policy);
req
}
@@ -246,6 +259,7 @@ impl Request {
omit_origin_header: Cell::new(false),
same_origin_data: Cell::new(false),
referer: RefCell::new(Referer::Client),
+ referrer_policy: Cell::new(None),
synchronous: false,
// Step 1-2
mode: match cors_attribute_state {
@@ -296,3 +310,27 @@ impl Request {
}
}
}
+
+impl Referer {
+ pub fn to_url(&self) -> Option<&Url> {
+ match *self {
+ Referer::NoReferer | Referer::Client => None,
+ Referer::RefererUrl(ref url) => Some(url)
+ }
+ }
+ pub fn from_url(url: Option<Url>) -> Self {
+ if let Some(url) = url {
+ Referer::RefererUrl(url)
+ } else {
+ Referer::NoReferer
+ }
+ }
+ pub fn take(&mut self) -> Option<Url> {
+ let mut new = Referer::Client;
+ swap(self, &mut new);
+ match new {
+ Referer::NoReferer | Referer::Client => None,
+ Referer::RefererUrl(url) => Some(url)
+ }
+ }
+}