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 encode_indexed_method_get() {
    let mut enc = Encoder::new();
    let block = enc.encode_header_block(&[(":method", "GET")]);
    assert_eq!(block, vec![0x82]);
}

#[test]
fn encode_indexed_path_root() {
    let mut enc = Encoder::new();
    let block = enc.encode_header_block(&[(":path", "/")]);
    assert_eq!(block, vec![0x84]);
}

#[test]
fn encode_indexed_scheme_https() {
    let mut enc = Encoder::new();
    let block = enc.encode_header_block(&[(":scheme", "https")]);
    assert_eq!(block, vec![0x87]);
}

#[test]
fn encode_literal_with_indexing() {
    let mut enc = Encoder::new();
    let block = enc.encode_header_block(&[("custom-key", "custom-value")]);
    assert_eq!(block[0], 0x40);
    assert!(!block.is_empty());
    assert_eq!(enc.dynamic.len(), 1);
}

#[test]
fn second_request_uses_dynamic_table() {
    let mut enc = Encoder::new();

    let _block1 = enc.encode_header_block(&[("x-custom", "value1")]);
    assert_eq!(enc.dynamic.len(), 1);

    let block2 = enc.encode_header_block(&[("x-custom", "value2")]);
    assert_ne!(block2[0], 0x40);
}

#[test]
fn uppercase_name_encoded_as_lowercase() {
    let mut mixed = Encoder::new();
    let mixed_block = mixed.encode_header_block(&[("X-Extra", "val")]);

    let mut lower = Encoder::new();
    let lower_block = lower.encode_header_block(&[("x-extra", "val")]);

    assert_eq!(mixed_block, lower_block);
    assert_eq!(mixed.dynamic.get(0).unwrap().0, "x-extra");
}