accept_encoding/
lib.rs

1#![forbid(unsafe_code, future_incompatible)]
2#![forbid(rust_2018_idioms, rust_2018_compatibility)]
3#![deny(missing_debug_implementations, bad_style)]
4#![deny(missing_docs)]
5#![cfg_attr(test, deny(warnings))]
6
7//! ## Example
8//! ```rust
9//! # use failure::Error;
10//! use http::header::{HeaderMap, HeaderValue, ACCEPT_ENCODING};
11//!
12//! # fn main () -> Result<(), failure::Error> {
13//! let mut headers = HeaderMap::new();
14//! headers.insert(ACCEPT_ENCODING, HeaderValue::from_str("gzip, deflate, br")?);
15//!
16//! let encoding = accept_encoding::parse(&headers)?;
17//! assert!(encoding.is_brotli());
18//! # Ok(())}
19//! ```
20
21mod error;
22
23use derive_is_enum_variant::is_enum_variant;
24use http::header::{ACCEPT_ENCODING, HeaderMap};
25use failure::{ResultExt};
26pub use crate::error::{Error, Result, ErrorKind};
27
28/// Encoding levels.
29#[derive(Debug, Clone, is_enum_variant)]
30pub enum Encoding {
31  /// Gzip is the best encoding present.
32  Gzip,
33  /// Deflate is the best encoding present.
34  Deflate,
35  /// Brotli is the best encoding is present.
36  Brotli,
37  /// No encoding is present.
38  None,
39}
40
41/// Parse a set of HTTP headers into an `Encoding`.
42pub fn parse(headers: &HeaderMap) -> Result<Encoding> {
43  let header = match headers.get(ACCEPT_ENCODING) {
44    Some(header) => header,
45    None => return Ok(Encoding::None),
46  };
47
48  let string = header.to_str().context(ErrorKind::InvalidEncoding)?;
49
50  if string.contains("br") {
51    Ok(Encoding::Brotli)
52  } else if string.contains("deflate") {
53    Ok(Encoding::Deflate)
54  } else if string.contains("gzip") {
55    Ok(Encoding::Gzip)
56  } else {
57    Err(ErrorKind::UnknownEncoding)?
58  }
59}