Skip to content

CopyObjectResult omits checksum fields and minio-go drops them #68

Description

@Vonng

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

  1. Add the five checksum fields currently supported by SILO plus ChecksumType to CopyObjectResponse.
  2. Populate them from the committed destination ObjectInfo after decrypting checksum metadata with the request headers.
  3. Keep omitempty behavior for objects without checksum metadata.
  4. Register the exported response fields in the compatibility baseline.

minio-go

  1. Add checksum fields and ChecksumType to copyObjectResult.
  2. Copy them into the checksum fields already present on UploadInfo.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions