1 use util::FlatCsv; 2 3 use HeaderValue; 4 5 /// `Vary` header, defined in [RFC7231](https://tools.ietf.org/html/rfc7231#section-7.1.4) 6 /// 7 /// The "Vary" header field in a response describes what parts of a 8 /// request message, aside from the method, Host header field, and 9 /// request target, might influence the origin server's process for 10 /// selecting and representing this response. The value consists of 11 /// either a single asterisk ("*") or a list of header field names 12 /// (case-insensitive). 13 /// 14 /// # ABNF 15 /// 16 /// ```text 17 /// Vary = "*" / 1#field-name 18 /// ``` 19 /// 20 /// # Example values 21 /// 22 /// * `accept-encoding, accept-language` 23 /// 24 /// # Example 25 /// 26 /// ``` 27 /// # extern crate headers; 28 /// use headers::Vary; 29 /// 30 /// let vary = Vary::any(); 31 /// ``` 32 #[derive(Debug, Clone, PartialEq)] 33 pub struct Vary(FlatCsv); 34 35 derive_header! { 36 Vary(_), 37 name: VARY 38 } 39 40 impl Vary { 41 /// Create a new `Very: *` header. any() -> Vary42 pub fn any() -> Vary { 43 Vary(HeaderValue::from_static("*").into()) 44 } 45 46 /// Check if this includes `*`. is_any(&self) -> bool47 pub fn is_any(&self) -> bool { 48 self.0.iter().any(|val| val == "*") 49 } 50 51 /// Iterate the header names of this `Vary`. iter_strs(&self) -> impl Iterator<Item = &str>52 pub fn iter_strs(&self) -> impl Iterator<Item = &str> { 53 self.0.iter() 54 } 55 } 56 57 /* 58 test_vary { 59 test_header!(test1, vec![b"accept-encoding, accept-language"]); 60 61 #[test] 62 fn test2() { 63 let mut vary: ::Result<Vary>; 64 65 vary = Header::parse_header(&"*".into()); 66 assert_eq!(vary.ok(), Some(Vary::Any)); 67 68 vary = Header::parse_header(&"etag,cookie,allow".into()); 69 assert_eq!(vary.ok(), Some(Vary::Items(vec!["eTag".parse().unwrap(), 70 "cookIE".parse().unwrap(), 71 "AlLOw".parse().unwrap(),]))); 72 } 73 } 74 */ 75 76 #[cfg(test)] 77 mod tests { 78 use super::*; 79 80 #[test] any_is_any()81 fn any_is_any() { 82 assert!(Vary::any().is_any()); 83 } 84 } 85