Struct ParserConfig
struct ParserConfig { ... }
Parser configuration.
Implementations
impl ParserConfig
fn allow_spaces_after_header_name_in_responses(self: &mut Self, value: bool) -> &mut SelfSets whether spaces and tabs should be allowed after header names in responses.
fn allow_multiple_spaces_in_request_line_delimiters(self: &mut Self, value: bool) -> &mut SelfSets whether multiple spaces are allowed as delimiters in request lines.
Background
The latest version of the HTTP/1.1 spec allows implementations to parse multiple whitespace characters in place of the
SPdelimiters in the request line, including:SP, HTAB, VT (%x0B), FF (%x0C), or bare CR
This option relaxes the parser to allow for multiple spaces, but does not allow the request line to contain the other mentioned whitespace characters.
fn multiple_spaces_in_request_line_delimiters_are_allowed(self: &Self) -> boolWhether multiple spaces are allowed as delimiters in request lines.
fn allow_multiple_spaces_in_response_status_delimiters(self: &mut Self, value: bool) -> &mut SelfSets whether multiple spaces are allowed as delimiters in response status lines.
Background
The latest version of the HTTP/1.1 spec allows implementations to parse multiple whitespace characters in place of the
SPdelimiters in the response status line, including:SP, HTAB, VT (%x0B), FF (%x0C), or bare CR
This option relaxes the parser to allow for multiple spaces, but does not allow the status line to contain the other mentioned whitespace characters.
fn multiple_spaces_in_response_status_delimiters_are_allowed(self: &Self) -> boolWhether multiple spaces are allowed as delimiters in response status lines.
fn allow_obsolete_multiline_headers_in_responses(self: &mut Self, value: bool) -> &mut SelfSets whether obsolete multiline headers should be allowed.
This is an obsolete part of HTTP/1. Use at your own risk. If you are building an HTTP library, the newlines (
\rand\n) should be replaced by spaces before handing the header value to the user.Example
let buf = b"HTTP/1.1 200 OK\r\nFolded-Header: hello\r\n there \r\n\r\n"; let mut headers = ; let mut response = new; let res = default .allow_obsolete_multiline_headers_in_responses .parse_response; assert_eq!; assert_eq!; assert_eq!; assert_eq!;fn obsolete_multiline_headers_in_responses_are_allowed(self: &Self) -> boolWhether obsolete multiline headers should be allowed.
fn allow_space_before_first_header_name(self: &mut Self, value: bool) -> &mut SelfSets whether white space before the first header is allowed
This is not allowed by spec but some browsers ignore it. So this an option for compatibility. See https://github.com/curl/curl/issues/11605 for reference
Example
let buf = b"HTTP/1.1 200 OK\r\n Space-Before-Header: hello there\r\n\r\n"; let mut headers = ; let mut response = new; let result = default .allow_space_before_first_header_name .parse_response; assert_eq!; assert_eq!; assert_eq!; assert_eq!; assert_eq!; assert_eq!; assert_eq!;fn space_before_first_header_name_are_allowed(self: &Self) -> boolWhether white space before first header is allowed or not
fn parse_request<'buf>(self: &Self, request: &mut Request<'_, 'buf>, buf: &'buf [u8]) -> Result<usize>Parses a request with the given config.
fn parse_request_with_uninit_headers<'headers, 'buf>(self: &Self, request: &mut Request<'headers, 'buf>, buf: &'buf [u8], headers: &'headers mut [MaybeUninit<Header<'buf>>]) -> Result<usize>Parses a request with the given config and buffer for headers
fn ignore_invalid_headers_in_responses(self: &mut Self, value: bool) -> &mut SelfSets whether invalid header lines should be silently ignored in responses.
This mimicks the behaviour of major browsers. You probably don't want this. You should only want this if you are implementing a proxy whose main purpose is to sit in front of browsers whose users access arbitrary content which may be malformed, and they expect everything that works without the proxy to keep working with the proxy.
This option will prevent
ParserConfig::parse_responsefrom returning an error encountered when parsing a header, except if the error was caused by the character NUL (ASCII code 0), as Chrome specifically always reject those, or if the error was caused by a lone character\r, as Firefox and Chrome behave differently in that case.The ignorable errors are:
- empty header names;
- characters that are not allowed in header names, except for
\0and\r; - when
allow_spaces_after_header_name_in_responsesis not enabled, spaces and tabs between the header name and the colon; - missing colon between header name and value;
- when
allow_obsolete_multiline_headers_in_responsesis not enabled, headers using obsolete line folding. - characters that are not allowed in header values except for
\0and\r.
If an ignorable error is encountered, the parser tries to find the next line in the input to resume parsing the rest of the headers. As lines contributing to a header using obsolete line folding always start with whitespace, those will be ignored too. An error will be emitted nonetheless if it finds
\0or a lone\rwhile looking for the next line.fn ignore_invalid_headers_in_requests(self: &mut Self, value: bool) -> &mut SelfSets whether invalid header lines should be silently ignored in requests.
fn parse_response<'buf>(self: &Self, response: &mut Response<'_, 'buf>, buf: &'buf [u8]) -> Result<usize>Parses a response with the given config.
fn parse_response_with_uninit_headers<'headers, 'buf>(self: &Self, response: &mut Response<'headers, 'buf>, buf: &'buf [u8], headers: &'headers mut [MaybeUninit<Header<'buf>>]) -> Result<usize>Parses a response with the given config and buffer for headers
impl Clone for ParserConfig
fn clone(self: &Self) -> ParserConfig
impl Debug for ParserConfig
fn fmt(self: &Self, f: &mut Formatter<'_>) -> Result
impl Default for ParserConfig
fn default() -> ParserConfig
impl Freeze for ParserConfig
impl RefUnwindSafe for ParserConfig
impl Send for ParserConfig
impl Sync for ParserConfig
impl Unpin for ParserConfig
impl UnsafeUnpin for ParserConfig
impl UnwindSafe for ParserConfig
impl<T> Any for ParserConfig
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for ParserConfig
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for ParserConfig
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> CloneToUninit for ParserConfig
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)
impl<T> From for ParserConfig
fn from(t: T) -> TReturns the argument unchanged.
impl<T> ToOwned for ParserConfig
fn to_owned(self: &Self) -> Tfn clone_into(self: &Self, target: &mut T)
impl<T, U> Into for ParserConfig
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for ParserConfig
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for ParserConfig
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>