headers/common/
vary.rs

1use http::{HeaderName, HeaderValue};
2
3use crate::util::FlatCsv;
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/// use headers::Vary;
28///
29/// let vary = Vary::any();
30/// ```
31#[derive(Debug, Clone, PartialEq)]
32pub struct Vary(FlatCsv);
33
34derive_header! {
35    Vary(_),
36    name: VARY
37}
38
39impl Vary {
40    /// Create a new `Very: *` header.
41    pub fn any() -> Vary {
42        Vary(HeaderValue::from_static("*").into())
43    }
44
45    /// Check if this includes `*`.
46    pub fn is_any(&self) -> bool {
47        self.0.iter().any(|val| val == "*")
48    }
49
50    /// Iterate the header names of this `Vary`.
51    pub fn iter_strs(&self) -> impl Iterator<Item = &str> {
52        self.0.iter()
53    }
54}
55
56impl From<HeaderName> for Vary {
57    fn from(name: HeaderName) -> Self {
58        Vary(HeaderValue::from(name).into())
59    }
60}
61
62/*
63test_vary {
64    test_header!(test1, vec![b"accept-encoding, accept-language"]);
65
66    #[test]
67    fn test2() {
68        let mut vary: ::Result<Vary>;
69
70        vary = Header::parse_header(&"*".into());
71        assert_eq!(vary.ok(), Some(Vary::Any));
72
73        vary = Header::parse_header(&"etag,cookie,allow".into());
74        assert_eq!(vary.ok(), Some(Vary::Items(vec!["eTag".parse().unwrap(),
75                                                    "cookIE".parse().unwrap(),
76                                                    "AlLOw".parse().unwrap(),])));
77    }
78}
79*/
80
81#[cfg(test)]
82mod tests {
83    use super::*;
84
85    #[test]
86    fn any_is_any() {
87        assert!(Vary::any().is_any());
88    }
89}