All Versions
Latest Version
Avg Release Cycle
23 days
Latest Release
114 days ago

Changelog History
Page 1

  • 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)
  • v0.18.0 Changes

    April 27, 2021

    ๐Ÿš€ The 0.18.x release series formalises our low-level Transport API, introducing the base classes httpx.BaseTransport and httpx.AsyncBaseTransport.

    See the "Writing custom transports" documentation and the httpx.BaseTransport.handle_request() docstring for more complete details on implementing custom transports.

    Pull request #1522 includes a checklist of differences from the previous httpcore transport API, for developers implementing custom transports.

    ๐Ÿ—„ The following API changes have been issuing deprecation warnings since 0.17.0 onwards, and are now fully deprecated...

    • You should now use consistently instead of httpx.StatusCodes.
    • ๐Ÿ‘‰ Use limits=... instead of pool_limits=....
    • ๐Ÿ‘‰ Use proxies={"http://": ...} instead of proxies={"http": ...} for scheme-specific mounting.

    ๐Ÿ”„ Changed

    • Transport instances now inherit from httpx.BaseTransport or httpx.AsyncBaseTransport, and should implement either the handle_request method or handle_async_request method. (Pull #1522, #1550)
    • The response.ext property and Response(ext=...) argument are now named extensions. (Pull #1522)
    • ๐Ÿ—„ The recommendation to not use data=<bytes|str|bytes (a)iterator> in favour of content=<bytes|str|bytes (a)iterator> has now been escalated to a deprecation warning. (Pull #1573)
    • โฌ‡๏ธ Drop Response(on_close=...) from API, since it was a bit of leaking implementation detail. (Pull #1572)
    • When using a client instance, cookies should always be set on the client, rather than on a per-request basis. We prefer enforcing a stricter API here because it provides clearer expectations around cookie persistence, particularly when redirects occur. (Pull #1574)
    • ๐Ÿ‘ป The runtime exception httpx.ResponseClosed is now named httpx.StreamClosed. (#1584)
    • โšก๏ธ The httpx.QueryParams model now presents an immutable interface. There is a discussion on the design and motivation here. Use client.params = client.params.merge(...) instead of client.params.update(...). The basic query manipulation methods are query.set(...), query.add(...), and query.remove(). (#1600)

    โž• Added

    • The Request and Response classes can now be serialized using pickle. (#1579)
    • ๐Ÿ– Handle data={"key": [None|int|float|bool]} cases. (Pull #1539)
    • ๐Ÿ‘Œ Support httpx.URL(**kwargs), for example httpx.URL(scheme="https", host="", path="/'), or httpx.URL("", username="[email protected]", password="123 456"). (Pull #1601)
    • ๐Ÿ‘Œ Support url.copy_with(params=...). (Pull #1601)
    • โž• Add url.params parameter, returning an immutable QueryParams instance. (Pull #1601)
    • Support query manipulation methods on the URL class. These are url.copy_set_param(), url.copy_add_param(), url.copy_remove_param(), url.copy_merge_params(). (Pull #1601)
    • The httpx.URL class now performs port normalization, so :80 ports are stripped from http URLs and :443 ports are stripped from https URLs. (Pull #1603)
    • The property returns unicode strings for internationalized domain names. The URL.raw_host property returns byte strings with IDNA escaping applied. (Pull #1590)

    ๐Ÿ›  Fixed

    • ๐Ÿ›  Fix Content-Length for cases of files=... where unicode string is used as the file content. (Pull #1537)
    • ๐Ÿ›  Fix some cases of merging relative URLs against Client(base_url=...). (Pull #1532)
    • The request.content attribute is now always available except for streaming content, which requires an explicit .read(). (Pull #1583)