from io import BytesIO
from typing import Any, Dict, Iterator, List, Optional, Tuple, Union, Callable

from django.contrib.sessions.backends.db import SessionStore
from django.core.handlers.wsgi import WSGIRequest
from django.utils.datastructures import MultiValueDict

RAISE_ERROR: Any
host_validation_re: Any

class UnreadablePostError(IOError): ...
class RawPostDataException(Exception): ...

class HttpRequest:
    csrf_cookie_needs_reset: bool
    csrf_processing_done: bool
    get_host: Callable
    sensitive_post_parameters: str
    session: SessionStore
    GET: Union[Dict[str, str], QueryDict] = ...
    POST: Union[Dict[str, str], QueryDict] = ...
    COOKIES: Dict[str, str] = ...
    META: Dict[str, Union[int, str]] = ...
    FILES: MultiValueDict = ...
    path: str = ...
    path_info: str = ...
    method: Optional[str] = ...
    resolver_match: None = ...
    content_type: None = ...
    content_params: None = ...
    def __init__(self) -> None: ...
    def get_host(self) -> str: ...
    def get_port(self) -> str: ...
    def get_full_path(self, force_append_slash: bool = ...) -> str: ...
    def get_full_path_info(self, force_append_slash: bool = ...) -> str: ...
    def get_signed_cookie(
        self,
        key: str,
        default: Any = ...,
        salt: str = ...,
        max_age: Optional[int] = ...,
    ) -> Optional[str]: ...
    def get_raw_uri(self) -> str: ...
    def build_absolute_uri(self, location: Optional[str] = ...) -> str: ...
    @property
    def scheme(self) -> Optional[str]: ...
    def is_secure(self) -> bool: ...
    def is_ajax(self) -> bool: ...
    @property
    def encoding(self): ...
    @encoding.setter
    def encoding(self, val: Any) -> None: ...
    @property
    def upload_handlers(self): ...
    @upload_handlers.setter
    def upload_handlers(self, upload_handlers: Any) -> None: ...
    upload_handlers: Any = ...
    def parse_file_upload(
        self, META: Dict[str, Any], post_data: Union[BytesIO, WSGIRequest]
    ) -> Tuple[QueryDict, MultiValueDict]: ...
    @property
    def body(self) -> bytes: ...
    def close(self) -> None: ...
    def read(self, *args: Any, **kwargs: Any) -> bytes: ...
    def readline(self, *args: Any, **kwargs: Any) -> bytes: ...
    def __iter__(self) -> Iterator[bytes]: ...
    def xreadlines(self) -> None: ...
    def readlines(self): ...

class QueryDict(MultiValueDict):
    encoding: Any = ...
    def __init__(
        self,
        query_string: Optional[Union[bytes, str]] = ...,
        mutable: bool = ...,
        encoding: Optional[str] = ...,
    ) -> None: ...
    @classmethod
    def fromkeys(
        cls,
        iterable: Union[List[bytes], List[str], int, str],
        value: Union[bytes, str] = ...,
        mutable: bool = ...,
        encoding: Optional[str] = ...,
    ) -> QueryDict: ...
    @property
    def encoding(self): ...
    @encoding.setter
    def encoding(self, value: Any) -> None: ...
    def __setitem__(
        self, key: str, value: Optional[Union[int, str]]
    ) -> None: ...
    def __delitem__(self, key: str) -> None: ...
    def __copy__(self) -> QueryDict: ...
    def __deepcopy__(self, memo: Dict[Any, Any]) -> QueryDict: ...
    def setlist(self, key: str, list_: List[str]) -> None: ...
    def setlistdefault(
        self, key: str, default_list: None = ...
    ) -> List[str]: ...
    def appendlist(
        self, key: Union[bytes, str], value: Union[List[str], bytes, str]
    ) -> None: ...
    def pop(self, key: str, *args: Any) -> Optional[Union[List[str], str]]: ...
    def popitem(self) -> Any: ...
    def clear(self) -> None: ...
    def setdefault(self, key: str, default: str = ...) -> str: ...
    def copy(self) -> QueryDict: ...
    def urlencode(self, safe: Optional[str] = ...) -> str: ...

def bytes_to_text(
    s: Optional[Union[bytes, int, str]], encoding: str
) -> Optional[Union[int, str]]: ...
def split_domain_port(host: str) -> Tuple[str, str]: ...
def validate_host(host: str, allowed_hosts: Union[List[str], str]) -> bool: ...
