hyper_sync/header/common/
referrer_policy.rs1use std::fmt;
2#[allow(unused, deprecated)]
3use std::ascii::AsciiExt;
4
5use header::{Header, Raw, parsing};
6
7#[derive(Clone, PartialEq, Eq, Debug)]
38pub enum ReferrerPolicy {
39 NoReferrer,
41 NoReferrerWhenDowngrade,
43 SameOrigin,
45 Origin,
47 OriginWhenCrossOrigin,
49 UnsafeUrl,
51 StrictOrigin,
53 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 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}