static_web_server/headers_ext/
accept_encoding.rs1use headers::{Error, Header};
6use hyper::header::{HeaderName, HeaderValue, ACCEPT_ENCODING};
7
8use super::{ContentCoding, QualityValue};
9
10#[derive(Clone, Debug)]
31pub(crate) struct AcceptEncoding(QualityValue);
32
33impl Header for AcceptEncoding {
34 fn name() -> &'static HeaderName {
35 &ACCEPT_ENCODING
36 }
37
38 fn decode<'i, I>(values: &mut I) -> Result<Self, Error>
39 where
40 I: Iterator<Item = &'i HeaderValue>,
41 {
42 QualityValue::try_from_values(values).map(Self)
43 }
44
45 fn encode<E: Extend<HeaderValue>>(&self, values: &mut E) {
46 values.extend(std::iter::once((&self.0).into()))
47 }
48}
49
50impl AcceptEncoding {
51 pub(crate) fn sorted_encodings(&self) -> impl Iterator<Item = ContentCoding> + '_ {
53 self.0.iter().map(ContentCoding::from)
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[test]
62 fn from_static() {
63 let val = HeaderValue::from_static("deflate, zstd;q=0.7, gzip;q=1.0, br;q=0.9");
64 let accept_enc = AcceptEncoding(val.into());
65
66 let mut encodings = accept_enc.sorted_encodings();
67 assert_eq!(encodings.next(), Some(ContentCoding::DEFLATE));
68 assert_eq!(encodings.next(), Some(ContentCoding::GZIP));
69 assert_eq!(encodings.next(), Some(ContentCoding::BROTLI));
70 assert_eq!(encodings.next(), Some(ContentCoding::ZSTD));
71 assert_eq!(encodings.next(), None);
72 }
73}