Skip to main content

parse_request_head

Function parse_request_head 

Source
pub fn parse_request_head<'a>(
    input: &'a [u8],
    limits: &Limits,
    fields: &'a mut [FieldSpan],
) -> Result<Parsed<ParsedRequest<'a>>, HttpError>
Expand description

Parses one request head from the start of input, with exactly the rules and budgets of ServerConn (the same scanner and interpretation code), writing the field records into fields. Allocates nothing.

It is stateless: given more input after Partial, it parses again from the start. A caller that receives a head in many small pieces and needs linear total work should use ServerConn, which resumes where it stopped. A head with more fields than fields holds is HttpError::TooManyHeaders (as is one over Limits::max_headers).

§Errors

Every request parse error ServerConn::poll can return for a head (UnexpectedEof aside: running out of input is Partial here).

§Examples

use http_net::{FieldSpan, Limits, Parsed, parse_request_head};

let input = b"POST /notes HTTP/1.1\r\nHost: a\r\nContent-Length: 5\r\n\r\nhello";
let mut fields = [FieldSpan::default(); 32];
let Parsed::Complete { head, len } = parse_request_head(input, &Limits::new(), &mut fields)? else {
    panic!("incomplete");
};
let req = head.view();
assert_eq!(req.path(), "/notes");
assert_eq!(req.content_length(), Some(5));
assert_eq!(&input[len..], b"hello");