#![doc = include_str!("../readme.md")]
#![forbid(unsafe_code)]
mod client;
mod error;
mod input;
#[cfg(any(test, fuzzing))]
mod oracle;
mod output;
mod parse;
mod wire;
pub use client::{RequestWriter, ResponseReader};
pub use error::Error;
pub use input::{Exchange, IncomingBody, RequestReader};
pub use output::{InterimWriter, ResponseWriter};
#[cfg(fuzzing)]
#[doc(hidden)]
pub fn fuzz_request_head(bytes: &[u8]) {
oracle::compare(bytes, 8);
}
#[cfg(fuzzing)]
#[doc(hidden)]
pub fn fuzz_response_head(bytes: &[u8]) {
oracle::compare_response(bytes, 8);
}
#[cfg(fuzzing)]
#[doc(hidden)]
pub fn fuzz_trailers(bytes: &[u8]) {
oracle::compare_trailers(bytes, 8);
}
#[derive(Clone, Debug)]
pub struct Options {
pub max_head_bytes: usize,
pub max_fields: usize,
pub max_chunk_line_bytes: usize,
pub read_size: usize,
}
impl Default for Options {
fn default() -> Self {
Self {
max_head_bytes: 32 * 1024,
max_fields: 100,
max_chunk_line_bytes: 4096,
read_size: 16 * 1024,
}
}
}
impl Options {
pub fn validate(&self) -> Result<(), Error> {
if self.max_head_bytes < 4
|| self.max_fields == 0
|| self.max_chunk_line_bytes < 2
|| self.read_size == 0
{
return Err(Error::Invalid("invalid HTTP/1 limits"));
}
Ok(())
}
}