fix: reject an empty start-after and continuation-token in ListObjects (V1)

This commit is contained in:
dualfroz committed 2026-10-12 14:30:16 +02:00
1 parent 613c71290f
commit 276128b42b
4 files changed
+83 -16

No files matched your search

+11 -2
View File
@@ -615,8 +615,17 @@ func (c S3ApiController) ListObjects(ctx fiber.Ctx) (*Response, error) {
region = defaultRegion
}
// start-after is a ListObjectsV2 argument, S3 rejects it on a V1 listing
if ctx.Query("start-after") != "" {
// continuation-token and start-after are ListObjectsV2 arguments, S3
// rejects either one on a V1 listing, with or without a value
queryArgs := ctx.Request().URI().QueryArgs()
if queryArgs.Has("continuation-token") {
return &Response{
MetaOpts: &MetaOptions{
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetInvalidArgumentErr(s3err.InvalidArgContinuationToken, "")
}
if queryArgs.Has("start-after") {
return &Response{
MetaOpts: &MetaOptions{
BucketOwner: parsedAcl.Owner,
+36
View File
@@ -1213,6 +1213,42 @@ func TestS3ApiController_ListObjects(t *testing.T) {
err: s3err.GetInvalidArgumentErr(s3err.InvalidArgStartAfter, ""),
},
},
{
name: "empty start-after is not supported",
input: testInput{
locals: defaultLocals,
beRes: listResult,
queries: map[string]string{
"start-after": "",
},
},
output: testOutput{
response: &Response{
MetaOpts: &MetaOptions{
BucketOwner: "root",
},
},
err: s3err.GetInvalidArgumentErr(s3err.InvalidArgStartAfter, ""),
},
},
{
name: "continuation-token is not supported",
input: testInput{
locals: defaultLocals,
beRes: listResult,
queries: map[string]string{
"continuation-token": "my-token",
},
},
output: testOutput{
response: &Response{
MetaOpts: &MetaOptions{
BucketOwner: "root",
},
},
err: s3err.GetInvalidArgumentErr(s3err.InvalidArgContinuationToken, ""),
},
},
{
name: "invalid max keys",
input: testInput{