🚀 urllib3 is fundraising for HTTP/2 support
urllib3 is raising ~$40,000 USD to release HTTP/2 support and ensure long-term sustainable maintenance of the project after a sharp decline in financial support. If your company or organization uses Python and would benefit from HTTP/2 support in Requests, pip, cloud SDKs, and thousands of other projects please consider contributing financially to ensure HTTP/2 support is developed sustainably and maintained for the long-haul.
Thank you for your support.
Security
Addressed high-severity security issues. Impact was limited to specific use cases detailed in the accompanying advisories; overall user exposure was estimated to be marginal.
-
Decompression-bomb safeguards of the streaming API were bypassed:
- When
HTTPResponse.drain_conn()was called after the response had been read and decompressed partially. (Reported by @Cycloctane) - During the second
HTTPResponse.read(amt=N)orHTTPResponse.stream(amt=N)call when the response was decompressed using the official Brotli library. (Reported by @kimkou2024)
See GHSA-mf9v-mfxr-j63j for details.
- When
-
HTTP pools created using
ProxyManager.connection_from_urldid not strip sensitive headers specified inRetry.remove_headers_on_redirectwhen redirecting to a different host. (GHSA-qccp-gfcp-xxvc reported by @christos-spearbit)
Deprecations and Removals
- Used
FutureWarninginstead ofDeprecationWarningfor better visibility of existing deprecation notices. Rescheduled the removal of deprecated features to version 3.0. (#3764) - Removed support for end-of-life Python 3.9. (#3720)
- Removed support for end-of-life PyPy3.10. (#4979)
- Bumped the minimum supported pyOpenSSL version to 19.0.0. (#3777)
Bugfixes
- Fixed a bug where
HTTPResponse.read(amt=None)was ignoring decompressed data buffered from previous partial reads. (#3636) - Fixed a bug where
HTTPResponse.read()could cache only part of the response after a partial read whencache_content=True. (#4967) - Fixed
HTTPResponse.stream()andHTTPResponse.read_chunked()to handleamt=0. (#3793) - Updated
_TYPE_BODYtype alias to include missingIterable[str], matching the documented and runtime behavior of chunked request bodies. (#3798) - Fixed
LocationParseErrorwhen paths resembling schemeless URIs were passed toHTTPConnectionPool.urlopen(). (#3352) - Fixed
BaseHTTPResponse.readinto()type annotation to acceptmemoryviewin addition tobytearray, matching theio.RawIOBase.readintocontract and enabling use withio.BufferedReaderwithout type errors. (#3764)