fix: Fixes #186, Fixed object metadata storing and retrieval flow in PutObject and GetObject actions

This commit is contained in:
jonaustin09
2023-08-04 01:32:21 +04:00
parent 67fc857cdd
commit cc28535618
3 changed files with 34 additions and 8 deletions

View File

@@ -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)

View File

@@ -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) {

View File

@@ -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
}