Skip to content

testingrequired/http_message

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

46 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

http_message

Parse partial/non spec compliant HTTP messages.

Partial HTTP Message

A PartialHttpRequest contains the potential spans for method, uri, http_version, headers, and body. The HTTP message does not need to be spec compliant so things like http_version are optional.

use http_message::{
    error::Error,
    models::{HttpRequest, PartialHttpRequest},
    parse_partial_request,
};

fn main() {
    let partial: PartialHttpRequest<'_> =
        parse_partial_request("GET https://example.com\nx-key: 123").unwrap();

    assert_eq!(&Some(0..3), partial.method_span());
    assert_eq!(Some("GET"), partial.method_str());

    assert_eq!(&Some(4..23), partial.uri_span());
    assert_eq!(Some("https://example.com"), partial.uri_str());

    assert_eq!(&None, partial.http_version_span());
    assert_eq!(None, partial.http_version_str());

    assert_eq!(Some(&(24..34)), partial.header_span("x-key"));
    assert_eq!(Some("x-key: 123"), partial.header_str("x-key"));

    let request: Result<HttpRequest, Error> = partial.try_into();

    assert_eq!(Err(Error::missing_required("http_version")), request);
}

Parsed HTTP Message

A ParsedHttpRequest contains the spans for method, uri, http_version, headers, and body. The HTTP message does need to be spec compliant so things like http_version are required.

use http_message::{
    models::{HttpRequest, ParsedHttpRequest},
    parse_request,
};

fn main() {
    let parsed: ParsedHttpRequest<'_> =
        parse_request("GET https://example.com HTTP/1.1\nx-key: 123\n\n").unwrap();

    assert_eq!(&(0..3), parsed.method_span());
    assert_eq!("GET", parsed.method_str());

    assert_eq!(&(4..23), parsed.uri_span());
    assert_eq!("https://example.com", parsed.uri_str());

    assert_eq!(&(24..32), parsed.http_version_span());
    assert_eq!("HTTP/1.1", parsed.http_version_str());

    assert_eq!(Some(&(33..44)), parsed.header_span("x-key"));
    assert_eq!(Some("x-key: 123\n"), parsed.header_str("x-key"));

    let request: HttpRequest = parsed.into();

    assert_eq!(
        HttpRequest {
            uri: "https://example.com".into(),
            method: "GET".into(),
            http_version: "HTTP/1.1".into(),
            headers: vec![("x-key", "123").into()],
            body: None
        },
        request
    );
}

Verify

About

Parse partial/non spec compliant HTTP messages

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages