All Versions
Latest Version
Avg Release Cycle
28 days
Latest Release
698 days ago

Changelog History
Page 1

  • v0.23.0 Changes

    May 23, 2022

    ๐Ÿ”„ Changed

    • โฌ‡๏ธ Drop support for Python 3.6. (#2097)
    • ๐Ÿ“š Use 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)

    ๐Ÿ›  Fixed

    • ๐Ÿ›  Fix URL.copy_with for some oddly formed URL cases. (#2185)
    • Digest authentication should use case-insensitive comparison for determining which algorithm is being used. (#2204)
    • ๐Ÿ›  Fix console markup escaping in command line client. (#1866)
    • ๐Ÿ‘€ When files are used in multipart upload, ensure we always seek to the start of the file. (#2065)
    • Ensure that iter_bytes never yields zero-length chunks. (#2068)
    • โฌ†๏ธ Preserve Authorization header for redirects that are to the same origin, but are an http-to-https upgrade. (#2074)
    • ๐Ÿ–จ When responses have binary output, don't print the output to the console in the command line client. Use output like <16086 bytes of binary data> instead. (#2076)
    • ๐Ÿ›  Fix display of --proxies argument in the command line client help. (#2125)
    • Close responses when task cancellations occur during stream reading. (#2156)
    • ๐Ÿ›  Fix type error on accessing .request on HTTPError exceptions. (#2158)
  • v0.22.0 Changes

    January 26, 2022

    โž• Added

    ๐Ÿ›  Fixed

    • Don't perform unreliable close/warning on __del__ with unclosed clients. (#2026)
    • ๐Ÿ›  Fix Headers.update(...) to correctly handle repeated headers (#2038)
  • v0.21.3 Changes

    January 06, 2022

    ๐Ÿ›  Fixed

    • ๐Ÿ›  Fix streaming uploads using SyncByteStream or AsyncByteStream. Regression in 0.21.2. (#2016)
  • v0.21.2 Changes

    January 05, 2022

    ๐Ÿ›  Fixed

    • ๐Ÿ‘ HTTP/2 support for tunnelled proxy cases. (#2009)
    • ๐Ÿ‘Œ Improved the speed of large file uploads. (#1948)
  • v0.21.1 Changes

    November 16, 2021

    ๐Ÿ›  Fixed

    • The response.url property is now correctly annotated as URL, instead of Optional[URL]. (#1940)
  • v0.21.0 Changes

    November 15, 2021

    ๐Ÿš€ 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.

    โž• Added

    • The command-line client will now display connection information when -v/--verbose is used.
    • The command-line client will now display server certificate information when -v/--verbose is used.
    • The command-line client is now able to properly detect if the outgoing request should be formatted as HTTP/1.1 or HTTP/2, based on the result of the HTTP/2 negotiation.

    โœ‚ Removed

    • ๐Ÿ‘ Curio support is no longer currently included. Please get in touch if you require this, so that we can assess priorities.
  • v0.20.0 Changes

    October 13, 2021

    ๐Ÿš€ 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 would end up sending every API request twice, as each request would be redirected to

    ๐Ÿ”ง 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)

    Now the interface is much simpler...

    response = transport.handle_request(request)

    ๐Ÿ”„ Changed

    • The allow_redirects flag is now follow_redirects and defaults to False.
    • The 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.
    • The low-level transport API changes to the much simpler response = transport.handle_request(request).
    • โฑ The 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'].

    โž• Added

    • โž• Added the httpx command-line client.
    • Response instances now include .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.

    ๐Ÿ›  Fixed

    • response.iter_bytes() no longer raises a ValueError when called on a response with no content. (Pull #1827)
    • ๐Ÿ”ง The '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)
    • Follow the WSGI spec by properly closing the iterable returned by the application. (Pull #1830)
  • v0.19.0 Changes

    August 19, 2021

    โž• Added

    • โž• Add support for Client(allow_redirects=<bool>). (Pull #1790)
    • โž• Add automatic character set detection, when no charset is included in the response Content-Type header. (Pull #1791)

    ๐Ÿ”„ Changed

    • Event hooks are now also called for any additional redirect or auth requests/responses. (Pull #1806)
    • Strictly enforce that upload files must be opened in binary mode. (Pull #1736)
    • Strictly enforce that client instances can only be opened and closed once, and cannot be re-opened. (Pull #1800)
    • โฌ‡๏ธ Drop mode argument from httpx.Proxy(..., mode=...). (Pull #1795)
  • v0.18.2 Changes

    June 17, 2021

    โž• Added

    • ๐Ÿ‘Œ Support for Python 3.10. (Pull #1687)
    • Expose httpx.USE_CLIENT_DEFAULT, used as the default to auth and timeout parameters in request methods. (Pull #1634)
    • ๐Ÿ‘Œ Support HTTP/2 "prior knowledge", using httpx.Client(http1=False, http2=True). (Pull #1624)

    ๐Ÿ›  Fixed

    • โš  Clean up some cases where warnings were being issued. (Pull #1687)
    • Prefer Content-Length over Transfer-Encoding: chunked for content= cases. (Pull #1619)
  • v0.18.1 Changes

    April 29, 2021

    ๐Ÿ”„ Changed

    • โšก๏ธ Update brotli support to use the brotlicffi package (Pull #1605)
    • Ensure that Request(..., stream=...) does not auto-generate any headers on the request instance. (Pull #1607)

    ๐Ÿ›  Fixed

    • โฑ Pass through timeout=... in top-level function. (Pull #1613)
    • Map httpcore transport close exceptions to httpx exceptions. (Pull #1606)