Upstream versity/versitygw state of the touched files before aed4617372

This commit is contained in:
upstream committed 2026-10-12 14:30:16 +02:00
1 parent 7dce327c11
commit 613c71290f
3 files changed
+73 -120

No files matched your search

+10 -6
View File
@@ -22,6 +22,7 @@ import (
"github.com/gofiber/fiber/v3"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/s3api/utils"
"github.com/versity/versitygw/s3err"
"github.com/versity/versitygw/s3response"
)
@@ -614,6 +615,15 @@ 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") != "" {
return &Response{
MetaOpts: &MetaOptions{
BucketOwner: parsedAcl.Owner,
},
}, s3err.GetInvalidArgumentErr(s3err.InvalidArgStartAfter, "")
}
err := c.verifyAccess(ctx, auth.AccessOptions{
Acl: parsedAcl,
AclPermission: auth.PermissionRead,
@@ -656,12 +666,6 @@ func (c S3ApiController) ListObjects(ctx fiber.Ctx) (*Response, error) {
}, err
}
// S3 returns NextMarker only when the request has a delimiter. Without
// one, clients use the last key in the response as the next marker.
if delimiter == "" {
res.NextMarker = nil
}
// S3 echoes the request marker back in the response, and includes the
// element even when the request carried no marker. Backends return a nil
// pointer for an empty marker, which encoding/xml drops entirely, so
+18 -42
View File
@@ -1176,9 +1176,6 @@ func TestS3ApiController_ListObjects(t *testing.T) {
emptyMarker := ""
listResultEchoed := listResult
listResultEchoed.Marker = &emptyMarker
// S3 returns NextMarker only when the request has a delimiter
listResultNextMarker := listResultEchoed
listResultNextMarker.NextMarker = utils.GetStringPtr("my-key")
tests := []struct {
name string
input testInput
@@ -1198,6 +1195,24 @@ func TestS3ApiController_ListObjects(t *testing.T) {
err: s3err.GetAPIError(s3err.ErrAccessDenied),
},
},
{
name: "start-after is not supported",
input: testInput{
locals: defaultLocals,
beRes: listResult,
queries: map[string]string{
"start-after": "my-key",
},
},
output: testOutput{
response: &Response{
MetaOpts: &MetaOptions{
BucketOwner: "root",
},
},
err: s3err.GetInvalidArgumentErr(s3err.InvalidArgStartAfter, ""),
},
},
{
name: "invalid max keys",
input: testInput{
@@ -1249,45 +1264,6 @@ func TestS3ApiController_ListObjects(t *testing.T) {
},
},
},
{
name: "next marker omitted without delimiter",
input: testInput{
locals: defaultLocals,
beRes: listResultNextMarker,
},
output: testOutput{
response: &Response{
Data: listResultEchoed,
Headers: map[string]*string{
"x-amz-bucket-region": utils.GetStringPtr(defaultRegion),
},
MetaOpts: &MetaOptions{
BucketOwner: "root",
},
},
},
},
{
name: "next marker returned with delimiter",
input: testInput{
locals: defaultLocals,
beRes: listResultNextMarker,
queries: map[string]string{
"delimiter": "delim",
},
},
output: testOutput{
response: &Response{
Data: listResultNextMarker,
Headers: map[string]*string{
"x-amz-bucket-region": utils.GetStringPtr(defaultRegion),
},
MetaOpts: &MetaOptions{
BucketOwner: "root",
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {