From e8bf46a2fafb544d406f4c7dae381acb9464fb8e Mon Sep 17 00:00:00 2001 From: Angira Kekteeva Date: Wed, 7 Jul 2021 17:52:36 +0300 Subject: [PATCH 1/3] [#131] Add meta to PutObject Signed-off-by: Angira Kekteeva --- api/handler/put.go | 14 ++++++++++++++ api/headers.go | 2 ++ 2 files changed, 16 insertions(+) diff --git a/api/handler/put.go b/api/handler/put.go index cae8a8df..2c054e5f 100644 --- a/api/handler/put.go +++ b/api/handler/put.go @@ -47,11 +47,14 @@ func (h *handler) PutObjectHandler(w http.ResponseWriter, r *http.Request) { return } + metadata := parseMetadata(r) + params := &layer.PutObjectParams{ Bucket: bkt, Object: obj, Reader: r.Body, Size: r.ContentLength, + Header: metadata, } if info, err = h.obj.PutObject(r.Context(), params); err != nil { @@ -74,6 +77,17 @@ func (h *handler) PutObjectHandler(w http.ResponseWriter, r *http.Request) { api.WriteSuccessResponseHeadersOnly(w) } +func parseMetadata(r *http.Request) map[string]string { + res := make(map[string]string) + for k, v := range r.Header { + if strings.HasPrefix(k, api.MetadataPrefix) { + key := strings.TrimPrefix(k, api.MetadataPrefix) + res[key] = v[0] + } + } + return res +} + func (h *handler) CreateBucketHandler(w http.ResponseWriter, r *http.Request) { var ( err error diff --git a/api/headers.go b/api/headers.go index e983a342..b90e4035 100644 --- a/api/headers.go +++ b/api/headers.go @@ -2,6 +2,8 @@ package api // Standard S3 HTTP request/response constants. const ( + MetadataPrefix = "X-Amz-Meta-" + LastModified = "Last-Modified" Date = "Date" ETag = "ETag" From da9a6e4b3354f2aaad19bc534057dc94f11cda10 Mon Sep 17 00:00:00 2001 From: Angira Kekteeva Date: Thu, 8 Jul 2021 23:44:18 +0300 Subject: [PATCH 2/3] [#131] Fix metadata in HeadObject and GetObject Signed-off-by: Angira Kekteeva --- api/handler/get.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/handler/get.go b/api/handler/get.go index e8eb73f1..eaef90a9 100644 --- a/api/handler/get.go +++ b/api/handler/get.go @@ -69,7 +69,7 @@ func writeHeaders(h http.Header, info *layer.ObjectInfo) { h.Set(api.ETag, info.HashSum) for key, val := range info.Headers { - h.Set("X-"+key, val) + h.Set(api.MetadataPrefix+key, val) } } From d5dfc0006ae0678245bd6ea9a15d5901bd108d35 Mon Sep 17 00:00:00 2001 From: Angira Kekteeva Date: Fri, 9 Jul 2021 00:01:33 +0300 Subject: [PATCH 3/3] [#131] Remove metadata from Object in ListObjects Because ListObjects v1 and v2 shouldn't show metadata. Also aws cli doesn't show metadata even we return it. Signed-off-by: Angira Kekteeva --- api/handler/list.go | 2 -- api/handler/response.go | 3 --- 2 files changed, 5 deletions(-) diff --git a/api/handler/list.go b/api/handler/list.go index 9c018e8d..f8324b26 100644 --- a/api/handler/list.go +++ b/api/handler/list.go @@ -202,7 +202,6 @@ func encodeV1(arg *listObjectsArgs, list *layer.ListObjectsInfo) *ListObjectsRes res.Contents = append(res.Contents, Object{ Key: obj.Name, Size: obj.Size, - UserMetadata: obj.Headers, LastModified: obj.Created.Format(time.RFC3339), Owner: Owner{ @@ -265,7 +264,6 @@ func encodeV2(arg *listObjectsArgs, list *layer.ListObjectsInfo) *ListObjectsV2R res.Contents = append(res.Contents, Object{ Key: obj.Name, Size: obj.Size, - UserMetadata: obj.Headers, LastModified: obj.Created.Format(time.RFC3339), Owner: Owner{ diff --git a/api/handler/response.go b/api/handler/response.go index fda7f60d..42f2e556 100644 --- a/api/handler/response.go +++ b/api/handler/response.go @@ -104,9 +104,6 @@ type Object struct { // The class of storage used to store the object. StorageClass string `xml:"StorageClass,omitempty"` - - // UserMetadata user-defined metadata - UserMetadata StringMap `xml:"UserMetadata,omitempty"` } // ObjectVersionResponse container for object version in the response of ListBucketObjectVersionsHandler.