fix(t244): accept headerless ERP images safely
This commit is contained in:
+21
-10
@@ -4,7 +4,7 @@ title: 兼容 ERP 图片响应缺少媒体类型
|
||||
phase: 2
|
||||
deps:
|
||||
- T-241
|
||||
status: TODO
|
||||
status: DONE
|
||||
created: 2026-07-29
|
||||
context_ref: 24eef29
|
||||
work_branch: null
|
||||
@@ -32,7 +32,8 @@ write_paths:
|
||||
|
||||
- HTTP 2xx 且 `Content-Type` 为 `image/jpeg`、`image/png`、`image/webp` 时沿用现有路径。
|
||||
- `Content-Type` 缺失或规范化后为 `application/octet-stream` 时,只读取正文前最多
|
||||
512 字节并使用 Go 标准库 `http.DetectContentType` 判定真实类型。
|
||||
512 字节;JPEG/PNG 使用 Go 标准库 `http.DetectContentType`,WebP 使用严格
|
||||
`RIFF....WEBP` 文件签名判定。
|
||||
- 嗅探只接受 JPEG、PNG、WebP;空正文、JSON、HTML、SVG、未知二进制继续返回
|
||||
`ErrFreightImageInvalid`。
|
||||
- 已读取的前缀必须无损拼回返回流,后续本地存储继续执行完整解码、声明类型一致性、
|
||||
@@ -55,14 +56,14 @@ write_paths:
|
||||
|
||||
## 验收要点
|
||||
|
||||
- [ ] 缺少 `Content-Type` 的有效 JPEG 保存为本系统归一化 JPEG,图片状态为 `READY`。
|
||||
- [ ] `application/octet-stream` 的有效 PNG/WebP 可以进入既有解码与存储路径。
|
||||
- [ ] 嗅探不会丢失正文前缀,完整内容只读取一次并最终关闭 ERP 响应 body。
|
||||
- [ ] JSON、HTML、SVG、空正文、未知二进制和明确不支持的媒体类型仍被拒绝。
|
||||
- [ ] 已知或流式超限图片仍受 20 MB 限制,不能绕过 asset store。
|
||||
- [ ] 401/403、404、非 2xx、会话清理、固定 URL 和数字 ID 校验不回归。
|
||||
- [ ] 货运同步仍为图片 best-effort,不因单张图片失败回滚业务数据。
|
||||
- [ ] 标准 Go 测试、race、vet 和三个入口构建通过。
|
||||
- [x] 缺少 `Content-Type` 的有效 JPEG 保存为本系统归一化 JPEG,图片状态为 `READY`。
|
||||
- [x] `application/octet-stream` 的有效 PNG/WebP 可以进入既有解码与存储路径。
|
||||
- [x] 嗅探不会丢失正文前缀,完整内容只读取一次并最终关闭 ERP 响应 body。
|
||||
- [x] JSON、HTML、SVG、空正文、未知二进制和明确不支持的媒体类型仍被拒绝。
|
||||
- [x] 已知或流式超限图片仍受 20 MB 限制,不能绕过 asset store。
|
||||
- [x] 401/403、404、非 2xx、会话清理、固定 URL 和数字 ID 校验不回归。
|
||||
- [x] 货运同步仍为图片 best-effort,不因单张图片失败回滚业务数据。
|
||||
- [x] 标准 Go 测试、race、vet 和三个入口构建通过。
|
||||
|
||||
## 边界
|
||||
|
||||
@@ -78,3 +79,13 @@ write_paths:
|
||||
`ERP_IMAGE_INVALID`;受控响应探测确认 HTTP 200 正文为有效 JPEG,但
|
||||
`Content-Type` 和 `Content-Length` 均缺失。根因位于 source adapter 的响应头强校验,
|
||||
不是 ERP 鉴权、数字图片 ID、图片不存在、本地目录或图片体积。
|
||||
- 2026-07-29:适配器仅对缺失媒体类型或 `application/octet-stream` 响应使用固定
|
||||
512 字节 buffered peek;支持头直接沿用,明确 JSON/HTML/SVG 等类型保持 fail-closed。
|
||||
成功流组合 buffered reader 与原 body closer,既不丢前缀,也不复制完整图片。
|
||||
- 2026-07-29:测试确认 Go 1.23 的 `http.DetectContentType` 不识别 WebP,因此增加
|
||||
严格 `RIFF....WEBP` 前缀检测;asset store 随后仍执行完整 WebP 解码、媒体类型一致性、
|
||||
尺寸/像素与 20 MB 校验。端到端测试已将缺失响应头的有效 JPEG 归一化保存并重新解码。
|
||||
- 2026-07-29:`go test ./...`、`go test -race ./...`、`go vet ./...` 和 API、
|
||||
authctl、migrate 三个入口构建通过。测试覆盖缺失/通用媒体类型、JPEG/PNG/WebP、
|
||||
前缀完整性、body 关闭语义、明确非图片、嗅探非图片、已知超限、401/403、404 与非 2xx;
|
||||
自动化验证未访问真实 ERP。
|
||||
|
||||
Reference in New Issue
Block a user