leyline-http 0.1.3

HTTP client that mimics browsers on the wire
Documentation
use crate::Session;

#[tokio::test]
async fn crlf_header_fails_before_io() {
    let err = Session::builder()
        .build()
        .unwrap()
        .get("https://example.test/")
        .header("x-a", "1\r\nHost: evil")
        .send()
        .await
        .unwrap_err();
    assert!(
        err.to_string().contains("header value"),
        "unexpected: {err}"
    );
}

#[tokio::test]
async fn crlf_url_fails_before_io() {
    let err = Session::builder()
        .build()
        .unwrap()
        .request(http::Method::GET, "https://example.test/\r\nHost: evil")
        .send()
        .await
        .unwrap_err();
    assert!(err.to_string().contains("URL"), "unexpected: {err}");
}

#[test]
fn content_type_infers_the_preset_on_the_builder_path() {
    use crate::profile::Preset;
    let session = Session::browser(crate::Browser::default());
    let mut json = session
        .post("https://example.test/")
        .header("content-type", "application/json")
        .body("{}");
    json.prepare().unwrap();
    assert_eq!(json.preset, Some(Preset::Xhr));

    let mut form = session
        .post("https://example.test/")
        .header("content-type", "application/x-www-form-urlencoded")
        .body("a=1");
    form.prepare().unwrap();
    assert_eq!(form.preset, Some(Preset::Form));

    let mut get = session
        .get("https://example.test/")
        .header("content-type", "application/json");
    get.prepare().unwrap();
    assert_eq!(get.preset, Some(Preset::Navigate));

    let mut pinned = session
        .post("https://example.test/")
        .preset(Preset::Navigate)
        .header("content-type", "application/json");
    pinned.prepare().unwrap();
    assert_eq!(pinned.preset, Some(Preset::Navigate));
}