diff --git a/backend/posix/posix.go b/backend/posix/posix.go index 60bc408b..146f37e1 100644 --- a/backend/posix/posix.go +++ b/backend/posix/posix.go @@ -2717,8 +2717,7 @@ func (p *Posix) GetObject(_ context.Context, input *s3.GetObjectInput) (*s3.GetO return nil, fmt.Errorf("get obj versionId: %w", err) } if errors.Is(err, meta.ErrNoSuchKey) { - bucket = filepath.Join(p.versioningDir, bucket) - object = filepath.Join(genObjVersionKey(object), versionId) + vId = []byte(nullVersionId) } if string(vId) != versionId { diff --git a/tests/integration/group-tests.go b/tests/integration/group-tests.go index fadce833..83675de5 100644 --- a/tests/integration/group-tests.go +++ b/tests/integration/group-tests.go @@ -564,6 +564,7 @@ func TestVersioning(s *S3Conf) { Versioning_GetObject_success(s) Versioning_GetObject_delete_marker_without_versionId(s) Versioning_GetObject_delete_marker(s) + Versioning_GetObject_null_versionId_obj(s) // DeleteObject(s) actions Versioning_DeleteObject_delete_object_version(s) Versioning_DeleteObject_non_existing_object(s) @@ -949,6 +950,7 @@ func GetIntTests() IntTests { "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_GetObject_null_versionId_obj": Versioning_GetObject_null_versionId_obj, "Versioning_DeleteObject_delete_object_version": Versioning_DeleteObject_delete_object_version, "Versioning_DeleteObject_non_existing_object": Versioning_DeleteObject_non_existing_object, "Versioning_DeleteObject_delete_a_delete_marker": Versioning_DeleteObject_delete_a_delete_marker, diff --git a/tests/integration/tests.go b/tests/integration/tests.go index c52c2b5a..ca7c659c 100644 --- a/tests/integration/tests.go +++ b/tests/integration/tests.go @@ -11455,6 +11455,48 @@ func Versioning_GetObject_delete_marker(s *S3Conf) error { }, withVersioning(types.BucketVersioningStatusEnabled)) } +func Versioning_GetObject_null_versionId_obj(s *S3Conf) error { + testName := "Versioning_GetObject_null_versionId_obj" + return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { + obj, lgth := "my-obj", int64(234) + out, err := putObjectWithData(lgth, &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) + res, err := s3client.GetObject(ctx, &s3.GetObjectInput{ + Bucket: &bucket, + Key: &obj, + VersionId: &nullVersionId, + }) + cancel() + if err != nil { + return err + } + + if *res.ContentLength != lgth { + return fmt.Errorf("expected the Content-Length to be %v, instead got %v", lgth, *res.ContentLength) + } + if *res.VersionId != nullVersionId { + return fmt.Errorf("expected the versionId to be %v, insted got %v", nullVersionId, *res.VersionId) + } + if *res.ETag != *out.res.ETag { + return fmt.Errorf("expecte the ETag to be %v, instead got %v", *out.res.ETag, *res.ETag) + } + + return nil + }) +} + func Versioning_DeleteObject_delete_object_version(s *S3Conf) error { testName := "Versioning_DeleteObject_delete_object_version" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {