--- /dev/null
+from _typeshed.wsgi import WSGIEnvironment
+from typing import IO, Any, Callable, Generator, Iterable, Mapping, NoReturn, Optional, Protocol, Text, Tuple, TypeVar
+
+from .datastructures import Headers
+
+_Dict = Any
+_ParseFunc = Callable[[IO[bytes], str, Optional[int], Mapping[str, str]], Tuple[IO[bytes], _Dict, _Dict]]
+
+_F = TypeVar("_F", bound=Callable[..., Any])
+
+class _StreamFactory(Protocol):
+ def __call__(
+ self, total_content_length: int | None, filename: str, content_type: str, content_length: int | None = ...
+ ) -> IO[bytes]: ...
+
+def default_stream_factory(
+ total_content_length: int | None, filename: str, content_type: str, content_length: int | None = ...
+) -> IO[bytes]: ...
+def parse_form_data(
+ environ: WSGIEnvironment,
+ stream_factory: _StreamFactory | None = ...,
+ charset: Text = ...,
+ errors: Text = ...,
+ max_form_memory_size: int | None = ...,
+ max_content_length: int | None = ...,
+ cls: Callable[[], _Dict] | None = ...,
+ silent: bool = ...,
+) -> tuple[IO[bytes], _Dict, _Dict]: ...
+def exhaust_stream(f: _F) -> _F: ...
+
+class FormDataParser(object):
+ stream_factory: _StreamFactory
+ charset: Text
+ errors: Text
+ max_form_memory_size: int | None
+ max_content_length: int | None
+ cls: Callable[[], _Dict]
+ silent: bool
+ def __init__(
+ self,
+ stream_factory: _StreamFactory | None = ...,
+ charset: Text = ...,
+ errors: Text = ...,
+ max_form_memory_size: int | None = ...,
+ max_content_length: int | None = ...,
+ cls: Callable[[], _Dict] | None = ...,
+ silent: bool = ...,
+ ) -> None: ...
+ def get_parse_func(self, mimetype: str, options: Any) -> _ParseFunc | None: ...
+ def parse_from_environ(self, environ: WSGIEnvironment) -> tuple[IO[bytes], _Dict, _Dict]: ...
+ def parse(
+ self, stream: IO[bytes], mimetype: Text, content_length: int | None, options: Mapping[str, str] | None = ...
+ ) -> tuple[IO[bytes], _Dict, _Dict]: ...
+ parse_functions: dict[Text, _ParseFunc]
+
+def is_valid_multipart_boundary(boundary: str) -> bool: ...
+def parse_multipart_headers(iterable: Iterable[Text | bytes]) -> Headers: ...
+
+class MultiPartParser(object):
+ charset: Text
+ errors: Text
+ max_form_memory_size: int | None
+ stream_factory: _StreamFactory
+ cls: Callable[[], _Dict]
+ buffer_size: int
+ def __init__(
+ self,
+ stream_factory: _StreamFactory | None = ...,
+ charset: Text = ...,
+ errors: Text = ...,
+ max_form_memory_size: int | None = ...,
+ cls: Callable[[], _Dict] | None = ...,
+ buffer_size: int = ...,
+ ) -> None: ...
+ def fail(self, message: Text) -> NoReturn: ...
+ def get_part_encoding(self, headers: Mapping[str, str]) -> str | None: ...
+ def get_part_charset(self, headers: Mapping[str, str]) -> Text: ...
+ def start_file_streaming(
+ self, filename: Text | bytes, headers: Mapping[str, str], total_content_length: int | None
+ ) -> tuple[Text, IO[bytes]]: ...
+ def in_memory_threshold_reached(self, bytes: Any) -> NoReturn: ...
+ def validate_boundary(self, boundary: str | None) -> None: ...
+ def parse_lines(
+ self, file: Any, boundary: bytes, content_length: int, cap_at_buffer: bool = ...
+ ) -> Generator[tuple[str, Any], None, None]: ...
+ def parse_parts(self, file: Any, boundary: bytes, content_length: int) -> Generator[tuple[str, Any], None, None]: ...
+ def parse(self, file: Any, boundary: bytes, content_length: int) -> tuple[_Dict, _Dict]: ...