Skip to main content

ntex_http/
header.rs

1//! Various http headers
2pub use crate::HeaderMap;
3#[doc(hidden)]
4pub use crate::map::{AsName, Either, GetAll, Iter, Value};
5pub use crate::value::{HeaderValue, InvalidHeaderValue, ToStrError};
6
7pub use http::header::{
8    ACCEPT, ACCEPT_CHARSET, ACCEPT_ENCODING, ACCEPT_LANGUAGE, ACCEPT_RANGES,
9    ACCESS_CONTROL_ALLOW_CREDENTIALS, ACCESS_CONTROL_ALLOW_HEADERS,
10    ACCESS_CONTROL_ALLOW_METHODS, ACCESS_CONTROL_ALLOW_ORIGIN,
11    ACCESS_CONTROL_EXPOSE_HEADERS, ACCESS_CONTROL_MAX_AGE, ACCESS_CONTROL_REQUEST_HEADERS,
12    ACCESS_CONTROL_REQUEST_METHOD, AGE, ALLOW, ALT_SVC, AUTHORIZATION, CACHE_CONTROL,
13    CONNECTION, CONTENT_DISPOSITION, CONTENT_ENCODING, CONTENT_LANGUAGE, CONTENT_LENGTH,
14    CONTENT_LOCATION, CONTENT_RANGE, CONTENT_SECURITY_POLICY,
15    CONTENT_SECURITY_POLICY_REPORT_ONLY, CONTENT_TYPE, COOKIE, DATE, DNT, ETAG, EXPECT,
16    EXPIRES, FORWARDED, FROM, HOST, IF_MATCH, IF_MODIFIED_SINCE, IF_NONE_MATCH, IF_RANGE,
17    IF_UNMODIFIED_SINCE, LAST_MODIFIED, LINK, LOCATION, MAX_FORWARDS, ORIGIN, PRAGMA,
18    PROXY_AUTHENTICATE, PROXY_AUTHORIZATION, PUBLIC_KEY_PINS, PUBLIC_KEY_PINS_REPORT_ONLY,
19    RANGE, REFERER, REFERRER_POLICY, REFRESH, RETRY_AFTER, SEC_WEBSOCKET_ACCEPT,
20    SEC_WEBSOCKET_EXTENSIONS, SEC_WEBSOCKET_KEY, SEC_WEBSOCKET_PROTOCOL,
21    SEC_WEBSOCKET_VERSION, SERVER, SET_COOKIE, STRICT_TRANSPORT_SECURITY, TE, TRAILER,
22    TRANSFER_ENCODING, UPGRADE, UPGRADE_INSECURE_REQUESTS, USER_AGENT, VARY, VIA, WARNING,
23    WWW_AUTHENTICATE, X_CONTENT_TYPE_OPTIONS, X_DNS_PREFETCH_CONTROL, X_FRAME_OPTIONS,
24    X_XSS_PROTECTION,
25};
26pub use http::header::{HeaderName, InvalidHeaderName};
27
28/// Represents supported types of content encodings
29#[derive(Copy, Clone, PartialEq, Eq, Debug)]
30pub enum ContentEncoding {
31    /// Automatically select encoding based on encoding negotiation
32    Auto,
33    /// A format using the Brotli algorithm
34    Br,
35    /// A format using the zlib structure with deflate algorithm
36    Deflate,
37    /// Gzip algorithm
38    Gzip,
39    /// Indicates the identity function (i.e. no compression, nor modification)
40    Identity,
41}
42
43impl ContentEncoding {
44    #[inline]
45    /// Is the content compressed?
46    pub fn is_compressed(self) -> bool {
47        !matches!(self, ContentEncoding::Identity | ContentEncoding::Auto)
48    }
49
50    #[inline]
51    /// Convert content encoding to string
52    pub fn as_str(self) -> &'static str {
53        match self {
54            ContentEncoding::Br => "br",
55            ContentEncoding::Gzip => "gzip",
56            ContentEncoding::Deflate => "deflate",
57            ContentEncoding::Identity | ContentEncoding::Auto => "identity",
58        }
59    }
60
61    #[inline]
62    /// default quality value
63    pub fn quality(self) -> f64 {
64        match self {
65            ContentEncoding::Br => 1.1,
66            ContentEncoding::Gzip => 1.0,
67            ContentEncoding::Deflate => 0.9,
68            ContentEncoding::Identity | ContentEncoding::Auto => 0.1,
69        }
70    }
71}
72
73impl<'a> From<&'a str> for ContentEncoding {
74    fn from(s: &'a str) -> ContentEncoding {
75        let s = s.trim();
76
77        if s.eq_ignore_ascii_case("br") {
78            ContentEncoding::Br
79        } else if s.eq_ignore_ascii_case("gzip") {
80            ContentEncoding::Gzip
81        } else if s.eq_ignore_ascii_case("deflate") {
82            ContentEncoding::Deflate
83        } else {
84            ContentEncoding::Identity
85        }
86    }
87}
88
89#[cfg(test)]
90mod tests {
91    use super::*;
92
93    #[test]
94    fn encoding() {
95        assert!(ContentEncoding::Br.is_compressed());
96        assert!(!ContentEncoding::Identity.is_compressed());
97        assert!(!ContentEncoding::Auto.is_compressed());
98        assert_eq!(format!("{:?}", ContentEncoding::Identity), "Identity");
99    }
100}