| | from __future__ import annotations |
| |
|
| | import typing |
| | from types import TracebackType |
| |
|
| | from .._models import Request, Response |
| |
|
| | T = typing.TypeVar("T", bound="BaseTransport") |
| | A = typing.TypeVar("A", bound="AsyncBaseTransport") |
| |
|
| | __all__ = ["AsyncBaseTransport", "BaseTransport"] |
| |
|
| |
|
| | class BaseTransport: |
| | def __enter__(self: T) -> T: |
| | return self |
| |
|
| | def __exit__( |
| | self, |
| | exc_type: type[BaseException] | None = None, |
| | exc_value: BaseException | None = None, |
| | traceback: TracebackType | None = None, |
| | ) -> None: |
| | self.close() |
| |
|
| | def handle_request(self, request: Request) -> Response: |
| | """ |
| | Send a single HTTP request and return a response. |
| | |
| | Developers shouldn't typically ever need to call into this API directly, |
| | since the Client class provides all the higher level user-facing API |
| | niceties. |
| | |
| | In order to properly release any network resources, the response |
| | stream should *either* be consumed immediately, with a call to |
| | `response.stream.read()`, or else the `handle_request` call should |
| | be followed with a try/finally block to ensuring the stream is |
| | always closed. |
| | |
| | Example usage: |
| | |
| | with httpx.HTTPTransport() as transport: |
| | req = httpx.Request( |
| | method=b"GET", |
| | url=(b"https", b"www.example.com", 443, b"/"), |
| | headers=[(b"Host", b"www.example.com")], |
| | ) |
| | resp = transport.handle_request(req) |
| | body = resp.stream.read() |
| | print(resp.status_code, resp.headers, body) |
| | |
| | |
| | Takes a `Request` instance as the only argument. |
| | |
| | Returns a `Response` instance. |
| | """ |
| | raise NotImplementedError( |
| | "The 'handle_request' method must be implemented." |
| | ) |
| |
|
| | def close(self) -> None: |
| | pass |
| |
|
| |
|
| | class AsyncBaseTransport: |
| | async def __aenter__(self: A) -> A: |
| | return self |
| |
|
| | async def __aexit__( |
| | self, |
| | exc_type: type[BaseException] | None = None, |
| | exc_value: BaseException | None = None, |
| | traceback: TracebackType | None = None, |
| | ) -> None: |
| | await self.aclose() |
| |
|
| | async def handle_async_request( |
| | self, |
| | request: Request, |
| | ) -> Response: |
| | raise NotImplementedError( |
| | "The 'handle_async_request' method must be implemented." |
| | ) |
| |
|
| | async def aclose(self) -> None: |
| | pass |
| |
|