From: Tom Christie Date: Tue, 11 May 2021 09:25:01 +0000 (+0100) Subject: Switch to `USE_CLIENT_DEFAULT` instead of `UNSET`. (#1634) X-Git-Tag: 0.18.2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=69409bb8b9e85caf2dd63f9b76f0aa920feaf4f1;p=thirdparty%2Fhttpx.git Switch to `USE_CLIENT_DEFAULT` instead of `UNSET`. (#1634) * Add failing test case for 'content=io.BytesIO(...)' * Refactor peek_filelike_length to return an Optional[int] * Peek filelength on file-like objects when rendering 'content=...' * Switch to USE_CLIENT_DEFAULT * Switch to USE_CLIENT_DEFAULT * Linting --- diff --git a/httpx/__init__.py b/httpx/__init__.py index 9a27790f..4af3904f 100644 --- a/httpx/__init__.py +++ b/httpx/__init__.py @@ -1,7 +1,7 @@ from .__version__ import __description__, __title__, __version__ from ._api import delete, get, head, options, patch, post, put, request, stream from ._auth import Auth, BasicAuth, DigestAuth -from ._client import AsyncClient, Client +from ._client import USE_CLIENT_DEFAULT, AsyncClient, Client from ._config import Limits, Proxy, Timeout, create_ssl_context from ._content import ByteStream from ._exceptions import ( @@ -111,6 +111,7 @@ __all__ = [ "TransportError", "UnsupportedProtocol", "URL", + "USE_CLIENT_DEFAULT", "WriteError", "WriteTimeout", "WSGITransport", diff --git a/httpx/_client.py b/httpx/_client.py index 2928577b..7fcc85b0 100644 --- a/httpx/_client.py +++ b/httpx/_client.py @@ -12,11 +12,9 @@ from ._config import ( DEFAULT_LIMITS, DEFAULT_MAX_REDIRECTS, DEFAULT_TIMEOUT_CONFIG, - UNSET, Limits, Proxy, Timeout, - UnsetType, ) from ._decoders import SUPPORTED_DECODERS from ._exceptions import ( @@ -65,6 +63,31 @@ T = typing.TypeVar("T", bound="Client") U = typing.TypeVar("U", bound="AsyncClient") +class UseClientDefault: + """ + For some parameters such as `auth=...` and `timeout=...` we need to be able + to indicate the default "unset" state, in a way that is distinctly different + to using `None`. + + The default "unset" state indicates that whatever default is set on the + client should be used. This is different to setting `None`, which + explicitly disables the parameter, possibly overriding a client default. + + For example we use `timeout=USE_CLIENT_DEFAULT` in the `request()` signature. + Omitting the `timeout` parameter will send a request using whatever default + timeout has been configured on the client. Including `timeout=None` will + ensure no timeout is used. + + Note that user code shouldn't need to use the `USE_CLIENT_DEFAULT` constant, + but it is used internally when a parameter is not included. + """ + + pass # pragma: nocover + + +USE_CLIENT_DEFAULT = UseClientDefault() + + logger = get_logger(__name__) USER_AGENT = f"python-httpx/{__version__}" @@ -402,9 +425,13 @@ class BaseClient: raise TypeError(f'Invalid "auth" argument: {auth!r}') def _build_request_auth( - self, request: Request, auth: typing.Union[AuthTypes, UnsetType] = UNSET + self, + request: Request, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Auth: - auth = self._auth if isinstance(auth, UnsetType) else self._build_auth(auth) + auth = ( + self._auth if isinstance(auth, UseClientDefault) else self._build_auth(auth) + ) if auth is not None: return auth @@ -705,9 +732,9 @@ class Client(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Build and send a request. @@ -761,9 +788,9 @@ class Client(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> typing.Iterator[Response]: """ Alternative to `httpx.request()` that streams the response body @@ -803,9 +830,9 @@ class Client(BaseClient): request: Request, *, stream: bool = False, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a request. @@ -824,7 +851,9 @@ class Client(BaseClient): raise RuntimeError("Cannot send a request, as the client has been closed.") self._state = ClientState.OPENED - timeout = self.timeout if isinstance(timeout, UnsetType) else Timeout(timeout) + timeout = ( + self.timeout if isinstance(timeout, UseClientDefault) else Timeout(timeout) + ) auth = self._build_request_auth(request, auth) @@ -963,9 +992,9 @@ class Client(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a `GET` request. @@ -990,9 +1019,9 @@ class Client(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send an `OPTIONS` request. @@ -1017,9 +1046,9 @@ class Client(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a `HEAD` request. @@ -1048,9 +1077,9 @@ class Client(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a `POST` request. @@ -1083,9 +1112,9 @@ class Client(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a `PUT` request. @@ -1118,9 +1147,9 @@ class Client(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a `PATCH` request. @@ -1149,9 +1178,9 @@ class Client(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a `DELETE` request. @@ -1391,9 +1420,9 @@ class AsyncClient(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Build and send a request. @@ -1440,9 +1469,9 @@ class AsyncClient(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> typing.AsyncIterator[Response]: """ Alternative to `httpx.request()` that streams the response body @@ -1482,9 +1511,9 @@ class AsyncClient(BaseClient): request: Request, *, stream: bool = False, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a request. @@ -1503,7 +1532,9 @@ class AsyncClient(BaseClient): raise RuntimeError("Cannot send a request, as the client has been closed.") self._state = ClientState.OPENED - timeout = self.timeout if isinstance(timeout, UnsetType) else Timeout(timeout) + timeout = ( + self.timeout if isinstance(timeout, UseClientDefault) else Timeout(timeout) + ) auth = self._build_request_auth(request, auth) @@ -1649,9 +1680,9 @@ class AsyncClient(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a `GET` request. @@ -1676,9 +1707,9 @@ class AsyncClient(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send an `OPTIONS` request. @@ -1703,9 +1734,9 @@ class AsyncClient(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a `HEAD` request. @@ -1734,9 +1765,9 @@ class AsyncClient(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a `POST` request. @@ -1769,9 +1800,9 @@ class AsyncClient(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a `PUT` request. @@ -1804,9 +1835,9 @@ class AsyncClient(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a `PATCH` request. @@ -1835,9 +1866,9 @@ class AsyncClient(BaseClient): params: QueryParamTypes = None, headers: HeaderTypes = None, cookies: CookieTypes = None, - auth: typing.Union[AuthTypes, UnsetType] = UNSET, + auth: typing.Union[AuthTypes, UseClientDefault] = USE_CLIENT_DEFAULT, allow_redirects: bool = True, - timeout: typing.Union[TimeoutTypes, UnsetType] = UNSET, + timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT, ) -> Response: """ Send a `DELETE` request.