The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
-## [Unreleased]
+## 0.28.0 (...)
The 0.28 release includes a limited set of backwards incompatible changes.
</a>
</p>
-HTTPX is a fully featured HTTP client library for Python 3. It includes **an integrated
-command line client**, has support for both **HTTP/1.1 and HTTP/2**, and provides both **sync
-and async APIs**.
+HTTPX is a fully featured HTTP client library for Python 3. It includes **an integrated command line client**, has support for both **HTTP/1.1 and HTTP/2**, and provides both **sync and async APIs**.
---
__title__ = "httpx"
__description__ = "A next generation HTTP client, for Python 3."
-__version__ = "0.27.2"
+__version__ = "0.28.0"
) from None
self.decompressor = zstandard.ZstdDecompressor().decompressobj()
+ self.seen_data = False
def decode(self, data: bytes) -> bytes:
assert zstandard is not None
+ self.seen_data = True
output = io.BytesIO()
try:
output.write(self.decompressor.decompress(data))
return output.getvalue()
def flush(self) -> bytes:
+ if not self.seen_data:
+ return b""
ret = self.decompressor.flush() # note: this is a no-op
if not self.decompressor.eof:
raise DecodingError("Zstandard data is incomplete") # pragma: no cover
)
+def test_zstd_empty():
+ headers = [(b"Content-Encoding", b"zstd")]
+ response = httpx.Response(200, headers=headers, content=b"")
+ assert response.content == b""
+
+
+def test_zstd_truncated():
+ body = b"test 123"
+ compressed_body = zstd.compress(body)
+
+ headers = [(b"Content-Encoding", b"zstd")]
+ with pytest.raises(httpx.DecodingError):
+ httpx.Response(
+ 200,
+ headers=headers,
+ content=compressed_body[1:3],
+ )
+
+
def test_zstd_multiframe():
# test inspired by urllib3 test suite
data = (