3.9 KiB
3.9 KiB
v0.29.0 通用签名读取验收
范围:Local、S3/R2、OSS 的签名读取选项和本地范围读取。接口不包含业务身份、租户、分享记录、数据库、撤销或固定有效期。旧 Presigner、旧本地链接和默认下载行为兼容。
本地回归
2026-09-30,macOS arm64,Go 1.27.1:
GO_OMNI_SCAFFOLD_INTEGRATION=1 go test -race -count=1 ./...:57 个测试包通过,apigen 集成包 123.143 秒。GOTOOLCHAIN=go1.22.12 GO_OMNI_SCAFFOLD_INTEGRATION=1 go test -count=1 ./...:57 个测试包通过,apigen 集成包 113.212 秒。go vet ./...、go build ./...、git diff --check:通过。go run ./examples/signedRead -check:真实回环 HTTP 预览、中文文件名、下载、HEAD、Range 通过。python3 scripts/verifyUploads.py --output reports/signedReadMinio.json:真实隔离 MinIO 的新读取选项、原上传/分片与存储契约通过,见 报告和日志。独立容器无外部网络、不映射端口,已清理,原有容器保持运行。
首次 MinIO 回归中,原有契约故意发送错误长度触发 SDK 重试退避,耗尽契约的 10 秒预算。测试专用 client 改为 MaxRetries=1,与现有协议测试一致;生产 client 配置未变,修正后通过。
覆盖内容
- 默认 attachment、inline、可选 MIME、ASCII/中文/特殊字符文件名,拒绝 CR/LF、控制字符、路径、过长参数、非法 MIME 和 disposition。
- 本地签名绑定版本、key、有效期、全部响应选项,重复参数、未知参数、签名篡改、版本剥离和旧下载 URL 注入 inline 均拒绝,拒绝前不读存储。
- 30 分钟实际签名到期时间、TTL 上下限、精确到期边界、取消 context;过期 Range/HEAD/条件请求不得读取文件或返回缓存命中。
- 本地真实文件 GET/HEAD 内容长度、前缀/后缀/开放区间/截断/多段范围、206/416,Seek 不暴露元数据,按范围读取而非全文件缓冲;顺序读取 Store 回退完整 200。
- 错误及条件响应保持 private/no-store,HEAD 成功与失败均无响应体。
- OSS SDK V1/V4 独立重新计算签名,验证响应头在签名前加入,中文文件名、配置域名、到期时间及选项篡改;拒绝未签名配置。S3/R2 验证原生 SDK 查询参数与实际到期时间。
- MinIO 实际 GET/Range 的响应头、字节和状态正确,篡改 disposition/type/cache/expiry 被服务端拒绝。
验证边界
OSS/R2 未使用云账号实测;SDK/MinIO 验证不能代替实际桶和域名验收。OSS 默认域名可能强制下载,其响应头覆盖受平台规则限制,需部署方检查实际 200/206。
浏览器控制工具不可用,隔离 Chrome/Chromium 截图尝试未获得成功渲染证据,因此不计为浏览器预览通过。真实 PDF 的 HTTP 响应已检查,浏览器视觉预览与实际云域名接入仍需项目侧回归。
发布验收
三个独立空模块缓存安装远程固定 v0.29.0-preview,均无本地 replace,全部通过:
- 综合远程报告:107 项检查、11 组生成消费者,138.76 秒。包括下载模块中的签名读取、旧链接兼容、篡改/过期、范围读取、OSS V1/V4、S3/R2 和真实 HTTP 示例,以及原有生成器、生命周期、配置、i18n 等回归。
- 通用工程报告:30 项,31.82 秒。
- 混合工作区报告:16 项,25.55 秒。
首次综合检查因生成的基础消费者未引入可选云存储 SDK,缺少相应 go.sum 条目而中止。验收脚本增加固定版本的可选适配器依赖准备后,从空缓存重跑全部通过;框架发布代码未修改。
三次下载 checksum 一致:h1:FV3AzbYWBFQ7qnF3T2FWypGv2PSecCJfcOuNa2yKzRk=。固定标签对应代码 f0c62152d72b1b50672c29f5191ad88f8be3eee4。验收脚本、说明和远程报告另行提交,不移动标签。