| 1234567891011121314151617181920212223242526272829303132333435363738 |
- from __future__ import annotations
- import zlib
- from typing import Protocol
- from pyqwest._pyqwest import _BrotliDecompressor, _ZstdDecompressor
- def get_decompressor(encoding: str | None) -> Decompressor:
- match encoding:
- case "br":
- return _BrotliDecompressor()
- case "gzip":
- return GZipDecompressor()
- case "zstd":
- return _ZstdDecompressor()
- case _:
- return IdentityDecompressor()
- class Decompressor(Protocol):
- def feed(self, data: bytes, *, end: bool) -> bytes: ...
- class GZipDecompressor:
- def __init__(self) -> None:
- self._decompressor = zlib.decompressobj(wbits=zlib.MAX_WBITS | 16)
- def feed(self, data: bytes, *, end: bool) -> bytes:
- decompressed = self._decompressor.decompress(data)
- if end:
- decompressed += self._decompressor.flush()
- return decompressed
- class IdentityDecompressor:
- def feed(self, data: bytes, *, end: bool) -> bytes:
- return data
|