Problem
SILO persists CopyObject checksums and exposes them through HEAD/GET, but its successful CopyObject XML response contains only LastModified and ETag. It omits the checksum elements defined by the S3 CopyObjectResult contract.
An explicit CRC32 copy currently returns:
<CopyObjectResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<LastModified>...</LastModified>
<ETag>...</ETag>
</CopyObjectResult>
even though the destination object has a stored CRC32 checksum.
The gap is inherited from archived upstream MinIO:
- cmd/api-response.go CopyObjectResponse has only ETag and LastModified.
- generateCopyObjectResponse receives no ObjectInfo/checksum data.
There is also a downstream parsing gap in active minio-go:
- copyObjectResult has only ETag and LastModified.
- CopyObject returns UploadInfo without populating its existing checksum fields.
Relationship to #63
#63 fixes which bytes are covered by the stored checksum and explicitly verifies HEAD/GET. This issue is a separate public response-contract change and should not be folded into #63.
Proposed direction
SILO server
- Add the five checksum fields currently supported by SILO plus ChecksumType to CopyObjectResponse.
- Populate them from the committed destination ObjectInfo after decrypting checksum metadata with the request headers.
- Keep omitempty behavior for objects without checksum metadata.
- Register the exported response fields in the compatibility baseline.
minio-go
- Add checksum fields and ChecksumType to copyObjectResult.
- Copy them into the checksum fields already present on UploadInfo.
- Add XML parsing and CopyObject response tests.
MCLI and SILO Console currently ignore the CopyObject UploadInfo checksum fields, so they require no behavioral change; they can consume the corrected library result later without a wire change.
Acceptance criteria
- CopyObjectResult returns the correct CRC32, CRC32C, CRC64NVME, SHA1, or SHA256 value when present.
- ChecksumType is FULL_OBJECT for single-operation copies, including multipart-composite sources.
- Default CRC64NVME is returned for copied objects that had no source checksum.
- SSE-C and SSE-S3 responses return the logical checksum without exposing encrypted metadata.
- No-checksum legacy cases remain omitted through omitempty.
- minio-go CopyObject returns the same values in UploadInfo.
Problem
SILO persists CopyObject checksums and exposes them through HEAD/GET, but its successful CopyObject XML response contains only LastModified and ETag. It omits the checksum elements defined by the S3 CopyObjectResult contract.
An explicit CRC32 copy currently returns:
even though the destination object has a stored CRC32 checksum.
The gap is inherited from archived upstream MinIO:
There is also a downstream parsing gap in active minio-go:
Relationship to #63
#63 fixes which bytes are covered by the stored checksum and explicitly verifies HEAD/GET. This issue is a separate public response-contract change and should not be folded into #63.
Proposed direction
SILO server
minio-go
MCLI and SILO Console currently ignore the CopyObject UploadInfo checksum fields, so they require no behavioral change; they can consume the corrected library result later without a wire change.
Acceptance criteria