use bytes::BytesMut; use http::{HeaderMap, Method}; use crate::proto::{BodyLength, DecodedLength, MessageHead}; pub(crate) use self::conn::Conn; pub use self::decode::Decoder; pub(crate) use self::dispatch::Dispatcher; pub use self::encode::{EncodedBuf, Encoder}; pub use self::io::Cursor; //TODO: move out of h1::io pub use self::io::MINIMUM_MAX_BUFFER_SIZE; mod conn; pub(super) mod date; mod decode; pub(crate) mod dispatch; mod encode; mod io; mod role; pub(crate) type ServerTransaction = role::Server; pub(crate) type ClientTransaction = role::Client; pub(crate) trait Http1Transaction { type Incoming; type Outgoing: Default; const LOG: &'static str; fn parse(bytes: &mut BytesMut, ctx: ParseContext<'_>) -> ParseResult; fn encode(enc: Encode<'_, Self::Outgoing>, dst: &mut Vec) -> crate::Result; fn on_error(err: &crate::Error) -> Option>; fn is_client() -> bool { !Self::is_server() } fn is_server() -> bool { !Self::is_client() } fn should_error_on_parse_eof() -> bool { Self::is_client() } fn should_read_first() -> bool { Self::is_server() } fn update_date() {} } /// Result newtype for Http1Transaction::parse. pub(crate) type ParseResult = Result>, crate::error::Parse>; #[derive(Debug)] pub(crate) struct ParsedMessage { head: MessageHead, decode: DecodedLength, expect_continue: bool, keep_alive: bool, wants_upgrade: bool, } pub(crate) struct ParseContext<'a> { cached_headers: &'a mut Option, req_method: &'a mut Option, } /// Passed to Http1Transaction::encode pub(crate) struct Encode<'a, T> { head: &'a mut MessageHead, body: Option, keep_alive: bool, req_method: &'a mut Option, title_case_headers: bool, } /// Extra flags that a request "wants", like expect-continue or upgrades. #[derive(Clone, Copy, Debug)] struct Wants(u8); impl Wants { const EMPTY: Wants = Wants(0b00); const EXPECT: Wants = Wants(0b01); const UPGRADE: Wants = Wants(0b10); #[must_use] fn add(self, other: Wants) -> Wants { Wants(self.0 | other.0) } fn contains(&self, other: Wants) -> bool { (self.0 & other.0) == other.0 } }