From ca6a92bb845cb7325655ef4cf1891dec9fde4bcd Mon Sep 17 00:00:00 2001 From: niksis02 Date: Thu, 18 Sep 2025 16:09:02 +0400 Subject: [PATCH] fix: changes empty mp parts error on CompleteMultipartUpload Fixes #1328 If `CompleteMultipartUpload` is attempted with empty `Parts` list, the gateway used to return `InvalidRequest`. Now it's changed to `MalformedXML`. --- s3api/controllers/object-post.go | 2 +- s3api/controllers/object-post_test.go | 2 +- s3err/s3err.go | 6 ------ tests/integration/tests.go | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/s3api/controllers/object-post.go b/s3api/controllers/object-post.go index 4f4df45..3dbba5c 100644 --- a/s3api/controllers/object-post.go +++ b/s3api/controllers/object-post.go @@ -278,7 +278,7 @@ func (c S3ApiController) CompleteMultipartUpload(ctx *fiber.Ctx) (*Response, err MetaOpts: &MetaOptions{ BucketOwner: parsedAcl.Owner, }, - }, s3err.GetAPIError(s3err.ErrEmptyParts) + }, s3err.GetAPIError(s3err.ErrMalformedXML) } var mpuObjectSize *int64 diff --git a/s3api/controllers/object-post_test.go b/s3api/controllers/object-post_test.go index cf07ec7..57fcff8 100644 --- a/s3api/controllers/object-post_test.go +++ b/s3api/controllers/object-post_test.go @@ -404,7 +404,7 @@ func TestS3ApiController_CompleteMultipartUpload(t *testing.T) { BucketOwner: "root", }, }, - err: s3err.GetAPIError(s3err.ErrEmptyParts), + err: s3err.GetAPIError(s3err.ErrMalformedXML), }, }, { diff --git a/s3err/s3err.go b/s3err/s3err.go index 85fb111..627069c 100644 --- a/s3err/s3err.go +++ b/s3err/s3err.go @@ -82,7 +82,6 @@ const ( ErrInvalidPartNumberMarker ErrInvalidObjectAttributes ErrInvalidPart - ErrEmptyParts ErrInvalidPartNumber ErrInvalidPartOrder ErrInvalidCompleteMpPartNumber @@ -311,11 +310,6 @@ var errorCodeResponse = map[ErrorCode]APIError{ Description: "One or more of the specified parts could not be found. The part may not have been uploaded, or the specified entity tag may not match the part's entity tag.", HTTPStatusCode: http.StatusBadRequest, }, - ErrEmptyParts: { - Code: "InvalidRequest", - Description: "You must specify at least one part", - HTTPStatusCode: http.StatusBadRequest, - }, ErrInvalidPartNumber: { Code: "InvalidArgument", Description: "Part number must be an integer between 1 and 10000, inclusive.", diff --git a/tests/integration/tests.go b/tests/integration/tests.go index 9c7e9aa..cfbdb36 100644 --- a/tests/integration/tests.go +++ b/tests/integration/tests.go @@ -13012,7 +13012,7 @@ func CompleteMultipartUpload_empty_parts(s *S3Conf) error { }, }) cancel() - if err := checkApiErr(err, s3err.GetAPIError(s3err.ErrEmptyParts)); err != nil { + if err := checkApiErr(err, s3err.GetAPIError(s3err.ErrMalformedXML)); err != nil { return err }