from __future__ import annotations
from typing import Any
from .base import BaseClient
from .document import Document
from .extensions import RedirectExtension
from .request import HttpRequest
from .transport import Urllib3Transport
from .util.types import resolve_entity
__all__ = ["HttpClient", "request"]
[docs]class HttpClient(BaseClient[HttpRequest, Document]):
[docs] document_class: type[Document] = Document
[docs] extension = RedirectExtension()
[docs] request_class = HttpRequest
[docs] default_transport_class = Urllib3Transport
[docs] def request(
self, req: None | str | HttpRequest = None, **request_kwargs: Any
) -> Document:
if req is not None and not isinstance(req, HttpRequest):
assert isinstance(req, str)
request_kwargs["url"] = req
req = None
return super().request(req, **request_kwargs)
[docs] def process_request_result(self, req: HttpRequest) -> Document:
"""Process result of real request performed via transport extension."""
doc = self.transport.prepare_response(req, document_class=self.document_class)
all(func(req, doc) for func in self.ext_handlers["response:post"])
return doc
[docs]def request(
url: None | str | HttpRequest = None,
client: None | HttpClient | type[HttpClient] = None,
**request_kwargs: Any,
) -> Document:
client = resolve_entity(HttpClient, client, default=HttpClient)
return client.request(url, **request_kwargs)