diff options
Diffstat (limited to 'weed/server/filer_server_handlers_write_autochunk.go')
| -rw-r--r-- | weed/server/filer_server_handlers_write_autochunk.go | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go index 92ee68796..76e320908 100644 --- a/weed/server/filer_server_handlers_write_autochunk.go +++ b/weed/server/filer_server_handlers_write_autochunk.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "net/http" + "net/url" "os" "path" "strconv" @@ -462,12 +463,19 @@ func SaveAmzMetaData(r *http.Request, existing map[string][]byte, isReplace bool } if tags := r.Header.Get(s3_constants.AmzObjectTagging); tags != "" { - for _, v := range strings.Split(tags, "&") { - tag := strings.Split(v, "=") - if len(tag) == 2 { - metadata[s3_constants.AmzObjectTagging+"-"+tag[0]] = []byte(tag[1]) - } else if len(tag) == 1 { - metadata[s3_constants.AmzObjectTagging+"-"+tag[0]] = nil + // Use url.ParseQuery for robust parsing and automatic URL decoding + parsedTags, err := url.ParseQuery(tags) + if err != nil { + glog.Errorf("Failed to parse S3 tags '%s': %v", tags, err) + } else { + for key, values := range parsedTags { + // According to S3 spec, if a key is provided multiple times, the last value is used. + // A tag value can be an empty string but not nil. + value := "" + if len(values) > 0 { + value = values[len(values)-1] + } + metadata[s3_constants.AmzObjectTagging+"-"+key] = []byte(value) } } } |
