diff --git a/backend/posix/posix.go b/backend/posix/posix.go index 5ed78731..60bc408b 100644 --- a/backend/posix/posix.go +++ b/backend/posix/posix.go @@ -2750,7 +2750,7 @@ func (p *Posix) GetObject(_ context.Context, input *s3.GetObjectInput) (*s3.GetO return nil, s3err.GetAPIError(s3err.ErrNoSuchKey) } - if versionId != "" { + if p.versioningEnabled() { isDelMarker, err := p.isObjDeleteMarker(bucket, object) if err != nil { return nil, err @@ -2758,10 +2758,15 @@ func (p *Posix) GetObject(_ context.Context, input *s3.GetObjectInput) (*s3.GetO // if the specified object version is a delete marker, return MethodNotAllowed if isDelMarker { + if versionId != "" { + err = s3err.GetAPIError(s3err.ErrMethodNotAllowed) + } else { + err = s3err.GetAPIError(s3err.ErrNoSuchKey) + } return &s3.GetObjectOutput{ DeleteMarker: getBoolPtr(true), LastModified: backend.GetTimePtr(fi.ModTime()), - }, s3err.GetAPIError(s3err.ErrMethodNotAllowed) + }, err } } diff --git a/tests/integration/group-tests.go b/tests/integration/group-tests.go index dacdfba3..fadce833 100644 --- a/tests/integration/group-tests.go +++ b/tests/integration/group-tests.go @@ -562,6 +562,7 @@ func TestVersioning(s *S3Conf) { // GetObject action Versioning_GetObject_invalid_versionId(s) Versioning_GetObject_success(s) + Versioning_GetObject_delete_marker_without_versionId(s) Versioning_GetObject_delete_marker(s) // DeleteObject(s) actions Versioning_DeleteObject_delete_object_version(s) @@ -946,6 +947,7 @@ func GetIntTests() IntTests { "Versioning_HeadObject_delete_marker": Versioning_HeadObject_delete_marker, "Versioning_GetObject_invalid_versionId": Versioning_GetObject_invalid_versionId, "Versioning_GetObject_success": Versioning_GetObject_success, + "Versioning_GetObject_delete_marker_without_versionId": Versioning_GetObject_delete_marker_without_versionId, "Versioning_GetObject_delete_marker": Versioning_GetObject_delete_marker, "Versioning_DeleteObject_delete_object_version": Versioning_DeleteObject_delete_object_version, "Versioning_DeleteObject_non_existing_object": Versioning_DeleteObject_non_existing_object, diff --git a/tests/integration/tests.go b/tests/integration/tests.go index 0885ef61..c52c2b5a 100644 --- a/tests/integration/tests.go +++ b/tests/integration/tests.go @@ -11372,6 +11372,47 @@ func Versioning_GetObject_success(s *S3Conf) error { }, withVersioning(types.BucketVersioningStatusEnabled)) } +func Versioning_GetObject_delete_marker_without_versionId(s *S3Conf) error { + testName := "Versioning_GetObject_delete_marker_without_versionId" + return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { + obj := "my-obj" + _, err := putObjectWithData(1234, &s3.PutObjectInput{ + Bucket: &bucket, + Key: &obj, + }, s3client) + if err != nil { + return err + } + + err = putBucketVersioningStatus(s3client, bucket, types.BucketVersioningStatusEnabled) + if err != nil { + return err + } + + ctx, cancel := context.WithTimeout(context.Background(), shortTimeout) + _, err = s3client.DeleteObject(ctx, &s3.DeleteObjectInput{ + Bucket: &bucket, + Key: &obj, + }) + cancel() + if err != nil { + return err + } + + ctx, cancel = context.WithTimeout(context.Background(), shortTimeout) + _, err = s3client.GetObject(ctx, &s3.GetObjectInput{ + Bucket: &bucket, + Key: &obj, + }) + cancel() + if err := checkSdkApiErr(err, "NoSuchKey"); err != nil { + return err + } + + return nil + }) +} + func Versioning_GetObject_delete_marker(s *S3Conf) error { testName := "Versioning_GetObject_delete_marker" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {