utf-8 as the default character set, instead of falling back to charset-normalizer for auto-detection. To enable automatic character set detection, see the documentation. (#2165)URL.copy_with for some oddly formed URL cases. (#2185)iter_bytes never yields zero-length chunks. (#2068)Authorization header for redirects that are to the same origin, but are an http-to-https upgrade. (#2074)<16086 bytes of binary data> instead. (#2076)--proxies argument in the command line client help. (#2125).request on HTTPError exceptions. (#2158)socksio package. (#2034)__del__ with unclosed clients. (#2026)Headers.update(...) to correctly handle repeated headers (#2038)SyncByteStream or AsyncByteStream. Regression in 0.21.2. (#2016)response.url property is now correctly annotated as URL, instead of Optional[URL]. (#1940)π The 0.21.0 release integrates against a newly redesigned httpcore backend.
β‘οΈ Both packages ought to automatically update to the required versions, but if you are
seeing any issues, you should ensure that you have httpx==0.21.* and httpcore==0.14.* installed.
-v/--verbose is used.-v/--verbose is used.π The 0.20.0 release adds an integrated command-line client, and also includes some design changes. The most notable of these is that redirect responses are no longer automatically followed, unless specifically requested.
This design decision prioritises a more explicit approach to redirects, in order to avoid code that unintentionally issues multiple requests as a result of misconfigured URLs.
π§ For example, previously a client configured to send requests to http://api.github.com/
would end up sending every API request twice, as each request would be redirected to https://api.github.com/.
π§ If you do want auto-redirect behaviour, you can enable this either by configuring
the client instance with Client(follow_redirects=True), or on a per-request
basis, with .get(..., follow_redirects=True).
This change is a classic trade-off between convenience and precision, with no "right" π answer. See discussion #1785 for more context.
β‘οΈ The other major design change is an update to the Transport API, which is the low-level interface against which requests are sent. Previously this interface used only primitive datastructures, like so...
(status_code, headers, stream, extensions) = transport.handle_request(method, url, headers, stream, extensions)
try
...
finally:
stream.close()
Now the interface is much simpler...
response = transport.handle_request(request)
try
...
finally:
response.close()
allow_redirects flag is now follow_redirects and defaults to False.raise_for_status() method will now raise an exception for any responses
except those with 2xx status codes. Previously only 4xx and 5xx status codes
would result in an exception.response = transport.handle_request(request).client.send() method no longer accepts a timeout=... argument, but the
client.build_request() does. This required by the signature change of the
Transport API. The request timeout configuration is now stored on the request
instance, as request.extensions['timeout'].httpx command-line client..is_informational, .is_success, .is_redirect, .is_client_error, and .is_server_error
properties for checking 1xx, 2xx, 3xx, 4xx, and 5xx response types. Note that the behaviour of .is_redirect is slightly different in that it now returns True for all 3xx responses, in order to allow for a consistent set of properties onto the different HTTP status code types. The response.has_redirect_location location may be used to determine responses with properly formed URL redirects.response.iter_bytes() no longer raises a ValueError when called on a response with no content. (Pull #1827)'wsgi.error' configuration now defaults to sys.stderr, and is corrected to be a TextIO interface, not a BytesIO interface. Additionally, the WSGITransport now accepts a wsgi_error configuration. (Pull #1828)Client(allow_redirects=<bool>). (Pull #1790)charset is included in the response Content-Type header. (Pull #1791)mode argument from httpx.Proxy(..., mode=...). (Pull #1795)httpx.USE_CLIENT_DEFAULT, used as the default to auth and timeout parameters in request methods. (Pull #1634)httpx.Client(http1=False, http2=True). (Pull #1624)brotlicffi package (Pull #1605)Request(..., stream=...) does not auto-generate any headers on the request instance. (Pull #1607)timeout=... in top-level httpx.stream() function. (Pull #1613)