headers/common/
content_encoding.rs

1use self::sealed::AsCoding;
2use util::FlatCsv;
3use HeaderValue;
4
5/// `Content-Encoding` header, defined in
6/// [RFC7231](http://tools.ietf.org/html/rfc7231#section-3.1.2.2)
7///
8/// The `Content-Encoding` header field indicates what content codings
9/// have been applied to the representation, beyond those inherent in the
10/// media type, and thus what decoding mechanisms have to be applied in
11/// order to obtain data in the media type referenced by the Content-Type
12/// header field.  Content-Encoding is primarily used to allow a
13/// representation's data to be compressed without losing the identity of
14/// its underlying media type.
15///
16/// # ABNF
17///
18/// ```text
19/// Content-Encoding = 1#content-coding
20/// ```
21///
22/// # Example values
23///
24/// * `gzip`
25///
26/// # Examples
27///
28/// ```
29/// # extern crate headers;
30/// use headers::ContentEncoding;
31///
32/// let content_enc = ContentEncoding::gzip();
33/// ```
34#[derive(Clone, Debug)]
35pub struct ContentEncoding(FlatCsv);
36
37derive_header! {
38    ContentEncoding(_),
39    name: CONTENT_ENCODING
40}
41
42impl ContentEncoding {
43    /// A constructor to easily create a `Content-Encoding: gzip` header.
44    #[inline]
45    pub fn gzip() -> ContentEncoding {
46        ContentEncoding(HeaderValue::from_static("gzip").into())
47    }
48
49    /// Check if this header contains a given "coding".
50    ///
51    /// This can be used with these argument types:
52    ///
53    /// - `&str`
54    ///
55    /// # Example
56    ///
57    /// ```
58    /// # extern crate headers;
59    /// use headers::ContentEncoding;
60    ///
61    /// let content_enc = ContentEncoding::gzip();
62    ///
63    /// assert!(content_enc.contains("gzip"));
64    /// assert!(!content_enc.contains("br"));
65    /// ```
66    pub fn contains(&self, coding: impl AsCoding) -> bool {
67        let s = coding.as_coding();
68        self.0.iter().find(|&opt| opt == s).is_some()
69    }
70}
71
72mod sealed {
73    pub trait AsCoding: Sealed {}
74
75    pub trait Sealed {
76        fn as_coding(&self) -> &str;
77    }
78
79    impl<'a> AsCoding for &'a str {}
80
81    impl<'a> Sealed for &'a str {
82        fn as_coding(&self) -> &str {
83            *self
84        }
85    }
86}