accept-encoding-fork 0.2.0-alpha.3

Determine the best encoding possible from an Accept-Encoding HTTP header.
Documentation
extern crate accept_encoding;
extern crate failure;

use accept_encoding::Encoding;
use failure::Error;
use http::header::{HeaderMap, HeaderValue, ACCEPT_ENCODING};

#[test]
fn single_encoding() -> Result<(), Error> {
    let mut headers = HeaderMap::new();
    headers.insert(ACCEPT_ENCODING, HeaderValue::from_str("gzip")?);

    let encoding = accept_encoding::parse(&headers)?.unwrap();
    assert_eq!(encoding, Encoding::Gzip);

    Ok(())
}

#[test]
fn multiple_encodings() -> Result<(), Error> {
    let mut headers = HeaderMap::new();
    headers.insert(ACCEPT_ENCODING, HeaderValue::from_str("gzip, deflate, br")?);

    let encoding = accept_encoding::parse(&headers)?.unwrap();
    assert_eq!(encoding, Encoding::Gzip);

    Ok(())
}

#[test]
fn single_encoding_with_qval() -> Result<(), Error> {
    let mut headers = HeaderMap::new();
    headers.insert(ACCEPT_ENCODING, HeaderValue::from_str("deflate;q=1.0")?);

    let encoding = accept_encoding::parse(&headers)?.unwrap();
    assert_eq!(encoding, Encoding::Deflate);

    Ok(())
}

#[test]
fn multiple_encodings_with_qval_1() -> Result<(), Error> {
    let mut headers = HeaderMap::new();
    headers.insert(
        ACCEPT_ENCODING,
        HeaderValue::from_str("deflate, gzip;q=1.0, *;q=0.5")?,
    );

    let encoding = accept_encoding::parse(&headers)?.unwrap();
    assert_eq!(encoding, Encoding::Deflate);

    Ok(())
}

#[test]
fn multiple_encodings_with_qval_2() -> Result<(), Error> {
    let mut headers = HeaderMap::new();
    headers.insert(
        ACCEPT_ENCODING,
        HeaderValue::from_str("gzip;q=0.5, deflate;q=1.0, *;q=0.5")?,
    );

    let encoding = accept_encoding::parse(&headers)?.unwrap();
    assert_eq!(encoding, Encoding::Deflate);

    Ok(())
}

#[test]
fn multiple_encodings_with_qval_3() -> Result<(), Error> {
    let mut headers = HeaderMap::new();
    headers.insert(
        ACCEPT_ENCODING,
        HeaderValue::from_str("gzip;q=0.5, deflate;q=0.75, *;q=1.0")?,
    );

    let encoding = accept_encoding::parse(&headers)?;
    assert!(encoding.is_none());

    Ok(())
}

#[test]
fn list_encodings() -> Result<(), Error> {
    use accept_encoding::Encoding;

    let mut headers = HeaderMap::new();
    headers.insert(
        ACCEPT_ENCODING,
        HeaderValue::from_str("zstd;q=1.0, deflate;q=0.8, br;q=0.9")?,
    );

    let encodings = accept_encoding::encodings(&headers)?;
    assert_eq!(encodings[0], (Some(Encoding::Zstd), 1.0));
    assert_eq!(encodings[1], (Some(Encoding::Deflate), 0.8));
    assert_eq!(encodings[2], (Some(Encoding::Brotli), 0.9));
    Ok(())
}

#[test]
fn list_encodings_ignore_unknown() -> Result<(), Error> {
    use accept_encoding::Encoding;

    let mut headers = HeaderMap::new();
    headers.insert(
        ACCEPT_ENCODING,
        HeaderValue::from_str("zstd;q=1.0, unknown;q=0.8, br;q=0.9")?,
    );

    let encodings = accept_encoding::encodings(&headers)?;
    assert_eq!(encodings[0], (Some(Encoding::Zstd), 1.0));
    assert_eq!(encodings[1], (Some(Encoding::Brotli), 0.9));
    Ok(())
}