diff --git a/backend/posix/posix.go b/backend/posix/posix.go index 8af37c37..ee1eaa0e 100644 --- a/backend/posix/posix.go +++ b/backend/posix/posix.go @@ -3779,10 +3779,10 @@ func (p *Posix) GetObject(_ context.Context, input *s3.GetObjectInput) (*s3.GetO var tagCount *int32 tags, err := p.getAttrTags(bucket, object, versionId) - if err != nil && !errors.Is(err, s3err.GetAPIError(s3err.ErrBucketTaggingNotFound)) { + if err != nil { return nil, err } - if tags != nil { + if len(tags) != 0 { tgCount := int32(len(tags)) tagCount = &tgCount } @@ -3859,10 +3859,10 @@ func (p *Posix) GetObject(_ context.Context, input *s3.GetObjectInput) (*s3.GetO var tagCount *int32 tags, err := p.getAttrTags(bucket, object, versionId) - if err != nil && !errors.Is(err, s3err.GetAPIError(s3err.ErrBucketTaggingNotFound)) { + if err != nil { return nil, err } - if tags != nil { + if len(tags) != 0 { tgCount := int32(len(tags)) tagCount = &tgCount } @@ -4084,10 +4084,10 @@ func (p *Posix) HeadObject(ctx context.Context, input *s3.HeadObjectInput) (*s3. var tagCount *int32 tags, err := p.getAttrTags(bucket, object, versionId) - if err != nil && !errors.Is(err, s3err.GetAPIError(s3err.ErrBucketTaggingNotFound)) { + if err != nil { return nil, err } - if tags != nil { + if len(tags) != 0 { tc := int32(len(tags)) tagCount = &tc } @@ -4868,6 +4868,10 @@ func (p *Posix) getAttrTags(bucket, object, versionId string) (map[string]string return nil, s3err.GetAPIError(s3err.ErrNoSuchKey) } if errors.Is(err, meta.ErrNoSuchKey) { + if object != "" { + // return empty tag set for object tagging + return tags, nil + } return nil, s3err.GetAPIError(s3err.ErrBucketTaggingNotFound) } if err != nil { diff --git a/tests/drivers/tags.sh b/tests/drivers/tags.sh index 1a422d54..9eefd946 100644 --- a/tests/drivers/tags.sh +++ b/tests/drivers/tags.sh @@ -18,7 +18,7 @@ check_tags_empty() { if ! check_param_count_v2 "command type" 1 $#; then return 1 fi - if [[ $1 == 'aws' ]]; then + if [ "$1" == 'aws' ] || [ "$1" == 's3api' ]; then # shellcheck disable=SC2154 if [[ $tags == "" ]]; then return 0 diff --git a/tests/integration/GetObjectTagging.go b/tests/integration/GetObjectTagging.go index 2805a247..d1893b2a 100644 --- a/tests/integration/GetObjectTagging.go +++ b/tests/integration/GetObjectTagging.go @@ -48,14 +48,19 @@ func GetObjectTagging_unset_tags(s *S3Conf) error { return err } ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) - _, err = s3client.GetObjectTagging(ctx, &s3.GetObjectTaggingInput{ + res, err := s3client.GetObjectTagging(ctx, &s3.GetObjectTaggingInput{ Bucket: &bucket, Key: &obj, }) cancel() - if err := checkApiErr(err, s3err.GetAPIError(s3err.ErrBucketTaggingNotFound)); err != nil { + if err != nil { return err } + + if len(res.TagSet) != 0 { + return fmt.Errorf("expected empty tag set, instead got %v", res.TagSet) + } + return nil }) } diff --git a/tests/integration/group-tests.go b/tests/integration/group-tests.go index 993b29df..79a54d4a 100644 --- a/tests/integration/group-tests.go +++ b/tests/integration/group-tests.go @@ -779,6 +779,7 @@ func TestFullFlow(ts *TestState) { TestDeleteObjects(ts) TestCopyObject(ts) TestPutObjectTagging(ts) + TestGetObjectTagging(ts) TestDeleteObjectTagging(ts) TestCreateMultipartUpload(ts) TestUploadPart(ts) diff --git a/tests/integration/versioning.go b/tests/integration/versioning.go index e1e7cad2..261d8d8c 100644 --- a/tests/integration/versioning.go +++ b/tests/integration/versioning.go @@ -3419,12 +3419,20 @@ func Versioning_PutGetDeleteObjectTagging_success(s *S3Conf) error { } ctx, cancel = context.WithTimeout(context.Background(), shortTimeout) - _, err = s3client.GetObjectTagging(ctx, &s3.GetObjectTaggingInput{ + r, err := s3client.GetObjectTagging(ctx, &s3.GetObjectTaggingInput{ Bucket: &bucket, Key: &obj, VersionId: versionId, }) cancel() - return checkApiErr(err, s3err.GetAPIError(s3err.ErrBucketTaggingNotFound)) + if err != nil { + return err + } + + if len(r.TagSet) != 0 { + return fmt.Errorf("expected empty tag set, instead got %v", r.TagSet) + } + + return nil }, withVersioning(types.BucketVersioningStatusEnabled)) }