|  | 
| 26 | 26 | 
 | 
| 27 | 27 | from . import hdrs | 
| 28 | 28 | from .base_protocol import BaseProtocol | 
| 29 |  | -from .compression_utils import HAS_BROTLI, BrotliDecompressor, ZLibDecompressor | 
|  | 29 | +from .compression_utils import ( | 
|  | 30 | +    HAS_BROTLI, | 
|  | 31 | +    HAS_ZSTD, | 
|  | 32 | +    BrotliDecompressor, | 
|  | 33 | +    ZLibDecompressor, | 
|  | 34 | +    ZSTDDecompressor, | 
|  | 35 | +) | 
| 30 | 36 | from .helpers import ( | 
| 31 | 37 |     _EXC_SENTINEL, | 
| 32 | 38 |     DEBUG, | 
| @@ -527,7 +533,7 @@ def parse_headers( | 
| 527 | 533 |         enc = headers.get(hdrs.CONTENT_ENCODING) | 
| 528 | 534 |         if enc: | 
| 529 | 535 |             enc = enc.lower() | 
| 530 |  | -            if enc in ("gzip", "deflate", "br"): | 
|  | 536 | +            if enc in ("gzip", "deflate", "br", "zstd"): | 
| 531 | 537 |                 encoding = enc | 
| 532 | 538 | 
 | 
| 533 | 539 |         # chunking | 
| @@ -930,14 +936,21 @@ def __init__(self, out: StreamReader, encoding: Optional[str]) -> None: | 
| 930 | 936 |         self.encoding = encoding | 
| 931 | 937 |         self._started_decoding = False | 
| 932 | 938 | 
 | 
| 933 |  | -        self.decompressor: Union[BrotliDecompressor, ZLibDecompressor] | 
|  | 939 | +        self.decompressor: Union[BrotliDecompressor, ZLibDecompressor, ZSTDDecompressor] | 
| 934 | 940 |         if encoding == "br": | 
| 935 | 941 |             if not HAS_BROTLI: | 
| 936 | 942 |                 raise ContentEncodingError( | 
| 937 | 943 |                     "Can not decode content-encoding: brotli (br). " | 
| 938 | 944 |                     "Please install `Brotli`" | 
| 939 | 945 |                 ) | 
| 940 | 946 |             self.decompressor = BrotliDecompressor() | 
|  | 947 | +        elif encoding == "zstd": | 
|  | 948 | +            if not HAS_ZSTD: | 
|  | 949 | +                raise ContentEncodingError( | 
|  | 950 | +                    "Can not decode content-encoding: zstandard (zstd). " | 
|  | 951 | +                    "Please install `zstandard`" | 
|  | 952 | +                ) | 
|  | 953 | +            self.decompressor = ZSTDDecompressor() | 
| 941 | 954 |         else: | 
| 942 | 955 |             self.decompressor = ZLibDecompressor(encoding=encoding) | 
| 943 | 956 | 
 | 
|  | 
0 commit comments