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