aboutsummaryrefslogtreecommitdiff
path: root/weed/server/filer_server_handlers_write_autochunk.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/server/filer_server_handlers_write_autochunk.go')
-rw-r--r--weed/server/filer_server_handlers_write_autochunk.go20
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)
}
}
}