1# Changelog 2 3All notable changes to this project will be documented in this file. 4 5The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). 6 7## 0.21.1 (16th November, 2021) 8 9### Fixed 10 11* The `response.url` property is now correctly annotated as `URL`, instead of `Optional[URL]`. (#1940) 12 13## 0.21.0 (15th November, 2021) 14 15The 0.21.0 release integrates against a newly redesigned `httpcore` backend. 16 17Both packages ought to automatically update to the required versions, but if you are 18seeing any issues, you should ensure that you have `httpx==0.21.*` and `httpcore==0.14.*` installed. 19 20### Added 21 22* The command-line client will now display connection information when `-v/--verbose` is used. 23* The command-line client will now display server certificate information when `-v/--verbose` is used. 24* The command-line client is now able to properly detect if the outgoing request 25should be formatted as HTTP/1.1 or HTTP/2, based on the result of the HTTP/2 negotiation. 26 27### Removed 28 29* Curio support is no longer currently included. Please get in touch if you require this, so that we can assess priorities. 30 31## 0.20.0 (13th October, 2021) 32 33The 0.20.0 release adds an integrated command-line client, and also includes some 34design changes. The most notable of these is that redirect responses are no longer 35automatically followed, unless specifically requested. 36 37This design decision prioritises a more explicit approach to redirects, in order 38to avoid code that unintentionally issues multiple requests as a result of 39misconfigured URLs. 40 41For example, previously a client configured to send requests to `http://api.github.com/` 42would end up sending every API request twice, as each request would be redirected to `https://api.github.com/`. 43 44If you do want auto-redirect behaviour, you can enable this either by configuring 45the client instance with `Client(follow_redirects=True)`, or on a per-request 46basis, with `.get(..., follow_redirects=True)`. 47 48This change is a classic trade-off between convenience and precision, with no "right" 49answer. See [discussion #1785](https://github.com/encode/httpx/discussions/1785) for more 50context. 51 52The other major design change is an update to the Transport API, which is the low-level 53interface against which requests are sent. Previously this interface used only primitive 54datastructures, like so... 55 56```python 57(status_code, headers, stream, extensions) = transport.handle_request(method, url, headers, stream, extensions) 58try 59 ... 60finally: 61 stream.close() 62``` 63 64Now the interface is much simpler... 65 66```python 67response = transport.handle_request(request) 68try 69 ... 70finally: 71 response.close() 72``` 73 74### Changed 75 76* The `allow_redirects` flag is now `follow_redirects` and defaults to `False`. 77* The `raise_for_status()` method will now raise an exception for any responses 78 except those with 2xx status codes. Previously only 4xx and 5xx status codes 79 would result in an exception. 80* The low-level transport API changes to the much simpler `response = transport.handle_request(request)`. 81* The `client.send()` method no longer accepts a `timeout=...` argument, but the 82 `client.build_request()` does. This required by the signature change of the 83 Transport API. The request timeout configuration is now stored on the request 84 instance, as `request.extensions['timeout']`. 85 86### Added 87 88* Added the `httpx` command-line client. 89* Response instances now include `.is_informational`, `.is_success`, `.is_redirect`, `.is_client_error`, and `.is_server_error` 90 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. 91 92### Fixed 93 94* `response.iter_bytes()` no longer raises a ValueError when called on a response with no content. (Pull #1827) 95* 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` confguration. (Pull #1828) 96* Follow the WSGI spec by properly closing the iterable returned by the application. (Pull #1830) 97 98## 0.19.0 (19th August, 2021) 99 100### Added 101 102* Add support for `Client(allow_redirects=<bool>)`. (Pull #1790) 103* Add automatic character set detection, when no `charset` is included in the response `Content-Type` header. (Pull #1791) 104 105### Changed 106 107* Event hooks are now also called for any additional redirect or auth requests/responses. (Pull #1806) 108* Strictly enforce that upload files must be opened in binary mode. (Pull #1736) 109* Strictly enforce that client instances can only be opened and closed once, and cannot be re-opened. (Pull #1800) 110* Drop `mode` argument from `httpx.Proxy(..., mode=...)`. (Pull #1795) 111 112## 0.18.2 (17th June, 2021) 113 114### Added 115 116* Support for Python 3.10. (Pull #1687) 117* Expose `httpx.USE_CLIENT_DEFAULT`, used as the default to `auth` and `timeout` parameters in request methods. (Pull #1634) 118* Support [HTTP/2 "prior knowledge"](https://python-hyper.org/projects/hyper-h2/en/v2.3.1/negotiating-http2.html#prior-knowledge), using `httpx.Client(http1=False, http2=True)`. (Pull #1624) 119 120### Fixed 121 122* Clean up some cases where warnings were being issued. (Pull #1687) 123* Prefer Content-Length over Transfer-Encoding: chunked for content=<file-like> cases. (Pull #1619) 124 125## 0.18.1 (29th April, 2021) 126 127### Changed 128 129* Update brotli support to use the `brotlicffi` package (Pull #1605) 130* Ensure that `Request(..., stream=...)` does not auto-generate any headers on the request instance. (Pull #1607) 131 132### Fixed 133 134* Pass through `timeout=...` in top-level httpx.stream() function. (Pull #1613) 135* Map httpcore transport close exceptions to httpx exceptions. (Pull #1606) 136 137## 0.18.0 (27th April, 2021) 138 139The 0.18.x release series formalises our low-level Transport API, introducing the base classes `httpx.BaseTransport` and `httpx.AsyncBaseTransport`. 140 141See the "[Writing custom transports](https://www.python-httpx.org/advanced/#writing-custom-transports)" documentation and the [`httpx.BaseTransport.handle_request()`](https://github.com/encode/httpx/blob/397aad98fdc8b7580a5fc3e88f1578b4302c6382/httpx/_transports/base.py#L77-L147) docstring for more complete details on implementing custom transports. 142 143Pull request #1522 includes a checklist of differences from the previous `httpcore` transport API, for developers implementing custom transports. 144 145The following API changes have been issuing deprecation warnings since 0.17.0 onwards, and are now fully deprecated... 146 147* You should now use httpx.codes consistently instead of httpx.StatusCodes. 148* Use limits=... instead of pool_limits=.... 149* Use proxies={"http://": ...} instead of proxies={"http": ...} for scheme-specific mounting. 150 151### Changed 152 153* Transport instances now inherit from `httpx.BaseTransport` or `httpx.AsyncBaseTransport`, 154 and should implement either the `handle_request` method or `handle_async_request` method. (Pull #1522, #1550) 155* The `response.ext` property and `Response(ext=...)` argument are now named `extensions`. (Pull #1522) 156* 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) 157* Drop `Response(on_close=...)` from API, since it was a bit of leaking implementation detail. (Pull #1572) 158* 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) 159* The runtime exception `httpx.ResponseClosed` is now named `httpx.StreamClosed`. (#1584) 160* The `httpx.QueryParams` model now presents an immutable interface. There is a discussion on [the design and motivation here](https://github.com/encode/httpx/discussions/1599). 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) 161 162### Added 163 164* The `Request` and `Response` classes can now be serialized using pickle. (#1579) 165* Handle `data={"key": [None|int|float|bool]}` cases. (Pull #1539) 166* Support `httpx.URL(**kwargs)`, for example `httpx.URL(scheme="https", host="www.example.com", path="/')`, or `httpx.URL("https://www.example.com/", username="tom@gmail.com", password="123 456")`. (Pull #1601) 167* Support `url.copy_with(params=...)`. (Pull #1601) 168* Add `url.params` parameter, returning an immutable `QueryParams` instance. (Pull #1601) 169* 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) 170* 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) 171* The `URL.host` property returns unicode strings for internationalized domain names. The `URL.raw_host` property returns byte strings with IDNA escaping applied. (Pull #1590) 172 173### Fixed 174 175* Fix Content-Length for cases of `files=...` where unicode string is used as the file content. (Pull #1537) 176* Fix some cases of merging relative URLs against `Client(base_url=...)`. (Pull #1532) 177* The `request.content` attribute is now always available except for streaming content, which requires an explicit `.read()`. (Pull #1583) 178 179## 0.17.1 (March 15th, 2021) 180 181### Fixed 182 183* Type annotation on `CertTypes` allows `keyfile` and `password` to be optional. (Pull #1503) 184* Fix httpcore pinned version. (Pull #1495) 185 186## 0.17.0 (February 28th, 2021) 187 188### Added 189 190* Add `httpx.MockTransport()`, allowing to mock out a transport using pre-determined responses. (Pull #1401, Pull #1449) 191* Add `httpx.HTTPTransport()` and `httpx.AsyncHTTPTransport()` default transports. (Pull #1399) 192* Add mount API support, using `httpx.Client(mounts=...)`. (Pull #1362) 193* Add `chunk_size` parameter to `iter_raw()`, `iter_bytes()`, `iter_text()`. (Pull #1277) 194* Add `keepalive_expiry` parameter to `httpx.Limits()` configuration. (Pull #1398) 195* Add repr to `httpx.Cookies` to display available cookies. (Pull #1411) 196* Add support for `params=<tuple>` (previously only `params=<list>` was supported). (Pull #1426) 197 198### Fixed 199 200* Add missing `raw_path` to ASGI scope. (Pull #1357) 201* Tweak `create_ssl_context` defaults to use `trust_env=True`. (Pull #1447) 202* Properly URL-escape WSGI `PATH_INFO`. (Pull #1391) 203* Properly set default ports in WSGI transport. (Pull #1469) 204* Properly encode slashes when using `base_url`. (Pull #1407) 205* Properly map exceptions in `request.aclose()`. (Pull #1465) 206 207## 0.16.1 (October 8th, 2020) 208 209### Fixed 210 211* Support literal IPv6 addresses in URLs. (Pull #1349) 212* Force lowercase headers in ASGI scope dictionaries. (Pull #1351) 213 214## 0.16.0 (October 6th, 2020) 215 216### Changed 217 218* Preserve HTTP header casing. (Pull #1338, encode/httpcore#216, python-hyper/h11#104) 219* Drop `response.next()` and `response.anext()` methods in favour of `response.next_request` attribute. (Pull #1339) 220* Closed clients now raise a runtime error if attempting to send a request. (Pull #1346) 221 222### Added 223 224* Add Python 3.9 to officially supported versions. 225* Type annotate `__enter__`/`__exit__`/`__aenter__`/`__aexit__` in a way that supports subclasses of `Client` and `AsyncClient`. (Pull #1336) 226 227## 0.15.5 (October 1st, 2020) 228 229### Added 230 231* Add `response.next_request` (Pull #1334) 232 233## 0.15.4 (September 25th, 2020) 234 235### Added 236 237* Support direct comparisons between `Headers` and dicts or lists of two-tuples. Eg. `assert response.headers == {"Content-Length": 24}` (Pull #1326) 238 239### Fixed 240 241* Fix automatic `.read()` when `Response` instances are created with `content=<str>` (Pull #1324) 242 243## 0.15.3 (September 24th, 2020) 244 245### Fixed 246 247* Fixed connection leak in async client due to improper closing of response streams. (Pull #1316) 248 249## 0.15.2 (September 23nd, 2020) 250 251### Fixed 252 253* Fixed `response.elapsed` property. (Pull #1313) 254* Fixed client authentication interaction with `.stream()`. (Pull #1312) 255 256## 0.15.1 (September 23nd, 2020) 257 258### Fixed 259 260* ASGITransport now properly applies URL decoding to the `path` component, as-per the ASGI spec. (Pull #1307) 261 262## 0.15.0 (September 22nd, 2020) 263 264### Added 265 266* Added support for curio. (Pull https://github.com/encode/httpcore/pull/168) 267* Added support for event hooks. (Pull #1246) 268* Added support for authentication flows which require either sync or async I/O. (Pull #1217) 269* Added support for monitoring download progress with `response.num_bytes_downloaded`. (Pull #1268) 270* Added `Request(content=...)` for byte content, instead of overloading `Request(data=...)` (Pull #1266) 271* Added support for all URL components as parameter names when using `url.copy_with(...)`. (Pull #1285) 272* Neater split between automatically populated headers on `Request` instances, vs default `client.headers`. (Pull #1248) 273* Unclosed `AsyncClient` instances will now raise warnings if garbage collected. (Pull #1197) 274* Support `Response(content=..., text=..., html=..., json=...)` for creating usable response instances in code. (Pull #1265, #1297) 275* Support instantiating requests from the low-level transport API. (Pull #1293) 276* Raise errors on invalid URL types. (Pull #1259) 277 278### Changed 279 280* Cleaned up expected behaviour for URL escaping. `url.path` is now URL escaped. (Pull #1285) 281* Cleaned up expected behaviour for bytes vs str in URL components. `url.userinfo` and `url.query` are not URL escaped, and so return bytes. (Pull #1285) 282* Drop `url.authority` property in favour of `url.netloc`, since "authority" was semantically incorrect. (Pull #1285) 283* Drop `url.full_path` property in favour of `url.raw_path`, for better consistency with other parts of the API. (Pull #1285) 284* No longer use the `chardet` library for auto-detecting charsets, instead defaulting to a simpler approach when no charset is specified. (#1269) 285 286### Fixed 287 288* Swapped ordering of redirects and authentication flow. (Pull #1267) 289* `.netrc` lookups should use host, not host+port. (Pull #1298) 290 291### Removed 292 293* The `URLLib3Transport` class no longer exists. We've published it instead as an example of [a custom transport class](https://gist.github.com/florimondmanca/d56764d78d748eb9f73165da388e546e). (Pull #1182) 294* Drop `request.timer` attribute, which was being used internally to set `response.elapsed`. (Pull #1249) 295* Drop `response.decoder` attribute, which was being used internally. (Pull #1276) 296* `Request.prepare()` is now a private method. (Pull #1284) 297* The `Headers.getlist()` method had previously been deprecated in favour of `Headers.get_list()`. It is now fully removed. 298* The `QueryParams.getlist()` method had previously been deprecated in favour of `QueryParams.get_list()`. It is now fully removed. 299* The `URL.is_ssl` property had previously been deprecated in favour of `URL.scheme == "https"`. It is now fully removed. 300* The `httpx.PoolLimits` class had previously been deprecated in favour of `httpx.Limits`. It is now fully removed. 301* The `max_keepalive` setting had previously been deprecated in favour of the more explicit `max_keepalive_connections`. It is now fully removed. 302* The verbose `httpx.Timeout(5.0, connect_timeout=60.0)` style had previously been deprecated in favour of `httpx.Timeout(5.0, connect=60.0)`. It is now fully removed. 303* Support for instantiating a timeout config missing some defaults, such as `httpx.Timeout(connect=60.0)`, had previously been deprecated in favour of enforcing a more explicit style, such as `httpx.Timeout(5.0, connect=60.0)`. This is now strictly enforced. 304 305## 0.14.3 (September 2nd, 2020) 306 307### Added 308 309* `http.Response()` may now be instantiated without a `request=...` parameter. Useful for some unit testing cases. (Pull #1238) 310* Add `103 Early Hints` and `425 Too Early` status codes. (Pull #1244) 311 312### Fixed 313 314* `DigestAuth` now handles responses that include multiple 'WWW-Authenticate' headers. (Pull #1240) 315* Call into transport `__enter__`/`__exit__` or `__aenter__`/`__aexit__` when client is used in a context manager style. (Pull #1218) 316 317## 0.14.2 (August 24th, 2020) 318 319### Added 320 321* Support `client.get(..., auth=None)` to bypass the default authentication on a clients. (Pull #1115) 322* Support `client.auth = ...` property setter. (Pull #1185) 323* Support `httpx.get(..., proxies=...)` on top-level request functions. (Pull #1198) 324* Display instances with nicer import styles. (Eg. <httpx.ReadTimeout ...>) (Pull #1155) 325* Support `cookies=[(key, value)]` list-of-two-tuples style usage. (Pull #1211) 326 327### Fixed 328 329* Ensure that automatically included headers on a request may be modified. (Pull #1205) 330* Allow explicit `Content-Length` header on streaming requests. (Pull #1170) 331* Handle URL quoted usernames and passwords properly. (Pull #1159) 332* Use more consistent default for `HEAD` requests, setting `allow_redirects=True`. (Pull #1183) 333* If a transport error occurs while streaming the response, raise an `httpx` exception, not the underlying `httpcore` exception. (Pull #1190) 334* Include the underlying `httpcore` traceback, when transport exceptions occur. (Pull #1199) 335 336## 0.14.1 (August 11th, 2020) 337 338### Added 339 340* The `httpx.URL(...)` class now raises `httpx.InvalidURL` on invalid URLs, rather than exposing the underlying `rfc3986` exception. If a redirect response includes an invalid 'Location' header, then a `RemoteProtocolError` exception is raised, which will be associated with the request that caused it. (Pull #1163) 341 342### Fixed 343 344* Handling multiple `Set-Cookie` headers became broken in the 0.14.0 release, and is now resolved. (Pull #1156) 345 346## 0.14.0 (August 7th, 2020) 347 348The 0.14 release includes a range of improvements to the public API, intended on preparing for our upcoming 1.0 release. 349 350* Our HTTP/2 support is now fully optional. **You now need to use `pip install httpx[http2]` if you want to include the HTTP/2 dependancies.** 351* Our HSTS support has now been removed. Rewriting URLs from `http` to `https` if the host is on the HSTS list can be beneficial in avoiding roundtrips to incorrectly formed URLs, but on balance we've decided to remove this feature, on the principle of least surprise. Most programmatic clients do not include HSTS support, and for now we're opting to remove our support for it. 352* Our exception hierarchy has been overhauled. Most users will want to stick with their existing `httpx.HTTPError` usage, but we've got a clearer overall structure now. See https://www.python-httpx.org/exceptions/ for more details. 353 354When upgrading you should be aware of the following public API changes. Note that deprecated usages will currently continue to function, but will issue warnings. 355 356* You should now use `httpx.codes` consistently instead of `httpx.StatusCodes`. 357* Usage of `httpx.Timeout()` should now always include an explicit default. Eg. `httpx.Timeout(None, pool=5.0)`. 358* When using `httpx.Timeout()`, we now have more concisely named keyword arguments. Eg. `read=5.0`, instead of `read_timeout=5.0`. 359* Use `httpx.Limits()` instead of `httpx.PoolLimits()`, and `limits=...` instead of `pool_limits=...`. 360* The `httpx.Limits(max_keepalive=...)` argument is now deprecated in favour of a more explicit `httpx.Limits(max_keepalive_connections=...)`. 361* Keys used with `Client(proxies={...})` should now be in the style of `{"http://": ...}`, rather than `{"http": ...}`. 362* The multidict methods `Headers.getlist()` and `QueryParams.getlist()` are deprecated in favour of more consistent `.get_list()` variants. 363* The `URL.is_ssl` property is deprecated in favour of `URL.scheme == "https"`. 364* The `URL.join(relative_url=...)` method is now `URL.join(url=...)`. This change does not support warnings for the deprecated usage style. 365 366One notable aspect of the 0.14.0 release is that it tightens up the public API for `httpx`, by ensuring that several internal attributes and methods have now become strictly private. 367 368The following previously had nominally public names on the client, but were all undocumented and intended solely for internal usage. They are all now replaced with underscored names, and should not be relied on or accessed. 369 370These changes should not affect users who have been working from the `httpx` documentation. 371 372* `.merge_url()`, `.merge_headers()`, `.merge_cookies()`, `.merge_queryparams()` 373* `.build_auth()`, `.build_redirect_request()` 374* `.redirect_method()`, `.redirect_url()`, `.redirect_headers()`, `.redirect_stream()` 375* `.send_handling_redirects()`, `.send_handling_auth()`, `.send_single_request()` 376* `.init_transport()`, `.init_proxy_transport()` 377* `.proxies`, `.transport`, `.netrc`, `.get_proxy_map()` 378 379See pull requests #997, #1065, #1071. 380 381Some areas of API which were already on the deprecation path, and were raising warnings or errors in 0.13.x have now been escalated to being fully removed. 382 383* Drop `ASGIDispatch`, `WSGIDispatch`, which have been replaced by `ASGITransport`, `WSGITransport`. 384* Drop `dispatch=...`` on client, which has been replaced by `transport=...`` 385* Drop `soft_limit`, `hard_limit`, which have been replaced by `max_keepalive` and `max_connections`. 386* Drop `Response.stream` and` `Response.raw`, which have been replaced by ``.aiter_bytes` and `.aiter_raw`. 387* Drop `proxies=<transport instance>` in favor of `proxies=httpx.Proxy(...)`. 388 389See pull requests #1057, #1058. 390 391### Added 392 393* Added dedicated exception class `httpx.HTTPStatusError` for `.raise_for_status()` exceptions. (Pull #1072) 394* Added `httpx.create_ssl_context()` helper function. (Pull #996) 395* Support for proxy exlcusions like `proxies={"https://www.example.com": None}`. (Pull #1099) 396* Support `QueryParams(None)` and `client.params = None`. (Pull #1060) 397 398### Changed 399 400* Use `httpx.codes` consistently in favour of `httpx.StatusCodes` which is placed into deprecation. (Pull #1088) 401* Usage of `httpx.Timeout()` should now always include an explicit default. Eg. `httpx.Timeout(None, pool=5.0)`. (Pull #1085) 402* Switch to more concise `httpx.Timeout()` keyword arguments. Eg. `read=5.0`, instead of `read_timeout=5.0`. (Pull #1111) 403* Use `httpx.Limits()` instead of `httpx.PoolLimits()`, and `limits=...` instead of `pool_limits=...`. (Pull #1113) 404* Keys used with `Client(proxies={...})` should now be in the style of `{"http://": ...}`, rather than `{"http": ...}`. (Pull #1127) 405* The multidict methods `Headers.getlist` and `QueryParams.getlist` are deprecated in favour of more consistent `.get_list()` variants. (Pull #1089) 406* `URL.port` becomes `Optional[int]`. Now only returns a port if one is explicitly included in the URL string. (Pull #1080) 407* The `URL(..., allow_relative=[bool])` parameter no longer exists. All URL instances may be relative. (Pull #1073) 408* Drop unnecessary `url.full_path = ...` property setter. (Pull #1069) 409* The `URL.join(relative_url=...)` method is now `URL.join(url=...)`. (Pull #1129) 410* The `URL.is_ssl` property is deprecated in favour of `URL.scheme == "https"`. (Pull #1128) 411 412### Fixed 413 414* Add missing `Response.next()` method. (Pull #1055) 415* Ensure all exception classes are exposed as public API. (Pull #1045) 416* Support multiple items with an identical field name in multipart encodings. (Pull #777) 417* Skip HSTS preloading on single-label domains. (Pull #1074) 418* Fixes for `Response.iter_lines()`. (Pull #1033, #1075) 419* Ignore permission errors when accessing `.netrc` files. (Pull #1104) 420* Allow bare hostnames in `HTTP_PROXY` etc... environment variables. (Pull #1120) 421* Settings `app=...` or `transport=...` bypasses any environment based proxy defaults. (Pull #1122) 422* Fix handling of `.base_url` when a path component is included in the base URL. (Pull #1130) 423 424--- 425 426## 0.13.3 (May 29th, 2020) 427 428### Fixed 429 430* Include missing keepalive expiry configuration. (Pull #1005) 431* Improved error message when URL redirect has a custom scheme. (Pull #1002) 432 433## 0.13.2 (May 27th, 2020) 434 435### Fixed 436 437* Include explicit "Content-Length: 0" on POST, PUT, PATCH if no request body is used. (Pull #995) 438* Add `http2` option to `httpx.Client`. (Pull #982) 439* Tighten up API typing in places. (Pull #992, #999) 440 441## 0.13.1 (May 22nd, 2020) 442 443### Fixed 444 445* Fix pool options deprecation warning. (Pull #980) 446* Include `httpx.URLLib3ProxyTransport` in top-level API. (Pull #979) 447 448## 0.13.0 (May 22nd, 2020) 449 450This release switches to `httpcore` for all the internal networking, which means: 451 452* We're using the same codebase for both our sync and async clients. 453* HTTP/2 support is now available with the sync client. 454* We no longer have a `urllib3` dependency for our sync client, although there is still an *optional* `URLLib3Transport` class. 455 456It also means we've had to remove our UDS support, since maintaining that would have meant having to push back our work towards a 1.0 release, which isn't a trade-off we wanted to make. 457 458We also now have [a public "Transport API"](https://www.python-httpx.org/advanced/#custom-transports), which you can use to implement custom transport implementations against. This formalises and replaces our previously private "Dispatch API". 459 460### Changed 461 462* Use `httpcore` for underlying HTTP transport. Drop `urllib3` requirement. (Pull #804, #967) 463* Rename pool limit options from `soft_limit`/`hard_limit` to `max_keepalive`/`max_connections`. (Pull #968) 464* The previous private "Dispatch API" has now been promoted to a public "Transport API". When customizing the transport use `transport=...`. The `ASGIDispatch` and `WSGIDispatch` class naming is deprecated in favour of `ASGITransport` and `WSGITransport`. (Pull #963) 465 466### Added 467 468* Added `URLLib3Transport` class for optional `urllib3` transport support. (Pull #804, #963) 469* Streaming multipart uploads. (Pull #857) 470* Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables 471and TRACE level logging. (Pull encode/httpcore#79) 472 473### Fixed 474 475* Performance improvement in brotli decoder. (Pull #906) 476* Proper warning level of deprecation notice in `Response.stream` and `Response.raw`. (Pull #908) 477* Fix support for generator based WSGI apps. (Pull #887) 478* Reuse of connections on HTTP/2 in close concurrency situations. (Pull encode/httpcore#81) 479* Honor HTTP/2 max concurrent streams settings (Pull encode/httpcore#89, encode/httpcore#90) 480* Fix bytes support in multipart uploads. (Pull #974) 481* Improve typing support for `files=...`. (Pull #976) 482 483### Removed 484 485* Dropped support for `Client(uds=...)` (Pull #804) 486 487## 0.13.0.dev2 (May 12th, 2020) 488 489The 0.13.0.dev2 is a *pre-release* version. To install it, use `pip install httpx --pre`. 490 491### Added 492 493* Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables 494and TRACE level logging. (HTTPCore Pull #79) 495 496### Fixed 497 498* Reuse of connections on HTTP/2 in close concurrency situations. (HTTPCore Pull #81) 499* When using an `app=<ASGI app>` observe neater disconnect behaviour instead of sending empty body messages. (Pull #919) 500 501## 0.13.0.dev1 (May 6th, 2020) 502 503The 0.13.0.dev1 is a *pre-release* version. To install it, use `pip install httpx --pre`. 504 505### Fixed 506 507* Passing `http2` flag to proxy dispatchers. (Pull #934) 508* Use [`httpcore` v0.8.3](https://github.com/encode/httpcore/releases/tag/0.8.3) 509which addresses problems in handling of headers when using proxies. 510 511## 0.13.0.dev0 (April 30th, 2020) 512 513The 0.13.0.dev0 is a *pre-release* version. To install it, use `pip install httpx --pre`. 514 515This release switches to `httpcore` for all the internal networking, which means: 516 517* We're using the same codebase for both our sync and async clients. 518* HTTP/2 support is now available with the sync client. 519* We no longer have a `urllib3` dependency for our sync client, although there is still an *optional* `URLLib3Dispatcher` class. 520 521It also means we've had to remove our UDS support, since maintaining that would have meant having to push back our work towards a 1.0 release, which isn't a trade-off we wanted to make. 522 523### Changed 524 525* Use `httpcore` for underlying HTTP transport. Drop `urllib3` requirement. (Pull #804) 526 527### Added 528 529* Added `URLLib3Dispatcher` class for optional `urllib3` transport support. (Pull #804) 530* Streaming multipart uploads. (Pull #857) 531 532### Fixed 533 534* Performance improvement in brotli decoder. (Pull #906) 535* Proper warning level of deprecation notice in `Response.stream` and `Response.raw`. (Pull #908) 536* Fix support for generator based WSGI apps. (Pull #887) 537 538### Removed 539 540* Dropped support for `Client(uds=...)` (Pull #804) 541 542--- 543 544## 0.12.1 (March 19th, 2020) 545 546### Fixed 547 548* Resolved packaging issue, where additional files were being included. 549 550## 0.12.0 (March 9th, 2020) 551 552The 0.12 release tightens up the API expectations for `httpx` by switching to private module names to enforce better clarity around public API. 553 554All imports of `httpx` should import from the top-level package only, such as `from httpx import Request`, rather than importing from privately namespaced modules such as `from httpx._models import Request`. 555 556### Added 557 558* Support making response body available to auth classes with `.requires_response_body`. (Pull #803) 559* Export `NetworkError` exception. (Pull #814) 560* Add support for `NO_PROXY` environment variable. (Pull #835) 561 562### Changed 563 564* Switched to private module names. (Pull #785) 565* Drop redirect looping detection and the `RedirectLoop` exception, instead using `TooManyRedirects`. (Pull #819) 566* Drop `backend=...` parameter on `AsyncClient`, in favour of always autodetecting `trio`/`asyncio`. (Pull #791) 567 568### Fixed 569 570* Support basic auth credentials in proxy URLs. (Pull #780) 571* Fix `httpx.Proxy(url, mode="FORWARD_ONLY")` configuration. (Pull #788) 572* Fallback to setting headers as UTF-8 if no encoding is specified. (Pull #820) 573* Close proxy dispatches classes on client close. (Pull #826) 574* Support custom `cert` parameters even if `verify=False`. (Pull #796) 575* Don't support invalid dict-of-dicts form data in `data=...`. (Pull #811) 576 577--- 578 579## 0.11.1 (January 17th, 2020) 580 581### Fixed 582 583* Fixed usage of `proxies=...` on `Client()`. (Pull #763) 584* Support both `zlib` and `deflate` style encodings on `Content-Encoding: deflate`. (Pull #758) 585* Fix for streaming a redirect response body with `allow_redirects=False`. (Pull #766) 586* Handle redirect with malformed Location headers missing host. (Pull #774) 587 588## 0.11.0 (January 9th, 2020) 589 590The 0.11 release reintroduces our sync support, so that `httpx` now supports both a standard thread-concurrency API, and an async API. 591 592Existing async `httpx` users that are upgrading to 0.11 should ensure that: 593 594* Async codebases should always use a client instance to make requests, instead of the top-level API. 595* The async client is named as `httpx.AsyncClient()`, instead of `httpx.Client()`. 596* When instantiating proxy configurations use the `httpx.Proxy()` class, instead of the previous `httpx.HTTPProxy()`. This new configuration class works for configuring both sync and async clients. 597 598We believe the API is now pretty much stable, and are aiming for a 1.0 release sometime on or before April 2020. 599 600### Changed 601 602- Top level API such as `httpx.get(url, ...)`, `httpx.post(url, ...)`, `httpx.request(method, url, ...)` becomes synchronous. 603- Added `httpx.Client()` for synchronous clients, with `httpx.AsyncClient` being used for async clients. 604- Switched to `proxies=httpx.Proxy(...)` for proxy configuration. 605- Network connection errors are wrapped in `httpx.NetworkError`, rather than exposing lower-level exception types directly. 606 607### Removed 608 609- The `request.url.origin` property and `httpx.Origin` class are no longer available. 610- The per-request `cert`, `verify`, and `trust_env` arguments are escalated from raising errors if used, to no longer being available. These arguments should be used on a per-client instance instead, or in the top-level API. 611- The `stream` argument has escalated from raising an error when used, to no longer being available. Use the `client.stream(...)` or `httpx.stream()` streaming API instead. 612 613### Fixed 614 615- Redirect loop detection matches against `(method, url)` rather than `url`. (Pull #734) 616 617--- 618 619## 0.10.1 (December 31st, 2019) 620 621### Fixed 622 623- Fix issue with concurrent connection acquiry. (Pull #700) 624- Fix write error on closing HTTP/2 connections. (Pull #699) 625 626## 0.10.0 (December 29th, 2019) 627 628The 0.10.0 release makes some changes that will allow us to support both sync and async interfaces. 629 630In particular with streaming responses the `response.read()` method becomes `response.aread()`, and the `response.close()` method becomes `response.aclose()`. 631 632If following redirects explicitly the `response.next()` method becomes `response.anext()`. 633 634### Fixed 635 636- End HTTP/2 streams immediately on no-body requests, rather than sending an empty body message. (Pull #682) 637- Improve typing for `Response.request`: switch from `Optional[Request]` to `Request`. (Pull #666) 638- `Response.elapsed` now reflects the entire download time. (Pull #687, #692) 639 640### Changed 641 642- Added `AsyncClient` as a synonym for `Client`. (Pull #680) 643- Switch to `response.aread()` for conditionally reading streaming responses. (Pull #674) 644- Switch to `response.aclose()` and `client.aclose()` for explicit closing. (Pull #674, #675) 645- Switch to `response.anext()` for resolving the next redirect response. (Pull #676) 646 647### Removed 648 649- When using a client instance, the per-request usage of `verify`, `cert`, and `trust_env` have now escalated from raising a warning to raising an error. You should set these arguments on the client instead. (Pull #617) 650- Removed the undocumented `request.read()`, since end users should not require it. 651 652--- 653 654## 0.9.5 (December 20th, 2019) 655 656### Fixed 657 658- Fix Host header and HSTS rewrites when an explicit `:80` port is included in URL. (Pull #649) 659- Query Params on the URL string are merged with any `params=...` argument. (Pull #653) 660- More robust behavior when closing connections. (Pull #640) 661- More robust behavior when handling HTTP/2 headers with trailing whitespace. (Pull #637) 662- Allow any explicit `Content-Type` header to take precedence over the encoding default. (Pull #633) 663 664## 0.9.4 (December 12th, 2019) 665 666### Fixed 667 668- Added expiry to Keep-Alive connections, resolving issues with acquiring connections. (Pull #627) 669- Increased flow control windows on HTTP/2, resolving download speed issues. (Pull #629) 670 671## 0.9.3 (December 7th, 2019) 672 673### Fixed 674 675- Fixed HTTP/2 with autodetection backend. (Pull #614) 676 677## 0.9.2 (December 7th, 2019) 678 679* Released due to packaging build artifact. 680 681## 0.9.1 (December 6th, 2019) 682 683* Released due to packaging build artifact. 684 685## 0.9.0 (December 6th, 2019) 686 687The 0.9 releases brings some major new features, including: 688 689* A new streaming API. 690* Autodetection of either asyncio or trio. 691* Nicer timeout configuration. 692* HTTP/2 support off by default, but can be enabled. 693 694We've also removed all private types from the top-level package export. 695 696In order to ensure you are only ever working with public API you should make 697sure to only import the top-level package eg. `import httpx`, rather than 698importing modules within the package. 699 700### Added 701 702- Added concurrency backend autodetection. (Pull #585) 703- Added `Client(backend='trio')` and `Client(backend='asyncio')` API. (Pull #585) 704- Added `response.stream_lines()` API. (Pull #575) 705- Added `response.is_error` API. (Pull #574) 706- Added support for `timeout=Timeout(5.0, connect_timeout=60.0)` styles. (Pull #593) 707 708### Fixed 709 710- Requests or Clients with `timeout=None` now correctly always disable timeouts. (Pull #592) 711- Request 'Authorization' headers now have priority over `.netrc` authentication info. (Commit 095b691) 712- Files without a filename no longer set a Content-Type in multipart data. (Commit ed94950) 713 714### Changed 715 716- Added `httpx.stream()` API. Using `stream=True` now results in a warning. (Pull #600, #610) 717- HTTP/2 support is switched to "off by default", but can be enabled explicitly. (Pull #584) 718- Switched to `Client(http2=True)` API from `Client(http_versions=["HTTP/1.1", "HTTP/2"])`. (Pull #586) 719- Removed all private types from the top-level package export. (Pull #608) 720- The SSL configuration settings of `verify`, `cert`, and `trust_env` now raise warnings if used per-request when using a Client instance. They should always be set on the Client instance itself. (Pull #597) 721- Use plain strings "TUNNEL_ONLY" or "FORWARD_ONLY" on the HTTPProxy `proxy_mode` argument. The `HTTPProxyMode` enum still exists, but its usage will raise warnings. (#610) 722- Pool timeouts are now on the timeout configuration, not the pool limits configuration. (Pull #563) 723- The timeout configuration is now named `httpx.Timeout(...)`, not `httpx.TimeoutConfig(...)`. The old version currently remains as a synonym for backwards compatability. (Pull #591) 724 725--- 726 727## 0.8.0 (November 27, 2019) 728 729### Removed 730 731- The synchronous API has been removed, in order to allow us to fundamentally change how we approach supporting both sync and async variants. (See #588 for more details.) 732 733--- 734 735## 0.7.8 (November 17, 2019) 736 737### Added 738 739- Add support for proxy tunnels for Python 3.6 + asyncio. (Pull #521) 740 741## 0.7.7 (November 15, 2019) 742 743### Fixed 744 745- Resolve an issue with cookies behavior on redirect requests. (Pull #529) 746 747### Added 748 749- Add request/response DEBUG logs. (Pull #502) 750- Use TRACE log level for low level info. (Pull #500) 751 752## 0.7.6 (November 2, 2019) 753 754### Removed 755 756- Drop `proxies` parameter from the high-level API. (Pull #485) 757 758### Fixed 759 760- Tweak multipart files: omit null filenames, add support for `str` file contents. (Pull #482) 761- Cache NETRC authentication per-client. (Pull #400) 762- Rely on `getproxies` for all proxy environment variables. (Pull #470) 763- Wait for the `asyncio` stream to close when closing a connection. (Pull #494) 764 765## 0.7.5 (October 10, 2019) 766 767### Added 768 769- Allow lists of values to be passed to `params`. (Pull #386) 770- `ASGIDispatch`, `WSGIDispatch` are now available in the `httpx.dispatch` namespace. (Pull #407) 771- `HTTPError` is now available in the `httpx` namespace. (Pull #421) 772- Add support for `start_tls()` to the Trio concurrency backend. (Pull #467) 773 774### Fixed 775 776- Username and password are no longer included in the `Host` header when basic authentication 777 credentials are supplied via the URL. (Pull #417) 778 779### Removed 780 781- The `.delete()` function no longer has `json`, `data`, or `files` parameters 782 to match the expected semantics of the `DELETE` method. (Pull #408) 783- Removed the `trio` extra. Trio support is detected automatically. (Pull #390) 784 785## 0.7.4 (September 25, 2019) 786 787### Added 788 789- Add Trio concurrency backend. (Pull #276) 790- Add `params` parameter to `Client` for setting default query parameters. (Pull #372) 791- Add support for `SSL_CERT_FILE` and `SSL_CERT_DIR` environment variables. (Pull #307) 792- Add debug logging to calls into ASGI apps. (Pull #371) 793- Add debug logging to SSL configuration. (Pull #378) 794 795### Fixed 796 797- Fix a bug when using `Client` without timeouts in Python 3.6. (Pull #383) 798- Propagate `Client` configuration to HTTP proxies. (Pull #377) 799 800## 0.7.3 (September 20, 2019) 801 802### Added 803 804- HTTP Proxy support. (Pulls #259, #353) 805- Add Digest authentication. (Pull #332) 806- Add `.build_request()` method to `Client` and `AsyncClient`. (Pull #319) 807- Add `.elapsed` property on responses. (Pull #351) 808- Add support for `SSLKEYLOGFILE` in Python 3.8b4+. (Pull #301) 809 810### Removed 811 812- Drop NPN support for HTTP version negotiation. (Pull #314) 813 814### Fixed 815 816- Fix distribution of type annotations for mypy (Pull #361). 817- Set `Host` header when redirecting cross-origin. (Pull #321) 818- Drop `Content-Length` headers on `GET` redirects. (Pull #310) 819- Raise `KeyError` if header isn't found in `Headers`. (Pull #324) 820- Raise `NotRedirectResponse` in `response.next()` if there is no redirection to perform. (Pull #297) 821- Fix bug in calculating the HTTP/2 maximum frame size. (Pull #153) 822 823## 0.7.2 (August 28, 2019) 824 825- Enforce using `httpx.AsyncioBackend` for the synchronous client. (Pull #232) 826- `httpx.ConnectionPool` will properly release a dropped connection. (Pull #230) 827- Remove the `raise_app_exceptions` argument from `Client`. (Pull #238) 828- `DecodeError` will no longer be raised for an empty body encoded with Brotli. (Pull #237) 829- Added `http_versions` parameter to `Client`. (Pull #250) 830- Only use HTTP/1.1 on short-lived connections like `httpx.get()`. (Pull #284) 831- Convert `Client.cookies` and `Client.headers` when set as a property. (Pull #274) 832- Setting `HTTPX_DEBUG=1` enables debug logging on all requests. (Pull #277) 833 834## 0.7.1 (August 18, 2019) 835 836- Include files with source distribution to be installable. (Pull #233) 837 838## 0.7.0 (August 17, 2019) 839 840- Add the `trust_env` property to `BaseClient`. (Pull #187) 841- Add the `links` property to `BaseResponse`. (Pull #211) 842- Accept `ssl.SSLContext` instances into `SSLConfig(verify=...)`. (Pull #215) 843- Add `Response.stream_text()` with incremental encoding detection. (Pull #183) 844- Properly updated the `Host` header when a redirect changes the origin. (Pull #199) 845- Ignore invalid `Content-Encoding` headers. (Pull #196) 846- Use `~/.netrc` and `~/_netrc` files by default when `trust_env=True`. (Pull #189) 847- Create exception base class `HTTPError` with `request` and `response` properties. (Pull #162) 848- Add HSTS preload list checking within `BaseClient` to upgrade HTTP URLs to HTTPS. (Pull #184) 849- Switch IDNA encoding from IDNA 2003 to IDNA 2008. (Pull #161) 850- Expose base classes for alternate concurrency backends. (Pull #178) 851- Improve Multipart parameter encoding. (Pull #167) 852- Add the `headers` proeprty to `BaseClient`. (Pull #159) 853- Add support for Google's `brotli` library. (Pull #156) 854- Remove deprecated TLS versions (TLSv1 and TLSv1.1) from default `SSLConfig`. (Pull #155) 855- Fix `URL.join(...)` to work similarly to RFC 3986 URL joining. (Pull #144) 856 857--- 858 859## 0.6.8 (July 25, 2019) 860 861- Check for disconnections when searching for an available 862 connection in `ConnectionPool.keepalive_connections` (Pull #145) 863- Allow string comparison for `URL` objects (Pull #139) 864- Add HTTP status codes 418 and 451 (Pull #135) 865- Add support for client certificate passwords (Pull #118) 866- Enable post-handshake client cert authentication for TLSv1.3 (Pull #118) 867- Disable using `commonName` for hostname checking for OpenSSL 1.1.0+ (Pull #118) 868- Detect encoding for `Response.json()` (Pull #116) 869 870## 0.6.7 (July 8, 2019) 871 872- Check for connection aliveness on re-acquiry (Pull #111) 873 874## 0.6.6 (July 3, 2019) 875 876- Improve `USER_AGENT` (Pull #110) 877- Add `Connection: keep-alive` by default to HTTP/1.1 connections. (Pull #110) 878 879## 0.6.5 (June 27, 2019) 880 881- Include `Host` header by default. (Pull #109) 882- Improve HTTP protocol detection. (Pull #107) 883 884## 0.6.4 (June 25, 2019) 885 886- Implement read and write timeouts (Pull #104) 887 888## 0.6.3 (June 24, 2019) 889 890- Handle early connection closes (Pull #103) 891 892## 0.6.2 (June 23, 2019) 893 894- Use urllib3's `DEFAULT_CIPHERS` for the `SSLConfig` object. (Pull #100) 895 896## 0.6.1 (June 21, 2019) 897 898- Add support for setting a `base_url` on the `Client`. 899 900## 0.6.0 (June 21, 2019) 901 902- Honor `local_flow_control_window` for HTTP/2 connections (Pull #98) 903