from collections.abc import Mapping, Sequence
from io import BytesIO
from re import Pattern
from typing import Any

from waitress.adjustments import Adjustments
from waitress.receiver import ChunkedReceiver, FixedStreamReceiver
from waitress.utilities import Error

class ParsingError(Exception): ...
class TransferEncodingNotImplemented(Exception): ...

class HTTPRequestParser:
    completed: bool = ...
    empty: bool = ...
    expect_continue: bool = ...
    headers_finished: bool = ...
    header_plus: bytes = ...
    chunked: bool = ...
    content_length: int = ...
    header_bytes_received: int = ...
    body_bytes_received: int = ...
    body_rcv: ChunkedReceiver | FixedStreamReceiver | None = ...
    version: str = ...
    error: Error | None = ...
    connection_close: bool = ...
    headers: Mapping[str, str] = ...
    adj: Adjustments = ...
    def __init__(self, adj: Adjustments) -> None: ...
    def received(self, data: bytes) -> int: ...
    first_line: str = ...
    command: bytes = ...
    url_scheme: str = ...
    def parse_header(self, header_plus: bytes) -> None: ...
    def get_body_stream(self) -> BytesIO: ...
    def close(self) -> None: ...

def split_uri(uri: bytes) -> tuple[str, str, bytes, str, str]: ...
def get_header_lines(header: bytes) -> Sequence[bytes]: ...

first_line_re: Pattern[Any]

def crack_first_line(line: str) -> tuple[bytes, bytes, bytes]: ...
