Describe the bug
put_object_stream_builder applies per-upload metadata and custom headers when an upload uses single-part PutObject. When the payload reaches CHUNK_SIZE and switches to multipart upload, those headers are not sent on CreateMultipartUpload.
S3-compatible services require completed-object configuration such as user metadata, cache control, storage class, and SSE-S3/KMS headers during multipart initiation. The upload succeeds, but the completed object silently loses that configuration.
To Reproduce
- Start an S3-compatible MinIO instance and create a bucket.
- Upload synthetic byte payloads using
put_object_stream_builder with custom metadata.
- Check the completed object's metadata with
HEAD.
| Payload size |
Upload path |
Metadata |
CHUNK_SIZE - 1 |
single-part |
present |
CHUNK_SIZE |
multipart |
missing |
above CHUNK_SIZE |
multipart |
missing |
Expected behavior
Streaming-builder headers should be signed and sent on CreateMultipartUpload, so completed-object metadata and other initiation-time configuration survive at and above the multipart boundary.
Environment
- Rust: 1.97.1
- rust-s3: 0.37.2
- Storage: MinIO-compatible S3 endpoint
Additional context
This is the multipart-specific gap related to #408. A previous implementation direction was discussed in #446. The consumer-visible reproduction is brunojppb/turbo-cache-server#620, and the proposed fix is #471.
Describe the bug
put_object_stream_builderapplies per-upload metadata and custom headers when an upload uses single-partPutObject. When the payload reachesCHUNK_SIZEand switches to multipart upload, those headers are not sent onCreateMultipartUpload.S3-compatible services require completed-object configuration such as user metadata, cache control, storage class, and SSE-S3/KMS headers during multipart initiation. The upload succeeds, but the completed object silently loses that configuration.
To Reproduce
put_object_stream_builderwith custom metadata.HEAD.CHUNK_SIZE - 1CHUNK_SIZECHUNK_SIZEExpected behavior
Streaming-builder headers should be signed and sent on
CreateMultipartUpload, so completed-object metadata and other initiation-time configuration survive at and above the multipart boundary.Environment
Additional context
This is the multipart-specific gap related to #408. A previous implementation direction was discussed in #446. The consumer-visible reproduction is brunojppb/turbo-cache-server#620, and the proposed fix is #471.