From 1cea4c8247e49417a83a812a1be0987d18499992 Mon Sep 17 00:00:00 2001 From: niksis02 Date: Tue, 18 Mar 2025 19:31:52 +0400 Subject: [PATCH] fix: Reuses the ParseObjectTags method to parse the object tags in PutObject and CreateMultipartUpload. Puts the `backend.ParseObjectTags` method in use to parse the object tagging for `PutObject` and `CreateMultipartUpload` to not repeat the same logic. --- backend/common.go | 6 +++--- backend/posix/posix.go | 39 ++++++++------------------------------- 2 files changed, 11 insertions(+), 34 deletions(-) diff --git a/backend/common.go b/backend/common.go index f571d475..7795447a 100644 --- a/backend/common.go +++ b/backend/common.go @@ -214,12 +214,12 @@ func ParseCopySource(copySourceHeader string) (string, string, string, error) { // ParseObjectTags parses the url encoded input string into // map[string]string key-value tag set func ParseObjectTags(t string) (map[string]string, error) { - tagging := make(map[string]string) - if t == "" { - return tagging, nil + return nil, nil } + tagging := make(map[string]string) + tagParts := strings.Split(t, "&") for _, prt := range tagParts { p := strings.Split(prt, "=") diff --git a/backend/posix/posix.go b/backend/posix/posix.go index 79dab618..69805b9b 100644 --- a/backend/posix/posix.go +++ b/backend/posix/posix.go @@ -1198,20 +1198,9 @@ func (p *Posix) CreateMultipartUpload(ctx context.Context, mpu s3response.Create } // parse object tags - tagsStr := getString(mpu.Tagging) - tags := make(map[string]string) - if tagsStr != "" { - tagParts := strings.Split(tagsStr, "&") - for _, prt := range tagParts { - p := strings.Split(prt, "=") - if len(p) != 2 { - return s3response.InitiateMultipartUploadResult{}, s3err.GetAPIError(s3err.ErrInvalidTag) - } - if len(p[0]) > 128 || len(p[1]) > 256 { - return s3response.InitiateMultipartUploadResult{}, s3err.GetAPIError(s3err.ErrInvalidTag) - } - tags[p[0]] = p[1] - } + tags, err := backend.ParseObjectTags(getString(mpu.Tagging)) + if err != nil { + return s3response.InitiateMultipartUploadResult{}, err } // generate random uuid for upload id @@ -1254,7 +1243,7 @@ func (p *Posix) CreateMultipartUpload(ctx context.Context, mpu s3response.Create } // set object tagging - if tagsStr != "" { + if tags != nil { err := p.PutObjectTagging(ctx, bucket, filepath.Join(objdir, uploadID), tags) if err != nil { // cleanup object if returning error @@ -2679,9 +2668,6 @@ func (p *Posix) PutObject(ctx context.Context, po s3response.PutObjectInput) (s3 if po.Key == nil { return s3response.PutObjectOutput{}, s3err.GetAPIError(s3err.ErrNoSuchKey) } - - tagsStr := getString(po.Tagging) - tags := make(map[string]string) _, err := os.Stat(*po.Bucket) if errors.Is(err, fs.ErrNotExist) { return s3response.PutObjectOutput{}, s3err.GetAPIError(s3err.ErrNoSuchBucket) @@ -2690,18 +2676,9 @@ func (p *Posix) PutObject(ctx context.Context, po s3response.PutObjectInput) (s3 return s3response.PutObjectOutput{}, fmt.Errorf("stat bucket: %w", err) } - if tagsStr != "" { - tagParts := strings.Split(tagsStr, "&") - for _, prt := range tagParts { - p := strings.Split(prt, "=") - if len(p) != 2 { - return s3response.PutObjectOutput{}, s3err.GetAPIError(s3err.ErrInvalidTag) - } - if len(p[0]) > 128 || len(p[1]) > 256 { - return s3response.PutObjectOutput{}, s3err.GetAPIError(s3err.ErrInvalidTag) - } - tags[p[0]] = p[1] - } + tags, err := backend.ParseObjectTags(getString(po.Tagging)) + if err != nil { + return s3response.PutObjectOutput{}, err } name := filepath.Join(*po.Bucket, *po.Key) @@ -2952,7 +2929,7 @@ func (p *Posix) PutObject(ctx context.Context, po s3response.PutObjectInput) (s3 } // Set object tagging - if tagsStr != "" { + if tags != nil { err := p.PutObjectTagging(ctx, *po.Bucket, *po.Key, tags) if errors.Is(err, fs.ErrNotExist) { return s3response.PutObjectOutput{