
RuntimeError: Response content longer than Content-Length`, raised inside uvicorn while `BaseHTTPMiddleware.__call__` is re-sending a body chunk. The client has already received a `200` status l
快速结论:此报错通常出现在 Open WebUI 代理流式响应(如 TTS 音频路由 /api/v1/audio/speech)时,原因是 SecurityHeadersMiddleware 是唯一尚未迁移的 BaseHTTPMiddleware,该中间件在处理流式响应时与 uvicorn 的 content-length 校验发生冲突,导致响应内容长度不一致。优先排查 SecurityHeadersMiddleware 是否正确迁移为纯 ASGI 中间件。
问题场景
用户在 Open WebUI 中使用 OpenAI 兼容的 TTS 后端(AUDIO_TTS_ENGINE=openai),通过 Docker Compose (ghcr.io/open-webui/open-webui:main) 部署单实例,无反向代理。当多个并发请求访问 POST /api/v1/audio/speech 且每次请求使用不同的 input 文本时,TTS 响应会中断,UI 上点击扬声器图标后图标短时间翻转然后复位,无错误提示。
报错原文
Exception in ASGI application
+ Exception Group Traceback (most recent call last):
...
| Traceback (most recent call last):
RuntimeError: Response content longer than Content-Length`, raised inside uvicorn while `BaseHTTPMiddleware.__call__` is re-sending a body chunk. The client has already received a `200` status l
原因分析
可能原因:Open WebUI 中 SecurityHeadersMiddleware 是唯一仍在使用的 BaseHTTPMiddleware,其余中间件已迁移至纯 ASGI 模式(位于 open_webui/utils/asgi_middleware.py)。BaseHTTPMiddleware 在处理流式响应时已知存在缺陷,尤其是在重新发送 body chunk 时与 uvicorn 的 content-length 校验冲突,导致 RuntimeError: Response content longer than Content-Length。此问题间歇性出现,在并发 ≥ 8 时更容易触发(用户报告约 1/93 的实际请求失败率)。
环境排查
- Open WebUI 版本:v0.9.6(镜像 digest
sha256:7f1b0a1a50cfbac23da3b16f96bc968fd757b26dc9e54e93813d61768ea9184e,构建于 2026-06-02) - 部署方式:Docker Compose,无反向代理
- TTS 引擎:OpenAI 兼容后端(
AUDIO_TTS_ENGINE=openai) - 安全头环境变量:
CACHE_CONTROL、HSTS、PERMISSIONS_POLICY等均未设置,set_security_headers()返回空字典{} - 数据库:SQLite(未设置
DATABASE_URL)
解决步骤
- 检查
SecurityHeadersMiddleware实现方式:确认该中间件是否仍基于BaseHTTPMiddleware,而非纯 ASGI 中间件。打开open_webui/utils/asgi_middleware.py查看实现。 - 升级 Open WebUI 到包含修复的版本:Issue 作者已提交 PR #26924,将
SecurityHeadersMiddleware转换为纯 ASGI 中间件,安全头逻辑不变。可优先尝试拉取该分支测试(如需编译运行),或等待官方 dev 分支合并后使用ghcr.io/open-webui/open-webui:dev镜像。 - 临时规避措施:如果无法立即升级,可尝试降低并发请求量,或为 TTS 路由添加请求排队逻辑,减少同时触发响应流冲突的概率。
- 确认所有环境变量:确保
AUDIO_TTS_ENGINE等配置正确,并验证数据库中的audio配置键为空({}),避免残留配置干扰。
验证方法
部署修复后的版本(PR #26924 分支或后续 dev 镜像),使用相同的高并发场景(并发 ≥ 8,不同 TTS 输入文本)测试 POST /api/v1/audio/speech 路由,确认不再出现 RuntimeError: Response content longer than Content-Length 报错,且所有 TTS 音频响应正常返回。可通过 TTS 后端日志确认每次请求都成功完成,问题仅出现在 Open WebUI 的转发路径中。


![[问与答] codex 的重置卡过期是废弃还是自动重置一次](https://www.chat-gpts.plus/wp-content/uploads/2026/07/ai_cover_4-335-768x403.jpg)
