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
This commit is contained in:
parent
7025dd1952
commit
69409bb8b9
@ -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",
|
||||
|
||||
123
httpx/_client.py
123
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.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user