You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI自定义中间件引发LocalProtocolError无响应体报错

FastAPI中间件引发204响应的LocalProtocolError异常

问题描述

为FastAPI实现的中间件在处理带响应体的请求时工作正常,但当接口返回无响应体的204 No Content状态码时,会触发LocalProtocolError("Too much data for declared Content-Length")异常。

即使将中间件精简为完全无操作的空实现,添加到应用后依然会抛出该异常;禁用中间件则一切正常。

精简后的无操作中间件代码

from starlette.middleware.base import BaseHTTPMiddleware
from fastapi import FastAPI, Request

class LanguageManagerMiddleware(BaseHTTPMiddleware):

    def __init__(self, app: FastAPI):
        super().__init__(app)


    async def dispatch(self, request: Request, call_next) -> None:
        return await call_next(request)

抛出的异常信息

raise LocalProtocolError("Too much data for declared Content-Length")
h11._util.LocalProtocolError: Too much data for declared Content-Length

触发异常的响应代码

return Response(status_code=HTTP_204_NO_CONTENT)

断点排查细节

在h11/_writers.py的ContentLengthWriter类异常触发位置设置断点后观察到:

class ContentLengthWriter(BodyWriter):
    def __init__(self, length: int) -> None:
        self._length = length

    def send_data(self, data: bytes, write: Writer) -> None:
        self._length -= len(data)
        if self._length < 0:
            raise LocalProtocolError("Too much data for declared Content-Length")
        write(data)
  • 禁用中间件时,传入的data为b''(空字节)
  • 启用中间件时,data变为b'\x1f\x8b\x08\x00\xf6God\x02\xff'(这是一段gzip压缩后的空内容)

请问是什么修改了响应内容?


内容的提问来源于stack exchange,提问作者SercioSoydanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 21:32:09