_decompress.py 1010 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. from __future__ import annotations
  2. import zlib
  3. from typing import Protocol
  4. from pyqwest._pyqwest import _BrotliDecompressor, _ZstdDecompressor
  5. def get_decompressor(encoding: str | None) -> Decompressor:
  6. match encoding:
  7. case "br":
  8. return _BrotliDecompressor()
  9. case "gzip":
  10. return GZipDecompressor()
  11. case "zstd":
  12. return _ZstdDecompressor()
  13. case _:
  14. return IdentityDecompressor()
  15. class Decompressor(Protocol):
  16. def feed(self, data: bytes, *, end: bool) -> bytes: ...
  17. class GZipDecompressor:
  18. def __init__(self) -> None:
  19. self._decompressor = zlib.decompressobj(wbits=zlib.MAX_WBITS | 16)
  20. def feed(self, data: bytes, *, end: bool) -> bytes:
  21. decompressed = self._decompressor.decompress(data)
  22. if end:
  23. decompressed += self._decompressor.flush()
  24. return decompressed
  25. class IdentityDecompressor:
  26. def feed(self, data: bytes, *, end: bool) -> bytes:
  27. return data