Skip to content

v1.3.109 — 修复 CSP blob: 拦截导致游乐场图生图无法发送 (P1)

Choose a tag to compare

@lza6 lza6 released this 08 Oct 10:18
· 16 commits to main since this release

v1.3.109 — 修复:CSP 拦截 blob: 导致游乐场图生图「点发送无反应」(P1)

问题

生产环境游乐场中选择参考图后点击「发送」无任何反应:无请求发出、无报错、文字与附件仍留在输入框。

根因链

  1. Caddy CSP 的 connect-src 'self' 未放行 blob: → 游乐场把附件 blob: URL fetch 成 data: URL 时被 CSP 拒绝;
  2. web/src/components/ai-elements/prompt-input.tsx 的 Promise.all(...).catch(() => {}) 静默吞掉该拒绝 → onSubmit 永不调用;
  3. 同时 img-src 缺 blob: → 附件缩略图预览也不显示。

修复

  • deploy/Caddyfile.example:img-src 与 connect-src 各放行 blob:,并补充注释说明二者缺失各自的症状;
  • prompt-input.tsx:附件转换失败不再静默吞错,改为上报 onError(新增 code: 'attachment_conversion');
  • playground-input.tsx:接住 onError 并 toast 提示,用户可见可诊断;
  • i18n 7 语言新增对应文案(按行插入,未做 JSON 重序列化);
  • 新增回归测试 prompt-input-attachment.test.tsx(2 例):blob 读取失败必须上报 onError 且不得调用 onSubmit;正常路径应提交转换后的附件。

验证

  • 生产 Caddyfile 已同步修改并 reload,新 CSP 响应头经实测确认生效;
  • Playwright 真实浏览器 E2E(打生产):图生图请求成功发出,请求体内联 data:image/png;base64 的 image_url part,结果 {thumb:1, delivered:1, userText:true, rawMd:false};
  • 单元测试:NODE_OPTIONS=--max-old-space-size=3072 bunx vitest run src/components/ai-elements/__tests__/prompt-input-attachment.test.tsx → 2 passed;
  • typecheck / lint:改动文件无新增错误。

部署

已蓝绿零停机部署至生产(new-api:v1.3.109),公网 200,/api/status 返回 1.3.109。