leyline-http 0.1.5

HTTP client that impersonates Chrome, Firefox, and Safari on the wire: TLS (JA3/JA4), HTTP/2, and HTTP/3 fingerprints
Documentation
use super::*;

#[test]
fn header_tokens() {
    assert_eq!(ContentEncoding::Gzip.header_value(), "gzip");
    assert_eq!(ContentEncoding::Brotli.header_value(), "br");
    assert_eq!(ContentEncoding::Zstd.header_value(), "zstd");
    assert_eq!(ContentEncoding::Deflate.header_value(), "deflate");
}

#[cfg(any(
    feature = "compression-gzip",
    feature = "compression-brotli",
    feature = "compression-zstd",
    feature = "compression-deflate"
))]
fn sample() -> Vec<u8> {
    b"the quick brown fox jumps over the lazy dog. ".repeat(16)
}

#[cfg(feature = "compression-gzip")]
#[test]
fn gzip_roundtrips_and_shrinks() {
    use std::io::Read;
    let data = sample();
    let enc = ContentEncoding::Gzip.encode(&data).unwrap();
    assert!(enc.len() < data.len());
    let mut out = Vec::new();
    flate2::read::GzDecoder::new(&enc[..])
        .read_to_end(&mut out)
        .unwrap();
    assert_eq!(out, data);
}

#[cfg(feature = "compression-brotli")]
#[test]
fn brotli_roundtrips_and_shrinks() {
    use std::io::Read;
    let data = sample();
    let enc = ContentEncoding::Brotli.encode(&data).unwrap();
    assert!(enc.len() < data.len());
    let mut out = Vec::new();
    brotli::Decompressor::new(&enc[..], 4096)
        .read_to_end(&mut out)
        .unwrap();
    assert_eq!(out, data);
}

#[cfg(feature = "compression-zstd")]
#[test]
fn zstd_roundtrips_and_shrinks() {
    let data = sample();
    let enc = ContentEncoding::Zstd.encode(&data).unwrap();
    assert!(enc.len() < data.len());
    let out = zstd::decode_all(&enc[..]).unwrap();
    assert_eq!(out, data);
}

#[cfg(feature = "compression-deflate")]
#[test]
fn deflate_roundtrips_zlib_wrapped() {
    use std::io::Read;
    let data = sample();
    let enc = ContentEncoding::Deflate.encode(&data).unwrap();
    assert!(enc.len() < data.len());
    assert_eq!(enc.first(), Some(&0x78));
    let mut out = Vec::new();
    flate2::read::ZlibDecoder::new(&enc[..])
        .read_to_end(&mut out)
        .unwrap();
    assert_eq!(out, data);
}

#[cfg(not(all(
    feature = "compression-gzip",
    feature = "compression-brotli",
    feature = "compression-zstd",
    feature = "compression-deflate"
)))]
#[test]
fn disabled_codecs_return_body_errors() {
    for (encoding, enabled, feature) in [
        (
            ContentEncoding::Gzip,
            cfg!(feature = "compression-gzip"),
            "compression-gzip",
        ),
        (
            ContentEncoding::Brotli,
            cfg!(feature = "compression-brotli"),
            "compression-brotli",
        ),
        (
            ContentEncoding::Zstd,
            cfg!(feature = "compression-zstd"),
            "compression-zstd",
        ),
        (
            ContentEncoding::Deflate,
            cfg!(feature = "compression-deflate"),
            "compression-deflate",
        ),
    ] {
        if !enabled {
            let error = encoding
                .encode(b"request body")
                .expect_err("disabled codec must fail");
            assert_eq!(error.kind(), crate::core::Kind::Body);
            assert!(error.message().expect("feature guidance").contains(feature));
        }
    }
}