sark-http 0.26.2

HTTP wire types, semantics, codecs, and ownership invariants for Sark
Documentation
use sark_http::h1::head::line::{Response, Version};

#[test]
fn borrows_reason() {
    let raw = b"HTTP/1.1 204 No Content\r\nDate: now\r\n\r\n";
    let line = (Response::parse(raw))
        .expect("complete response line must parse")
        .expect("complete response line must parse");

    assert!((line.version()) == (Version::Eleven));
    assert_eq!(line.status().as_u16(), 204);
    assert_eq!(line.reason(), b"No Content");
    assert_eq!(&raw[line.end()..], b"Date: now\r\n\r\n");
}

#[test]
fn keeps_prefixes_pending() {
    let raw = b"HTTP/1.0 599 extension\tstatus\r\n";
    for end in 0..raw.len() {
        assert!(
            matches!(Response::parse(&raw[..end]), Ok(None)),
            "prefix {end}"
        );
    }

    let line = (Response::parse(raw))
        .expect("complete response line must parse")
        .expect("complete response line must parse");
    assert!((line.version()) == (Version::Ten));
    assert_eq!(line.status().as_u16(), 599);
    assert_eq!(line.reason(), b"extension\tstatus");
}

#[test]
fn rejects_malformed() {
    for raw in [
        b"HTTP/2.0 200 OK\r\n".as_slice(),
        b"HTTP/1.1 099 Low\r\n",
        b"HTTP/1.1 600 High\r\n",
        b"HTTP/1.1 abc Nope\r\n",
        b"HTTP/1.1 200\r\n",
        b"HTTP/1.1 200 Bad\x7fReason\r\n",
        b"HTTP/1.1 200 OK\rx",
    ] {
        assert!(Response::parse(raw).is_err(), "{raw:?}");
    }
}