Fix S3 object tagging issue #7589

- Add X-Amz-Tagging header parsing in putToFiler function for PUT object operations
- Store tags with X-Amz-Tagging- prefix in entry.Extended metadata
- Add comprehensive test suite for S3 object tagging functionality
- Tests cover upload tagging, API operations, special characters, and edge cases
This commit is contained in:
Chris Lu
2025-12-01 15:19:42 -08:00
parent 61c0514a1c
commit 8c585a9682
4 changed files with 534 additions and 2 deletions

View File

@@ -8,6 +8,7 @@ import (
"fmt"
"io"
"net/http"
"net/url"
"path/filepath"
"strconv"
"strings"
@@ -548,6 +549,28 @@ func (s3a *S3ApiServer) putToFiler(r *http.Request, filePath string, dataReader
}
}
// Parse and store object tags from X-Amz-Tagging header
// Fix for GitHub issue #7589: Tags sent during object upload were not being stored
if tagging := r.Header.Get(s3_constants.AmzObjectTagging); tagging != "" {
parsedTags, err := url.ParseQuery(tagging)
if err != nil {
glog.Warningf("putToFiler: Invalid S3 tag format in header '%s': %v", tagging, err)
return "", s3err.ErrInvalidTag, SSEResponseMetadata{}
}
for key, values := range parsedTags {
if len(values) > 1 {
glog.Warningf("putToFiler: Duplicate tag key '%s' in header", key)
return "", s3err.ErrInvalidTag, SSEResponseMetadata{}
}
value := ""
if len(values) > 0 {
value = values[0]
}
entry.Extended[s3_constants.AmzObjectTagging+"-"+key] = []byte(value)
}
glog.V(3).Infof("putToFiler: stored %d tags from X-Amz-Tagging header", len(parsedTags))
}
// Set SSE-C metadata
if customerKey != nil && len(sseIV) > 0 {
// Store IV as RAW bytes (matches filer behavior - filer decodes base64 headers and stores raw bytes)
@@ -680,9 +703,9 @@ func filerErrorToS3Error(err error) s3err.ErrorCode {
if err == nil {
return s3err.ErrNone
}
errString := err.Error()
switch {
case errString == constants.ErrMsgBadDigest:
return s3err.ErrBadDigest