From: Tom Christie Date: Wed, 1 May 2019 15:21:04 +0000 (+0100) Subject: Reorganise structure X-Git-Tag: 0.3.0~43 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0c6f6182cf0656a574c124200acd3fda58ba0d9c;p=thirdparty%2Fhttpx.git Reorganise structure --- diff --git a/README.md b/README.md index bf0eb6a3..a6b2078b 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ Additionally, credit is due to for `urllib3` for plenty of design inspiration. ## API Reference -#### Client +### `Client` *An HTTP client, with connection pooling, redirects, cookie persistence, etc.* @@ -99,11 +99,7 @@ Additionally, credit is due to for `urllib3` for plenty of design inspiration. * `async def .send(request, [stream], [allow_redirects], [ssl], [timeout])` * `async def .close()` -### Models - -*Data-structures for HTTP primitives...* - -#### Response +### `Response` *An HTTP response.* @@ -128,7 +124,7 @@ Additionally, credit is due to for `urllib3` for plenty of design inspiration. * `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.* @@ -144,7 +140,7 @@ what gets sent over the wire.* * `.content` - **byte** or **byte async iterator** * `.headers` - **Headers** -#### URL +### `URL` *A normalized, IDNA supporting URL.* @@ -170,7 +166,7 @@ what gets sent over the wire.* * `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.* @@ -184,7 +180,7 @@ True * `.host` - **str** * `.port` - **int** -#### `Headers` +### `Headers` *A case-insensitive multi-dict.* diff --git a/httpcore/__init__.py b/httpcore/__init__.py index 1d6d7ca1..f637dc58 100644 --- a/httpcore/__init__.py +++ b/httpcore/__init__.py @@ -1,6 +1,8 @@ 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 @@ -20,10 +22,7 @@ from .exceptions import ( 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" diff --git a/httpcore/adapters/redirects.py b/httpcore/adapters/redirects.py index d07484a2..0a79b4c9 100644 --- a/httpcore/adapters/redirects.py +++ b/httpcore/adapters/redirects.py @@ -1,10 +1,10 @@ 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): diff --git a/httpcore/backends/__init__.py b/httpcore/backends/__init__.py new file mode 100644 index 00000000..c0f6f287 --- /dev/null +++ b/httpcore/backends/__init__.py @@ -0,0 +1,2 @@ +""" +""" diff --git a/httpcore/streams.py b/httpcore/backends/default.py similarity index 92% rename from httpcore/streams.py rename to httpcore/backends/default.py index f4bdbfec..b6acb764 100644 --- a/httpcore/streams.py +++ b/httpcore/backends/default.py @@ -9,22 +9,17 @@ protocols, and help keep the rest of the package more `async`/`await` 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 diff --git a/httpcore/sync.py b/httpcore/backends/sync.py similarity index 99% rename from httpcore/sync.py rename to httpcore/backends/sync.py index 300c276b..ae831941 100644 --- a/httpcore/sync.py +++ b/httpcore/backends/sync.py @@ -2,8 +2,8 @@ import asyncio 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, @@ -12,7 +12,7 @@ from .config import ( SSLConfig, TimeoutConfig, ) -from .models import ( +from ..models import ( URL, ByteOrByteStream, Headers, diff --git a/httpcore/status_codes.py b/httpcore/constants.py similarity index 95% rename from httpcore/status_codes.py rename to httpcore/constants.py index 6a224d04..c7f4c648 100644 --- a/httpcore/status_codes.py +++ b/httpcore/constants.py @@ -1,5 +1,11 @@ import enum + +class Protocol(str, enum.Enum): + HTTP_11 = "HTTP/1.1" + HTTP_2 = "HTTP/2" + + codes = enum.IntEnum( "StatusCode", [ diff --git a/httpcore/dispatch/connection.py b/httpcore/dispatch/connection.py index c342a0c3..f1a63f80 100644 --- a/httpcore/dispatch/connection.py +++ b/httpcore/dispatch/connection.py @@ -4,16 +4,17 @@ import typing 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 diff --git a/httpcore/dispatch/connection_pool.py b/httpcore/dispatch/connection_pool.py index bf82805b..f10b14ce 100644 --- a/httpcore/dispatch/connection_pool.py +++ b/httpcore/dispatch/connection_pool.py @@ -1,6 +1,7 @@ import collections.abc import typing +from ..backends.default import PoolSemaphore from ..config import ( DEFAULT_CA_BUNDLE_PATH, DEFAULT_POOL_LIMITS, @@ -14,7 +15,6 @@ from ..decoders import ACCEPT_ENCODING 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]] diff --git a/httpcore/dispatch/http11.py b/httpcore/dispatch/http11.py index 2a0cf2e0..107fa06b 100644 --- a/httpcore/dispatch/http11.py +++ b/httpcore/dispatch/http11.py @@ -9,9 +9,8 @@ from ..config import ( 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, diff --git a/httpcore/dispatch/http2.py b/httpcore/dispatch/http2.py index fb45d541..3cd15d5a 100644 --- a/httpcore/dispatch/http2.py +++ b/httpcore/dispatch/http2.py @@ -11,9 +11,8 @@ from ..config import ( 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] diff --git a/httpcore/models.py b/httpcore/models.py index 267c1ce3..e31b9ac8 100644 --- a/httpcore/models.py +++ b/httpcore/models.py @@ -6,6 +6,7 @@ import idna import rfc3986 from .config import SSLConfig, TimeoutConfig +from .constants import codes from .decoders import ( ACCEPT_ENCODING, SUPPORTED_DECODERS, @@ -14,7 +15,6 @@ from .decoders import ( MultiDecoder, ) from .exceptions import InvalidURL, ResponseClosed, ResponseNotRead, StreamConsumed -from .status_codes import codes from .utils import ( get_reason_phrase, is_known_encoding, diff --git a/httpcore/utils.py b/httpcore/utils.py index d3638585..0f5ec1b3 100644 --- a/httpcore/utils.py +++ b/httpcore/utils.py @@ -23,7 +23,7 @@ def normalize_header_value(value: typing.AnyStr, encoding: str = None) -> bytes: 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 @@ -32,6 +32,9 @@ def get_reason_phrase(status_code: int) -> str: def is_known_encoding(encoding: str) -> bool: + """ + Return `True` if `encoding` is a known codec. + """ try: codecs.lookup(encoding) except LookupError: