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