{"id":"3dbfe324c0b041c5","repo":"aio-libs/aiohttp","slug":"can-not-decode-content-encoding-brotli-br-plea","errorCode":null,"errorMessage":"Can not decode content-encoding: brotli (br). Please install `Brotli`","messagePattern":"Can not decode content-encoding: brotli \\(br\\)\\. Please install `Brotli`","errorType":"exception","errorClass":"ContentEncodingError","httpStatus":400,"severity":"error","filePath":"aiohttp/http_parser.py","lineNumber":1138,"sourceCode":"class DeflateBuffer:\n    \"\"\"DeflateStream decompress stream and feed data into specified stream.\"\"\"\n\n    def __init__(\n        self,\n        out: StreamReader,\n        encoding: str | None,\n        max_decompress_size: int = DEFAULT_CHUNK_SIZE,\n    ) -> None:\n        self.out = out\n        self.size = 0\n        out.total_compressed_bytes = self.size\n        self.encoding = encoding\n        self._started_decoding = False\n\n        self.decompressor: BrotliDecompressor | ZLibDecompressor | ZSTDDecompressor\n        if encoding == \"br\":\n            if not HAS_BROTLI:\n                raise ContentEncodingError(\n                    \"Can not decode content-encoding: brotli (br). \"\n                    \"Please install `Brotli`\"\n                )\n            self.decompressor = BrotliDecompressor()\n        elif encoding == \"zstd\":\n            if not HAS_ZSTD:\n                raise ContentEncodingError(\n                    \"Can not decode content-encoding: zstandard (zstd). \"\n                    \"Please install `backports.zstd`\"\n                )\n            self.decompressor = ZSTDDecompressor()\n        else:\n            self.decompressor = ZLibDecompressor(encoding=encoding)\n\n        self._max_decompress_size = max_decompress_size\n\n    def set_exception(\n        self,","sourceCodeStart":1120,"sourceCodeEnd":1156,"githubUrl":"https://github.com/aio-libs/aiohttp/blob/c0ef574e29109210e96e652771ae4e7b88615fa4/aiohttp/http_parser.py#L1120-L1156","documentation":"ContentEncodingError raised by DeflateBuffer.__init__ when a response advertises Content-Encoding: br (brotli) but the optional Brotli dependency is not installed (HAS_BROTLI is False). aiohttp cannot decompress the body without the library.","triggerScenarios":"Client sends Accept-Encoding including br, server responds with Content-Encoding: br, and the runtime lacks the Brotli package. DeflateBuffer detects encoding == 'br' and HAS_BROTLI False and raises immediately.","commonSituations":"Fresh aiohttp install without extras; deployment image missing brotli; CI env without optional deps; server suddenly advertising br after a config change.","solutions":["Install Brotli: `pip install brotli` (or aiohttp[speedups] / Brotli).","Restrict the Accept-Encoding you send (disable br) if you cannot install Brotli.","Set auto_decompress=False on the client/server to receive raw bytes."],"exampleFix":"// before\n#   resp = await session.get(url)  # server sends br, no brotli installed\n\n# after - option 1: install dependency\n#   pip install Brotli\n# option 2: disable brotli in accept-encoding\nheaders = {'Accept-Encoding': 'gzip, deflate'}\nresp = await session.get(url, headers=headers)\n# option 3: skip auto-decompress\nsession = aiohttp.ClientSession(auto_decompress=False)","handlingStrategy":"fallback","validationCode":"try:\n    import brotli  # noqa\n    HAS_BROTLI = True\nexcept ImportError:\n    HAS_BROTLI = False\n\nasync def safe_get(session, url):\n    headers = {'Accept-Encoding': 'gzip, deflate'} if not HAS_BROTLI else {}\n    return await session.get(url, headers=headers)","typeGuard":null,"tryCatchPattern":"from aiohttp.http_exceptions import ContentEncodingError\ntry:\n    body = await resp.read()\nexcept ContentEncodingError as e:\n    if 'brotli' in str(e):\n        # retry without br in Accept-Encoding\n        ...","preventionTips":["Pin optional compression deps in requirements (Brotli, zstandard).","Only advertise encodings you can decode in Accept-Encoding."],"tags":["http","compression","brotli","dependency","response"],"analyzedSha":"c0ef574e29109210e96e652771ae4e7b88615fa4","analyzedAt":"2026-08-04T19:51:05.467Z","schemaVersion":2}