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
相关产品推荐
相关产品推荐

