mirror of
https://github.com/versity/versitygw.git
synced 2026-01-09 04:53:10 +00:00
fix: Fixes #186, Fixed object metadata storing and retrieval flow in PutObject and GetObject actions
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user