mirror of
https://github.com/versity/versitygw.git
synced 2026-09-19 22:44:28 +00:00
fix: Changes the backend.Walk implementation to return non-truncated result if both delimiter and max-keys are provided
Fixes #816 `ListObjects(V2)` used to return truncated response, if delimiter is provided and the result is limited by max-keys and the number of common prefixes is the same as `max-keys`. e.g PUT -> `foo/bar` PUT -> `foo/quxx` LIST: `max-keys=1;delim=/` -> foo/ `ListObjects(V2)` should return `foo/` as common prefix and `truncated` should be `false`. The PR makes this fix to return `non-truncated` response for the above described case.
This commit is contained in:
@@ -220,6 +220,7 @@ func TestListObjects(s *S3Conf) {
|
||||
ListObjects_list_all_objs(s)
|
||||
ListObjects_nested_dir_file_objs(s)
|
||||
ListObjects_check_owner(s)
|
||||
ListObjects_non_truncated_common_prefixes(s)
|
||||
//TODO: remove the condition after implementing checksums in azure
|
||||
if !s.azureTests {
|
||||
ListObjects_with_checksum(s)
|
||||
@@ -905,6 +906,7 @@ func GetIntTests() IntTests {
|
||||
"ListObjects_list_all_objs": ListObjects_list_all_objs,
|
||||
"ListObjects_nested_dir_file_objs": ListObjects_nested_dir_file_objs,
|
||||
"ListObjects_check_owner": ListObjects_check_owner,
|
||||
"ListObjects_non_truncated_common_prefixes": ListObjects_non_truncated_common_prefixes,
|
||||
"ListObjects_with_checksum": ListObjects_with_checksum,
|
||||
"ListObjectsV2_start_after": ListObjectsV2_start_after,
|
||||
"ListObjectsV2_both_start_after_and_continuation_token": ListObjectsV2_both_start_after_and_continuation_token,
|
||||
|
||||
@@ -5007,6 +5007,58 @@ func ListObjects_check_owner(s *S3Conf) error {
|
||||
})
|
||||
}
|
||||
|
||||
func ListObjects_non_truncated_common_prefixes(s *S3Conf) error {
|
||||
testName := "ListObjects_non_truncated_common_prefixes"
|
||||
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {
|
||||
_, err := putObjects(s3client, []string{"asdf", "boo/bar", "boo/baz/xyzzy", "cquux/thud", "cquux/bla"}, bucket)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
delim, marker, maxKeys := "/", "boo/", int32(1)
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
|
||||
res, err := s3client.ListObjects(ctx, &s3.ListObjectsInput{
|
||||
Bucket: &bucket,
|
||||
Marker: &marker,
|
||||
Delimiter: &delim,
|
||||
MaxKeys: &maxKeys,
|
||||
})
|
||||
cancel()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if res.IsTruncated == nil {
|
||||
return fmt.Errorf("expected non-nil istruncated")
|
||||
}
|
||||
if *res.IsTruncated {
|
||||
return fmt.Errorf("expected non-truncated result")
|
||||
}
|
||||
if res.MaxKeys == nil {
|
||||
return fmt.Errorf("expected non nil max-keys")
|
||||
}
|
||||
if *res.MaxKeys != maxKeys {
|
||||
return fmt.Errorf("expected max-keys to be %v, instead got %v", maxKeys, *res.MaxKeys)
|
||||
}
|
||||
if getString(res.Delimiter) != delim {
|
||||
return fmt.Errorf("expected delimiter to be %v, instead got %v", delim, getString(res.Delimiter))
|
||||
}
|
||||
if getString(res.Marker) != marker {
|
||||
return fmt.Errorf("expected marker to be %v, instead got %v", getString(res.Marker), marker)
|
||||
}
|
||||
if len(res.Contents) != 0 {
|
||||
return fmt.Errorf("expected empty contents, instead got %+v", res.Contents)
|
||||
}
|
||||
cPrefs := []string{"cquux/"}
|
||||
if !comparePrefixes(cPrefs, res.CommonPrefixes) {
|
||||
return fmt.Errorf("expected common prefixes to be %v, instead got %+v", cPrefs, res.CommonPrefixes)
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
func ListObjectsV2_start_after(s *S3Conf) error {
|
||||
testName := "ListObjectsV2_start_after"
|
||||
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {
|
||||
|
||||
Reference in New Issue
Block a user