1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use HeaderValue;

/// The `Pragma` header defined by HTTP/1.0.
///
/// > The "Pragma" header field allows backwards compatibility with
/// > HTTP/1.0 caches, so that clients can specify a "no-cache" request
/// > that they will understand (as Cache-Control was not defined until
/// > HTTP/1.1).  When the Cache-Control header field is also present and
/// > understood in a request, Pragma is ignored.
/// > In HTTP/1.0, Pragma was defined as an extensible field for
/// > implementation-specified directives for recipients.  This
/// > specification deprecates such extensions to improve interoperability.
///
/// Spec: [https://tools.ietf.org/html/rfc7234#section-5.4][url]
///
/// [url]: https://tools.ietf.org/html/rfc7234#section-5.4
///
/// # Examples
///
/// ```
/// # extern crate headers;
/// use headers::Pragma;
///
/// let pragma = Pragma::no_cache();
/// ```
#[derive(Clone, Debug, PartialEq)]
pub struct Pragma(HeaderValue);

derive_header! {
    Pragma(_),
    name: PRAGMA
}

impl Pragma {
    /// Construct the literal `no-cache` Pragma header.
    pub fn no_cache() -> Pragma {
        Pragma(HeaderValue::from_static("no-cache"))
    }

    /// Return whether this pragma is `no-cache`.
    pub fn is_no_cache(&self) -> bool {
        self.0 == "no-cache"
    }
}

#[cfg(test)]
mod tests {
    use super::super::test_decode;
    use super::Pragma;

    #[test]
    fn no_cache_is_no_cache() {
        assert!(Pragma::no_cache().is_no_cache());
    }

    #[test]
    fn etc_is_not_no_cache() {
        let ext = test_decode::<Pragma>(&["dexter"]).unwrap();
        assert!(!ext.is_no_cache());
    }
}