leyline-http 0.1.0

HTTP client that mimics browsers on the wire
Documentation
use http::{HeaderName, HeaderValue};

#[test]
fn alt_svc_older_than_its_max_age_is_not_cached() {
    let session = crate::Session::builder().build().unwrap();
    let url = url::Url::parse("https://example.com/").unwrap();
    let headers = [
        (
            HeaderName::from_static("alt-svc"),
            HeaderValue::from_static("h3=\":443\"; ma=60"),
        ),
        (
            HeaderName::from_static("age"),
            HeaderValue::from_static("120"),
        ),
    ];
    session.note_alt_svc(&url, &headers);
    assert!(!session.inner.pool.knows_h3("example.com", 443));
}

fn noted(fields: &[(&'static str, &'static str)]) -> bool {
    let session = crate::Session::builder().build().unwrap();
    let url = url::Url::parse("https://example.com/").unwrap();
    let headers: Vec<(HeaderName, HeaderValue)> = fields
        .iter()
        .map(|(name, value)| {
            (
                HeaderName::from_static(name),
                HeaderValue::from_static(value),
            )
        })
        .collect();
    session.note_alt_svc(&url, &headers);
    session.inner.pool.knows_h3("example.com", 443)
}

#[test]
fn alt_svc_reads_the_first_age_of_a_list() {
    assert!(!noted(&[
        ("alt-svc", "h3=\":443\"; ma=60"),
        ("age", "100, 100"),
    ]));
}

#[test]
fn alt_svc_keeps_the_longest_matching_entry() {
    assert!(noted(&[(
        "alt-svc",
        "h3=\":443\"; ma=0, h3=\":443\"; ma=3600"
    )]));
}

#[test]
fn alt_svc_parses_each_field_line_alone() {
    assert!(!noted(&[
        ("alt-svc", "h3=\":443\"; ma=86400; x=\""),
        ("alt-svc", "clear"),
    ]));
}

#[test]
fn alt_svc_reads_ma_in_any_case() {
    assert!(!noted(&[("alt-svc", "h3=\":443\"; MA=0")]));
}

#[test]
fn alt_svc_clear_survives_non_ascii_bytes() {
    let session = crate::Session::builder().build().unwrap();
    let url = url::Url::parse("https://example.com/").unwrap();
    session.note_alt_svc(
        &url,
        &[(
            HeaderName::from_static("alt-svc"),
            HeaderValue::from_static("h3=\":443\"; ma=3600"),
        )],
    );
    session.note_alt_svc(
        &url,
        &[(
            HeaderName::from_static("alt-svc"),
            HeaderValue::from_bytes(b"clear, x=\"caf\xc3\xa9\"").unwrap(),
        )],
    );
    assert!(!session.inner.pool.knows_h3("example.com", 443));
}

#[test]
fn alt_svc_ignores_an_entry_with_a_malformed_ma() {
    assert!(!noted(&[(
        "alt-svc",
        "h3=\":443\"; ma=0, h3=\":443\"; ma=abc"
    )]));
}

#[test]
fn alt_svc_age_overflow_is_the_largest_age() {
    assert!(!noted(&[
        ("alt-svc", "h3=\":443\"; ma=4294967295"),
        ("age", "18446744073709551616"),
    ]));
}