Version 0.18.0
0.18.0 (27th April, 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 httpx.codes 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.BaseTransportorhttpx.AsyncBaseTransport,
and should implement either thehandle_requestmethod orhandle_async_requestmethod. (Pull #1522, #1550) - The
response.extproperty andResponse(ext=...)argument are now namedextensions. (Pull #1522) - The recommendation to not use
data=<bytes|str|bytes (a)iterator>in favour ofcontent=<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.ResponseClosedis now namedhttpx.StreamClosed. (#1584) - The
httpx.QueryParamsmodel now presents an immutable interface. The is a discussion on the design and motivation here. Useclient.params = client.params.merge(...)instead ofclient.params.update(...). The basic query manipulation methods arequery.set(...),query.add(...), andquery.remove(). (#1600)
Added
- The
RequestandResponseclasses can now be serialized using pickle. (#1579) - Handle
data={"key": [None|int|float|bool]}cases. (Pull #1539) - Support
httpx.URL(**kwargs), for examplehttpx.URL(scheme="https", host="www.example.com", path="/'), orhttpx.URL("https://www.example.com/", username="tom@gmail.com", password="123 456"). (Pull #1601) - Support
url.copy_with(params=...). (Pull #1601) - Add
url.paramsparameter, returning an immutableQueryParamsinstance. (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.URLclass now performs port normalization, so:80ports are stripped fromhttpURLs and:443ports are stripped fromhttpsURLs. (Pull #1603) - The
URL.hostproperty returns unicode strings for internationalized domain names. TheURL.raw_hostproperty 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.contentattribute is now always available except for streaming content, which requires an explicit.read(). (Pull #1583)