## API Reference
-#### Client
+### `Client`
*An HTTP client, with connection pooling, redirects, cookie persistence, etc.*
* `async def .send(request, [stream], [allow_redirects], [ssl], [timeout])`
* `async def .close()`
-### Models
-
-*Data-structures for HTTP primitives...*
-
-#### Response
+### `Response`
*An HTTP response.*
* `async def .close()` - **None**
* `async def .next()` - **Response**
-#### Request
+### `Request`
*An HTTP request. Can be constructed explicitly for more control over exactly
what gets sent over the wire.*
* `.content` - **byte** or **byte async iterator**
* `.headers` - **Headers**
-#### URL
+### `URL`
*A normalized, IDNA supporting URL.*
* `def .copy_with([scheme], [authority], [path], [query], [fragment])` - **URL**
* `def .resolve_with(url)` - **URL**
-#### Origin
+### `Origin`
*A normalized, IDNA supporting set of scheme/host/port info.*
* `.host` - **str**
* `.port` - **int**
-#### `Headers`
+### `Headers`
*A case-insensitive multi-dict.*
from .adapters.redirects import RedirectAdapter
+from .backends.sync import SyncClient
from .client import Client
from .config import PoolLimits, SSLConfig, TimeoutConfig
+from .constants import Protocol, codes
from .dispatch.connection import HTTPConnection
from .dispatch.connection_pool import ConnectionPool
from .dispatch.http2 import HTTP2Connection
Timeout,
TooManyRedirects,
)
-from .interfaces import Adapter
+from .interfaces import Adapter, BaseReader, BaseWriter
from .models import URL, Headers, Origin, Request, Response
-from .status_codes import codes
-from .streams import BaseReader, BaseWriter, Protocol, Reader, Writer, connect
-from .sync import SyncClient
__version__ = "0.2.1"
import typing
from ..config import DEFAULT_MAX_REDIRECTS
+from ..constants import codes
from ..exceptions import RedirectBodyUnavailable, RedirectLoop, TooManyRedirects
from ..interfaces import Adapter
from ..models import URL, Headers, Request, Response
-from ..status_codes import codes
class RedirectAdapter(Adapter):
based, and less strictly `asyncio`-specific.
"""
import asyncio
-import enum
import ssl
import typing
-from .config import DEFAULT_TIMEOUT_CONFIG, PoolLimits, TimeoutConfig
-from .exceptions import ConnectTimeout, PoolTimeout, ReadTimeout, WriteTimeout
-from .interfaces import BasePoolSemaphore, BaseReader, BaseWriter
+from ..config import DEFAULT_TIMEOUT_CONFIG, PoolLimits, TimeoutConfig
+from ..constants import Protocol
+from ..exceptions import ConnectTimeout, PoolTimeout, ReadTimeout, WriteTimeout
+from ..interfaces import BasePoolSemaphore, BaseReader, BaseWriter
OptionalTimeout = typing.Optional[TimeoutConfig]
-class Protocol(enum.Enum):
- HTTP_11 = 1
- HTTP_2 = 2
-
-
class Reader(BaseReader):
def __init__(
self, stream_reader: asyncio.StreamReader, timeout: TimeoutConfig
import typing
from types import TracebackType
-from .client import Client
-from .config import (
+from ..client import Client
+from ..config import (
DEFAULT_MAX_REDIRECTS,
DEFAULT_POOL_LIMITS,
DEFAULT_SSL_CONFIG,
SSLConfig,
TimeoutConfig,
)
-from .models import (
+from ..models import (
URL,
ByteOrByteStream,
Headers,
import enum
+
+class Protocol(str, enum.Enum):
+ HTTP_11 = "HTTP/1.1"
+ HTTP_2 = "HTTP/2"
+
+
codes = enum.IntEnum(
"StatusCode",
[
import h2.connection
import h11
+from ..backends.default import connect
from ..config import (
DEFAULT_SSL_CONFIG,
DEFAULT_TIMEOUT_CONFIG,
SSLConfig,
TimeoutConfig,
)
+from ..constants import Protocol
from ..exceptions import ConnectTimeout
from ..interfaces import Adapter
from ..models import Origin, Request, Response
-from ..streams import Protocol, connect
from .http2 import HTTP2Connection
from .http11 import HTTP11Connection
import collections.abc
import typing
+from ..backends.default import PoolSemaphore
from ..config import (
DEFAULT_CA_BUNDLE_PATH,
DEFAULT_POOL_LIMITS,
from ..exceptions import PoolTimeout
from ..interfaces import Adapter
from ..models import Origin, Request, Response
-from ..streams import PoolSemaphore
from .connection import HTTPConnection
CONNECTIONS_DICT = typing.Dict[Origin, typing.List[HTTPConnection]]
TimeoutConfig,
)
from ..exceptions import ConnectTimeout, ReadTimeout
-from ..interfaces import Adapter
+from ..interfaces import Adapter, BaseReader, BaseWriter
from ..models import Request, Response
-from ..streams import BaseReader, BaseWriter
H11Event = typing.Union[
h11.Request,
TimeoutConfig,
)
from ..exceptions import ConnectTimeout, ReadTimeout
-from ..interfaces import Adapter
+from ..interfaces import Adapter, BaseReader, BaseWriter
from ..models import Request, Response
-from ..streams import BaseReader, BaseWriter
OptionalTimeout = typing.Optional[TimeoutConfig]
import rfc3986
from .config import SSLConfig, TimeoutConfig
+from .constants import codes
from .decoders import (
ACCEPT_ENCODING,
SUPPORTED_DECODERS,
MultiDecoder,
)
from .exceptions import InvalidURL, ResponseClosed, ResponseNotRead, StreamConsumed
-from .status_codes import codes
from .utils import (
get_reason_phrase,
is_known_encoding,
def get_reason_phrase(status_code: int) -> str:
"""
- Return an HTTP reason phrase, eg. "OK" for 200, or "Not Found" for 404.
+ Return an HTTP reason phrase such as "OK" for 200, or "Not Found" for 404.
"""
try:
return http.HTTPStatus(status_code).phrase
def is_known_encoding(encoding: str) -> bool:
+ """
+ Return `True` if `encoding` is a known codec.
+ """
try:
codecs.lookup(encoding)
except LookupError: