[#684] Fix continuation token for directories
Signed-off-by: Denis Kirillov <denis@nspcc.ru>
This commit is contained in:
parent
ece40d5972
commit
5c7a509cc9
2 changed files with 50 additions and 0 deletions
|
@ -120,6 +120,35 @@ func TestS3BucketListDelimiterBasic(t *testing.T) {
|
||||||
require.Equal(t, "quux/", listV1Response.CommonPrefixes[1].Prefix)
|
require.Equal(t, "quux/", listV1Response.CommonPrefixes[1].Prefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestS3BucketListV2DelimiterPrefix(t *testing.T) {
|
||||||
|
tc := prepareHandlerContext(t)
|
||||||
|
|
||||||
|
bktName := "bucket-for-listingv2"
|
||||||
|
objects := []string{"asdf", "boo/bar", "boo/baz/xyzzy", "cquux/thud", "cquux/bla"}
|
||||||
|
bktInfo, _ := createBucketAndObject(t, tc, bktName, objects[0])
|
||||||
|
|
||||||
|
for _, objName := range objects[1:] {
|
||||||
|
createTestObject(tc.Context(), t, tc, bktInfo, objName)
|
||||||
|
}
|
||||||
|
|
||||||
|
var empty []string
|
||||||
|
delim := "/"
|
||||||
|
prefix := ""
|
||||||
|
|
||||||
|
continuationToken := validateListV2(t, tc, bktName, prefix, delim, "", 1, true, false, []string{"asdf"}, empty)
|
||||||
|
continuationToken = validateListV2(t, tc, bktName, prefix, delim, continuationToken, 1, true, false, empty, []string{"boo/"})
|
||||||
|
validateListV2(t, tc, bktName, prefix, delim, continuationToken, 1, false, true, empty, []string{"cquux/"})
|
||||||
|
|
||||||
|
continuationToken = validateListV2(t, tc, bktName, prefix, delim, "", 2, true, false, []string{"asdf"}, []string{"boo/"})
|
||||||
|
validateListV2(t, tc, bktName, prefix, delim, continuationToken, 2, false, true, empty, []string{"cquux/"})
|
||||||
|
|
||||||
|
prefix = "boo/"
|
||||||
|
continuationToken = validateListV2(t, tc, bktName, prefix, delim, "", 1, true, false, []string{"boo/bar"}, empty)
|
||||||
|
validateListV2(t, tc, bktName, prefix, delim, continuationToken, 1, false, true, empty, []string{"boo/baz/"})
|
||||||
|
|
||||||
|
validateListV2(t, tc, bktName, prefix, delim, "", 2, false, true, []string{"boo/bar"}, []string{"boo/baz/"})
|
||||||
|
}
|
||||||
|
|
||||||
func listObjectsV2(t *testing.T, tc *handlerContext, bktName, prefix, delimiter, startAfter, continuationToken string, maxKeys int) *ListObjectsV2Response {
|
func listObjectsV2(t *testing.T, tc *handlerContext, bktName, prefix, delimiter, startAfter, continuationToken string, maxKeys int) *ListObjectsV2Response {
|
||||||
query := prepareCommonListObjectsQuery(prefix, delimiter, maxKeys)
|
query := prepareCommonListObjectsQuery(prefix, delimiter, maxKeys)
|
||||||
if len(startAfter) != 0 {
|
if len(startAfter) != 0 {
|
||||||
|
@ -137,6 +166,26 @@ func listObjectsV2(t *testing.T, tc *handlerContext, bktName, prefix, delimiter,
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func validateListV2(t *testing.T, tc *handlerContext, bktName, prefix, delimiter, continuationToken string, maxKeys int,
|
||||||
|
isTruncated, last bool, checkObjects, checkPrefixes []string) string {
|
||||||
|
response := listObjectsV2(t, tc, bktName, prefix, delimiter, "", continuationToken, maxKeys)
|
||||||
|
|
||||||
|
require.Equal(t, isTruncated, response.IsTruncated)
|
||||||
|
require.Equal(t, last, len(response.NextContinuationToken) == 0)
|
||||||
|
|
||||||
|
require.Len(t, response.Contents, len(checkObjects))
|
||||||
|
for i := 0; i < len(checkObjects); i++ {
|
||||||
|
require.Equal(t, checkObjects[i], response.Contents[i].Key)
|
||||||
|
}
|
||||||
|
|
||||||
|
require.Len(t, response.CommonPrefixes, len(checkPrefixes))
|
||||||
|
for i := 0; i < len(checkPrefixes); i++ {
|
||||||
|
require.Equal(t, checkPrefixes[i], response.CommonPrefixes[i].Prefix)
|
||||||
|
}
|
||||||
|
|
||||||
|
return response.NextContinuationToken
|
||||||
|
}
|
||||||
|
|
||||||
func prepareCommonListObjectsQuery(prefix, delimiter string, maxKeys int) url.Values {
|
func prepareCommonListObjectsQuery(prefix, delimiter string, maxKeys int) url.Values {
|
||||||
query := make(url.Values)
|
query := make(url.Values)
|
||||||
|
|
||||||
|
|
|
@ -788,6 +788,7 @@ func tryDirectory(bktInfo *data.BucketInfo, node *data.NodeVersion, prefix, deli
|
||||||
}
|
}
|
||||||
|
|
||||||
return &data.ObjectInfo{
|
return &data.ObjectInfo{
|
||||||
|
ID: node.OID, // to use it as continuation token
|
||||||
CID: bktInfo.CID,
|
CID: bktInfo.CID,
|
||||||
IsDir: true,
|
IsDir: true,
|
||||||
IsDeleteMarker: node.IsDeleteMarker(),
|
IsDeleteMarker: node.IsDeleteMarker(),
|
||||||
|
|
Loading…
Reference in a new issue