hyper_sync/header/common/
referrer_policy.rs

1use std::fmt;
2#[allow(unused, deprecated)]
3use std::ascii::AsciiExt;
4
5use header::{Header, Raw, parsing};
6
7/// `Referrer-Policy` header, part of
8/// [Referrer Policy](https://www.w3.org/TR/referrer-policy/#referrer-policy-header)
9///
10/// The `Referrer-Policy` HTTP header specifies the referrer
11/// policy that the user agent applies when determining what
12/// referrer information should be included with requests made,
13/// and with browsing contexts created from the context of the
14/// protected resource.
15///
16/// # ABNF
17///
18/// ```text
19/// Referrer-Policy: 1#policy-token
20/// policy-token   = "no-referrer" / "no-referrer-when-downgrade"
21///                  / "same-origin" / "origin"
22///                  / "origin-when-cross-origin" / "unsafe-url"
23/// ```
24///
25/// # Example values
26///
27/// * `no-referrer`
28///
29/// # Example
30///
31/// ```
32/// use hyper_sync::header::{Headers, ReferrerPolicy};
33///
34/// let mut headers = Headers::new();
35/// headers.set(ReferrerPolicy::NoReferrer);
36/// ```
37#[derive(Clone, PartialEq, Eq, Debug)]
38pub enum ReferrerPolicy {
39    /// `no-referrer`
40    NoReferrer,
41    /// `no-referrer-when-downgrade`
42    NoReferrerWhenDowngrade,
43    /// `same-origin`
44    SameOrigin,
45    /// `origin`
46    Origin,
47    /// `origin-when-cross-origin`
48    OriginWhenCrossOrigin,
49    /// `unsafe-url`
50    UnsafeUrl,
51     /// `strict-origin`
52    StrictOrigin,
53    ///`strict-origin-when-cross-origin`
54    StrictOriginWhenCrossOrigin,
55}
56
57impl Header for ReferrerPolicy {
58    fn header_name() -> &'static str {
59        static NAME: &'static str = "Referrer-Policy";
60        NAME
61    }
62
63    fn parse_header(raw: &Raw) -> ::Result<ReferrerPolicy> {
64        use self::ReferrerPolicy::*;
65        // See https://www.w3.org/TR/referrer-policy/#determine-policy-for-token
66        let headers: Vec<String> = try!(parsing::from_comma_delimited(raw));
67
68        for h in headers.iter().rev() {
69            let slice = &h.to_ascii_lowercase()[..];
70            match slice {
71                "no-referrer" | "never" => return Ok(NoReferrer),
72                "no-referrer-when-downgrade" | "default" => return Ok(NoReferrerWhenDowngrade),
73                "same-origin" => return Ok(SameOrigin),
74                "origin" => return Ok(Origin),
75                "origin-when-cross-origin" => return Ok(OriginWhenCrossOrigin),
76                "strict-origin" => return Ok(StrictOrigin),
77                "strict-origin-when-cross-origin" => return Ok(StrictOriginWhenCrossOrigin),
78                "unsafe-url" | "always" => return Ok(UnsafeUrl),
79                _ => continue,
80            }
81        }
82
83        Err(::Error::Header)
84    }
85
86    fn fmt_header(&self, f: &mut ::header::Formatter) -> fmt::Result {
87        f.fmt_line(self)
88    }
89}
90
91impl fmt::Display for ReferrerPolicy {
92    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
93        use self::ReferrerPolicy::*;
94        f.write_str(match *self {
95            NoReferrer => "no-referrer",
96            NoReferrerWhenDowngrade => "no-referrer-when-downgrade",
97            SameOrigin => "same-origin",
98            Origin => "origin",
99            OriginWhenCrossOrigin => "origin-when-cross-origin",
100            StrictOrigin => "strict-origin",
101            StrictOriginWhenCrossOrigin => "strict-origin-when-cross-origin",
102            UnsafeUrl => "unsafe-url",
103        })
104    }
105}
106
107#[test]
108fn test_parse_header() {
109    let a: ReferrerPolicy = Header::parse_header(&"origin".into()).unwrap();
110    let b = ReferrerPolicy::Origin;
111    assert_eq!(a, b);
112    let e: ::Result<ReferrerPolicy> = Header::parse_header(&"foobar".into());
113    assert!(e.is_err());
114}
115
116#[test]
117fn test_rightmost_header() {
118    let a: ReferrerPolicy = Header::parse_header(&"same-origin, origin, foobar".into()).unwrap();
119    let b = ReferrerPolicy::Origin;
120    assert_eq!(a, b);
121}