feat(headers): Add Referrer-Policy header
This commit is contained in:
@@ -48,6 +48,7 @@ pub use self::prefer::{Prefer, Preference};
|
|||||||
pub use self::preference_applied::PreferenceApplied;
|
pub use self::preference_applied::PreferenceApplied;
|
||||||
pub use self::range::{Range, ByteRangeSpec};
|
pub use self::range::{Range, ByteRangeSpec};
|
||||||
pub use self::referer::Referer;
|
pub use self::referer::Referer;
|
||||||
|
pub use self::referrer_policy::ReferrerPolicy;
|
||||||
pub use self::server::Server;
|
pub use self::server::Server;
|
||||||
pub use self::set_cookie::SetCookie;
|
pub use self::set_cookie::SetCookie;
|
||||||
pub use self::strict_transport_security::StrictTransportSecurity;
|
pub use self::strict_transport_security::StrictTransportSecurity;
|
||||||
@@ -406,6 +407,7 @@ mod prefer;
|
|||||||
mod preference_applied;
|
mod preference_applied;
|
||||||
mod range;
|
mod range;
|
||||||
mod referer;
|
mod referer;
|
||||||
|
mod referrer_policy;
|
||||||
mod server;
|
mod server;
|
||||||
mod set_cookie;
|
mod set_cookie;
|
||||||
mod strict_transport_security;
|
mod strict_transport_security;
|
||||||
|
|||||||
92
src/header/common/referrer_policy.rs
Normal file
92
src/header/common/referrer_policy.rs
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
use std::fmt;
|
||||||
|
use std::ascii::AsciiExt;
|
||||||
|
|
||||||
|
use header::{Header, parsing};
|
||||||
|
|
||||||
|
/// `Referrer-Policy` header, part of
|
||||||
|
/// [Referrer Policy](https://www.w3.org/TR/referrer-policy/#referrer-policy-header)
|
||||||
|
///
|
||||||
|
/// The `Referrer-Policy` HTTP header specifies the referrer
|
||||||
|
/// policy that the user agent applies when determining what
|
||||||
|
/// referrer information should be included with requests made,
|
||||||
|
/// and with browsing contexts created from the context of the
|
||||||
|
/// protected resource.
|
||||||
|
///
|
||||||
|
/// # ABNF
|
||||||
|
/// ```plain
|
||||||
|
/// Referrer-Policy: 1#policy-token
|
||||||
|
/// policy-token = "no-referrer" / "no-referrer-when-downgrade"
|
||||||
|
/// / "same-origin" / "origin"
|
||||||
|
/// / "origin-when-cross-origin" / "unsafe-url"
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// # Example values
|
||||||
|
/// * `no-referrer`
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
/// ```
|
||||||
|
/// use hyper::header::{Headers, ReferrerPolicy};
|
||||||
|
///
|
||||||
|
/// let mut headers = Headers::new();
|
||||||
|
/// headers.set(ReferrerPolicy::NoReferrer);
|
||||||
|
/// ```
|
||||||
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||||
|
pub enum ReferrerPolicy {
|
||||||
|
/// `no-referrer`
|
||||||
|
NoReferrer,
|
||||||
|
/// `no-referrer-when-downgrade`
|
||||||
|
NoReferrerWhenDowngrade,
|
||||||
|
/// `same-origin`
|
||||||
|
SameOrigin,
|
||||||
|
/// `origin`
|
||||||
|
Origin,
|
||||||
|
/// `origin-when-cross-origin`
|
||||||
|
OriginWhenCrossOrigin,
|
||||||
|
/// `unsafe-url`
|
||||||
|
UnsafeUrl,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Header for ReferrerPolicy {
|
||||||
|
fn header_name() -> &'static str {
|
||||||
|
static NAME: &'static str = "Referrer-Policy";
|
||||||
|
NAME
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_header(raw: &[Vec<u8>]) -> ::Result<ReferrerPolicy> {
|
||||||
|
use self::ReferrerPolicy::*;
|
||||||
|
parsing::from_one_raw_str(raw).and_then(|s: String| {
|
||||||
|
let slice = &s.to_ascii_lowercase()[..];
|
||||||
|
// See https://www.w3.org/TR/referrer-policy/#determine-policy-for-token
|
||||||
|
match slice {
|
||||||
|
"no-referrer" | "never" => Ok(NoReferrer),
|
||||||
|
"no-referrer-when-downgrade" | "default" => Ok(NoReferrerWhenDowngrade),
|
||||||
|
"same-origin" => Ok(SameOrigin),
|
||||||
|
"origin" => Ok(Origin),
|
||||||
|
"origin-when-cross-origin" => Ok(OriginWhenCrossOrigin),
|
||||||
|
"unsafe-url" | "always" => Ok(UnsafeUrl),
|
||||||
|
_ => Err(::Error::Header),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
use self::ReferrerPolicy::*;
|
||||||
|
f.write_str(match *self {
|
||||||
|
NoReferrer => "no-referrer",
|
||||||
|
NoReferrerWhenDowngrade => "no-referrer-when-downgrade",
|
||||||
|
SameOrigin => "same-origin",
|
||||||
|
Origin => "origin",
|
||||||
|
OriginWhenCrossOrigin => "origin-when-cross-origin",
|
||||||
|
UnsafeUrl => "unsafe-url",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_header() {
|
||||||
|
let a: ReferrerPolicy = Header::parse_header([b"origin".to_vec()].as_ref()).unwrap();
|
||||||
|
let b = ReferrerPolicy::Origin;
|
||||||
|
assert_eq!(a, b);
|
||||||
|
let e: ::Result<ReferrerPolicy> = Header::parse_header([b"foobar".to_vec()].as_ref());
|
||||||
|
assert!(e.is_err());
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user