From cc285356182b4317ca509f59508743408de666dc Mon Sep 17 00:00:00 2001 From: jonaustin09 Date: Fri, 4 Aug 2023 01:32:21 +0400 Subject: [PATCH] fix: Fixes #186, Fixed object metadata storing and retrieval flow in PutObject and GetObject actions --- backend/posix/posix.go | 14 +++++++++----- integration/tests.go | 16 +++++++++++++--- integration/utils.go | 12 ++++++++++++ 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/backend/posix/posix.go b/backend/posix/posix.go index 35dff8b..f4264f1 100644 --- a/backend/posix/posix.go +++ b/backend/posix/posix.go @@ -66,6 +66,7 @@ const ( metaTmpMultipartDir = metaTmpDir + "/multipart" onameAttr = "user.objname" tagHdr = "X-Amz-Tagging" + metaHdr = "X-Amz-Meta" contentTypeHdr = "content-type" contentEncHdr = "content-encoding" emptyMD5 = "d41d8cd98f00b204e9800998ecf8427e" @@ -387,19 +388,21 @@ func loadUserMetaData(path string, m map[string]string) (contentType, contentEnc if err != nil || len(ents) == 0 { return } + fmt.Println(ents) for _, e := range ents { if !isValidMeta(e) { continue } b, err := xattr.Get(path, e) if err == syscall.ENODATA { - m[strings.TrimPrefix(e, "user.")] = "" + m[strings.TrimPrefix(e, fmt.Sprintf("user.%v.", metaHdr))] = "" continue } if err != nil { continue } - m[strings.TrimPrefix(e, "user.")] = string(b) + fmt.Println(b) + m[strings.TrimPrefix(e, fmt.Sprintf("user.%v.", metaHdr))] = string(b) } b, err := xattr.Get(path, "user."+contentTypeHdr) @@ -424,7 +427,7 @@ func loadUserMetaData(path string, m map[string]string) (contentType, contentEnc } func isValidMeta(val string) bool { - if strings.HasPrefix(val, "user.X-Amz-Meta") { + if strings.HasPrefix(val, "user."+metaHdr) { return true } if strings.EqualFold(val, "user.Expires") { @@ -913,7 +916,7 @@ func (p *Posix) PutObject(ctx context.Context, po *s3.PutObjectInput) (string, e } for k, v := range po.Metadata { - xattr.Set(name, "user."+k, []byte(v)) + xattr.Set(name, fmt.Sprintf("user.%v.%v", metaHdr, k), []byte(v)) } // set etag attribute to signify this dir was specifically put @@ -950,7 +953,7 @@ func (p *Posix) PutObject(ctx context.Context, po *s3.PutObjectInput) (string, e } for k, v := range po.Metadata { - xattr.Set(name, "user."+k, []byte(v)) + xattr.Set(name, fmt.Sprintf("user.%v.%v", metaHdr, k), []byte(v)) } if tagsStr != "" { @@ -1117,6 +1120,7 @@ func (p *Posix) GetObject(_ context.Context, input *s3.GetObjectInput, writer io userMetaData := make(map[string]string) contentType, contentEncoding := loadUserMetaData(objPath, userMetaData) + fmt.Println(userMetaData) b, err := xattr.Get(objPath, etagkey) etag := string(b) diff --git a/integration/tests.go b/integration/tests.go index 60b749b..d5b56bc 100644 --- a/integration/tests.go +++ b/integration/tests.go @@ -90,12 +90,17 @@ func TestPutGetObject(s *S3Conf) { rand.Read(data) csum := sha256.Sum256(data) r := bytes.NewReader(data) + meta := map[string]string{ + "key1": "val1", + "key2": "val2", + } ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) _, err = s3client.PutObject(ctx, &s3.PutObjectInput{ - Bucket: &bucket, - Key: &obj, - Body: r, + Bucket: &bucket, + Key: &obj, + Body: r, + Metadata: meta, }) cancel() if err != nil { @@ -125,6 +130,11 @@ func TestPutGetObject(s *S3Conf) { failF("%v: %v", testname, err) return } + fmt.Println(out.Metadata) + if !areMapsSame(out.Metadata, meta) { + failF("%v: incorrect object metadata", testname) + return + } defer out.Body.Close() if out.ContentLength != int64(datalen) { diff --git a/integration/utils.go b/integration/utils.go index 02f4c43..46ba3db 100644 --- a/integration/utils.go +++ b/integration/utils.go @@ -161,3 +161,15 @@ func getString(str *string) string { } return *str } + +func areMapsSame(mp1, mp2 map[string]string) bool { + if len(mp1) != len(mp2) { + return false + } + for key, val := range mp1 { + if mp2[key] != val { + return false + } + } + return true +}