From 9119a8708a3b2531aa9db15194f48fa38f149214 Mon Sep 17 00:00:00 2001 From: Rob Levy Date: Mon, 2 Jun 2025 18:48:22 -0400 Subject: [PATCH] Fix(be): Only send metadata if provided --- blob/s3blob/s3blob.go | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/blob/s3blob/s3blob.go b/blob/s3blob/s3blob.go index b0197519e1..69484018c5 100644 --- a/blob/s3blob/s3blob.go +++ b/blob/s3blob/s3blob.go @@ -751,22 +751,11 @@ func (b *bucket) NewTypedWriter(ctx context.Context, key, contentType string, op u.Concurrency = opts.MaxConcurrency } }) - md := make(map[string]string, len(opts.Metadata)) - for k, v := range opts.Metadata { - // See the package comments for more details on escaping of metadata - // keys & values. - k = escape.HexEscape(url.PathEscape(k), func(runes []rune, i int) bool { - c := runes[i] - return c == '@' || c == ':' || c == '=' - }) - md[k] = url.PathEscape(v) - } req := &s3.PutObjectInput{ Bucket: aws.String(b.name), ContentType: aws.String(contentType), Key: aws.String(key), - Metadata: md, } if len(opts.Tags) > 0 { @@ -774,6 +763,21 @@ func (b *bucket) NewTypedWriter(ctx context.Context, key, contentType string, op req.Tagging = aws.String(encodedTags) } + if len(opts.Metadata) > 0 { + md := make(map[string]string, len(opts.Metadata)) + for k, v := range opts.Metadata { + // See the package comments for more details on escaping of metadata + // keys & values. + k = escape.HexEscape(url.PathEscape(k), func(runes []rune, i int) bool { + c := runes[i] + return c == '@' || c == ':' || c == '=' + }) + md[k] = url.PathEscape(v) + } + + req.Metadata = md + } + if opts.IfNotExist { // See https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-writes.html req.IfNoneMatch = aws.String("*")