跳转到主要内容

为什么 CompleteMultipartUpload 必须返回 ChecksumType:PR #57 评审记录

Shooks(@Dansyuqri)贡献的 PR #57 修复了 #47,已包含在 Server 20260903 中。 本文记录响应契约;具体生产部署是否包含修复,仍取决于实际运行的制品与安装。

缺陷与范围

对 @cbornet 报告的 #31 的调查拆出了两个问题。 CRC32 分段上传完成的数据路径由 c8590413f 与 3e14733f1 修复。 成功完成后,对象保存了校验和类型,HEAD 也可返回,但完成响应的 XML 丢弃了这个类型, 导致 SDK 获得有效校验和值,却没有 ChecksumType。

这不会破坏存储的数据,但使客户端无法直接区分整对象校验和与组合校验和。 仅凭 Base64 编码,消费者不能确定应该复现哪一种计算。

响应契约

存储状态 完成响应
整对象校验和 ChecksumType=FULL_OBJECT 及对应算法值
分段组合校验和 ChecksumType=COMPOSITE 及对应算法值
没有额外校验和 不输出 ChecksumType 元素,也不伪造校验和

S3 完成上传 API定义了这两种类型。 ETag 是独立字段,不能替代额外的 S3 校验和。

实现与证据

生产代码在 CompleteMultipartUploadResponse 中添加带 xml:"ChecksumType,omitempty" 的 ChecksumType string 字段,并在解码存储校验和元数据后赋值为 cs[xhttp.AmzChecksumType]。 生成器复用其他校验和 API 使用的同一份状态,不重新计算内容,也不根据分片数量推断类型。

合并提交包含整对象、组合与无校验和三种响应测试。 原改动还在当时的 rebrand 清单登记了导出字段;该清单的导出符号部分随后由 bc3b35f97 删除,不能视为当前公开 API 兼容性保证。

兼容性与相邻改动

忽略未知 XML 元素的客户端继续兼容。本修复没有增加算法、修改存储元数据格式、迁移对象或绕过校验。 UploadPart 修复与完成时校验 属于独立改动,也已进入 Server 20260903。其中 CRC64NVME + COMPOSITE 会被拒绝,不再静默规范化。