Skip to main content

rama_http_headers/encoding/
accept_encoding.rs

1use super::SupportedEncodings;
2use rama_http_types::HeaderValue;
3
4/// TODO: support this as typed header...
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub struct AcceptEncoding {
8    gzip: bool,
9    deflate: bool,
10    br: bool,
11    zstd: bool,
12}
13
14impl AcceptEncoding {
15    #[must_use]
16    pub fn new_gzip() -> Self {
17        Self {
18            gzip: true,
19            deflate: false,
20            br: false,
21            zstd: false,
22        }
23    }
24
25    #[must_use]
26    pub fn new_deflate() -> Self {
27        Self {
28            gzip: false,
29            deflate: true,
30            br: false,
31            zstd: false,
32        }
33    }
34
35    #[must_use]
36    pub fn new_br() -> Self {
37        Self {
38            gzip: false,
39            deflate: false,
40            br: true,
41            zstd: false,
42        }
43    }
44
45    #[must_use]
46    pub fn new_zstd() -> Self {
47        Self {
48            gzip: false,
49            deflate: false,
50            br: false,
51            zstd: true,
52        }
53    }
54
55    #[must_use]
56    pub fn maybe_to_header_value(self) -> Option<HeaderValue> {
57        let accept = match (self.gzip(), self.deflate(), self.br(), self.zstd()) {
58            (true, true, true, false) => "gzip,deflate,br",
59            (true, true, false, false) => "gzip,deflate",
60            (true, false, true, false) => "gzip,br",
61            (true, false, false, false) => "gzip",
62            (false, true, true, false) => "deflate,br",
63            (false, true, false, false) => "deflate",
64            (false, false, true, false) => "br",
65            (true, true, true, true) => "zstd,gzip,deflate,br",
66            (true, true, false, true) => "zstd,gzip,deflate",
67            (true, false, true, true) => "zstd,gzip,br",
68            (true, false, false, true) => "zstd,gzip",
69            (false, true, true, true) => "zstd,deflate,br",
70            (false, true, false, true) => "zstd,deflate",
71            (false, false, true, true) => "zstd,br",
72            (false, false, false, true) => "zstd",
73            (false, false, false, false) => return None,
74        };
75        Some(HeaderValue::from_static(accept))
76    }
77
78    rama_utils::macros::generate_set_and_with! {
79        pub fn gzip(mut self, enable: bool) -> Self {
80            self.gzip = enable;
81            self
82        }
83    }
84
85    rama_utils::macros::generate_set_and_with! {
86        pub fn deflate(mut self, enable: bool) -> Self {
87            self.deflate = enable;
88            self
89        }
90    }
91
92    rama_utils::macros::generate_set_and_with! {
93        pub fn br(mut self, enable: bool) -> Self {
94            self.br = enable;
95            self
96        }
97    }
98
99    rama_utils::macros::generate_set_and_with! {
100        pub fn zstd(mut self, enable: bool) -> Self {
101            self.zstd = enable;
102            self
103        }
104    }
105}
106
107impl SupportedEncodings for AcceptEncoding {
108    fn gzip(&self) -> bool {
109        self.gzip
110    }
111
112    fn deflate(&self) -> bool {
113        self.deflate
114    }
115
116    fn br(&self) -> bool {
117        self.br
118    }
119
120    fn zstd(&self) -> bool {
121        self.zstd
122    }
123}
124
125impl Default for AcceptEncoding {
126    fn default() -> Self {
127        Self {
128            gzip: true,
129            deflate: true,
130            br: true,
131            zstd: true,
132        }
133    }
134}