headers/common/vary.rs
1use util::FlatCsv;
2
3use 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)]
33pub struct Vary(FlatCsv);
34
35derive_header! {
36 Vary(_),
37 name: VARY
38}
39
40impl Vary {
41 /// Create a new `Very: *` header.
42 pub fn any() -> Vary {
43 Vary(HeaderValue::from_static("*").into())
44 }
45
46 /// Check if this includes `*`.
47 pub fn is_any(&self) -> bool {
48 self.0.iter().any(|val| val == "*")
49 }
50
51 /// Iterate the header names of this `Vary`.
52 pub fn iter_strs(&self) -> impl Iterator<Item = &str> {
53 self.0.iter()
54 }
55}
56
57/*
58test_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)]
77mod tests {
78 use super::*;
79
80 #[test]
81 fn any_is_any() {
82 assert!(Vary::any().is_any());
83 }
84}