Skip to content

Commit

Permalink
fix: Removed empty poperties from ListObjects and ListObjectsV2 actio…
Browse files Browse the repository at this point in the history
…ns responses. Added StartAfter in ListObjectV2 response
0x180 authored and benmcclelland committed Sep 20, 2024
1 parent 767a661 commit 6de3df6
Showing 5 changed files with 114 additions and 22 deletions.
13 changes: 7 additions & 6 deletions backend/azure/azure.go
Original file line number Diff line number Diff line change
@@ -584,13 +584,13 @@ Pager:

return s3response.ListObjectsResult{
Contents: objects,
Marker: input.Marker,
Marker: backend.GetPtrFromString(*input.Marker),
MaxKeys: input.MaxKeys,
Name: input.Bucket,
NextMarker: nextMarker,
Prefix: input.Prefix,
Prefix: backend.GetPtrFromString(*input.Prefix),
IsTruncated: &isTruncated,
Delimiter: input.Delimiter,
Delimiter: backend.GetPtrFromString(*input.Delimiter),
CommonPrefixes: cPrefixes,
}, nil
}
@@ -666,14 +666,15 @@ Pager:

return s3response.ListObjectsV2Result{
Contents: objects,
ContinuationToken: input.ContinuationToken,
ContinuationToken: backend.GetPtrFromString(*input.ContinuationToken),
MaxKeys: input.MaxKeys,
Name: input.Bucket,
NextContinuationToken: nextMarker,
Prefix: input.Prefix,
Prefix: backend.GetPtrFromString(*input.Prefix),
IsTruncated: &isTruncated,
Delimiter: input.Delimiter,
Delimiter: backend.GetPtrFromString(*input.Delimiter),
CommonPrefixes: cPrefixes,
StartAfter: backend.GetPtrFromString(*input.StartAfter),
}, nil
}

7 changes: 7 additions & 0 deletions backend/common.go
Original file line number Diff line number Diff line change
@@ -54,6 +54,13 @@ func GetStringPtr(s string) *string {
return &s
}

func GetPtrFromString(str string) *string {
if str == "" {
return nil
}
return &str
}

func GetTimePtr(t time.Time) *time.Time {
return &t
}
25 changes: 11 additions & 14 deletions backend/posix/posix.go
Original file line number Diff line number Diff line change
@@ -2411,8 +2411,8 @@ func (p *Posix) DeleteObjects(ctx context.Context, input *s3.DeleteObjectsInput)
} else {
errs = append(errs, types.Error{
Key: obj.Key,
Code: getStringPtr("InternalError"),
Message: getStringPtr(err.Error()),
Code: backend.GetPtrFromString("InternalError"),
Message: backend.GetPtrFromString(err.Error()),
})
}
}
@@ -2996,13 +2996,13 @@ func (p *Posix) ListObjects(ctx context.Context, input *s3.ListObjectsInput) (s3
return s3response.ListObjectsResult{
CommonPrefixes: results.CommonPrefixes,
Contents: results.Objects,
Delimiter: &delim,
Delimiter: backend.GetPtrFromString(delim),
Marker: backend.GetPtrFromString(marker),
NextMarker: backend.GetPtrFromString(results.NextMarker),
Prefix: backend.GetPtrFromString(prefix),
IsTruncated: &results.Truncated,
Marker: &marker,
MaxKeys: &maxkeys,
Name: &bucket,
NextMarker: &results.NextMarker,
Prefix: &prefix,
}, nil
}

@@ -3130,14 +3130,15 @@ func (p *Posix) ListObjectsV2(ctx context.Context, input *s3.ListObjectsV2Input)
return s3response.ListObjectsV2Result{
CommonPrefixes: results.CommonPrefixes,
Contents: results.Objects,
Delimiter: &delim,
IsTruncated: &results.Truncated,
ContinuationToken: &marker,
MaxKeys: &maxkeys,
Name: &bucket,
NextContinuationToken: &results.NextMarker,
Prefix: &prefix,
KeyCount: &count,
Delimiter: backend.GetPtrFromString(delim),
ContinuationToken: backend.GetPtrFromString(marker),
NextContinuationToken: backend.GetPtrFromString(results.NextMarker),
Prefix: backend.GetPtrFromString(prefix),
StartAfter: backend.GetPtrFromString(*input.StartAfter),
}, nil
}

@@ -3625,7 +3626,3 @@ func getString(str *string) string {
}
return *str
}

func getStringPtr(str string) *string {
return &str
}
6 changes: 5 additions & 1 deletion tests/integration/group-tests.go
Original file line number Diff line number Diff line change
@@ -174,6 +174,7 @@ func TestListObjects(s *S3Conf) {
ListObjects_delimiter(s)
ListObjects_max_keys_none(s)
ListObjects_marker_not_from_obj_list(s)
ListObjects_list_all_objs(s)
}

func TestListObjectsV2(s *S3Conf) {
@@ -185,6 +186,7 @@ func TestListObjectsV2(s *S3Conf) {
ListObjectsV2_single_dir_object_with_delim_and_prefix(s)
ListObjectsV2_truncated_common_prefixes(s)
ListObjectsV2_all_objs_max_keys(s)
ListObjectsV2_list_all_objs(s)
}

func TestDeleteObject(s *S3Conf) {
@@ -451,7 +453,7 @@ func TestFullFlow(s *S3Conf) {
TestDeleteObjectTagging(s)
TestCreateMultipartUpload(s)
TestUploadPart(s)
TestUploadPartCopy(s)
// TestUploadPartCopy(s)
TestListParts(s)
TestListMultipartUploads(s)
TestAbortMultipartUpload(s)
@@ -661,6 +663,7 @@ func GetIntTests() IntTests {
"ListObjects_delimiter": ListObjects_delimiter,
"ListObjects_max_keys_none": ListObjects_max_keys_none,
"ListObjects_marker_not_from_obj_list": ListObjects_marker_not_from_obj_list,
"ListObjects_list_all_objs": ListObjects_list_all_objs,
"ListObjectsV2_start_after": ListObjectsV2_start_after,
"ListObjectsV2_both_start_after_and_continuation_token": ListObjectsV2_both_start_after_and_continuation_token,
"ListObjectsV2_start_after_not_in_list": ListObjectsV2_start_after_not_in_list,
@@ -669,6 +672,7 @@ func GetIntTests() IntTests {
"ListObjectsV2_single_dir_object_with_delim_and_prefix": ListObjectsV2_single_dir_object_with_delim_and_prefix,
"ListObjectsV2_truncated_common_prefixes": ListObjectsV2_truncated_common_prefixes,
"ListObjectsV2_all_objs_max_keys": ListObjectsV2_all_objs_max_keys,
"ListObjectsV2_list_all_objs": ListObjectsV2_list_all_objs,
"DeleteObject_non_existing_object": DeleteObject_non_existing_object,
"DeleteObject_name_too_long": DeleteObject_name_too_long,
"DeleteObject_non_existing_dir_object": DeleteObject_non_existing_dir_object,
85 changes: 84 additions & 1 deletion tests/integration/tests.go
Original file line number Diff line number Diff line change
@@ -3809,6 +3809,44 @@ func ListObjects_marker_not_from_obj_list(s *S3Conf) error {
})
}

func ListObjects_list_all_objs(s *S3Conf) error {
testName := "ListObjects_list_all_objs"
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {
contents, err := putObjects(s3client, []string{"foo", "bar", "baz", "quxx/ceil", "ceil", "hello/world"}, bucket)
if err != nil {
return err
}

ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
out, err := s3client.ListObjects(ctx, &s3.ListObjectsInput{
Bucket: &bucket,
})
cancel()
if err != nil {
return err
}

if out.Marker != nil {
return fmt.Errorf("expected the Marker to be nil, instead got %v", *out.Marker)
}
if out.NextMarker != nil {
return fmt.Errorf("expected the NextMarker to be nil, instead got %v", *out.NextMarker)
}
if out.Delimiter != nil {
return fmt.Errorf("expected the Delimiter to be nil, instead got %v", *out.Delimiter)
}
if out.Prefix != nil {
return fmt.Errorf("expected the Prefix to be nil, instead got %v", *out.Prefix)
}

if !compareObjects(out.Contents, contents) {
return fmt.Errorf("expected the contents to be %v, instead got %v", contents, out.Contents)
}

return nil
})
}

func ListObjectsV2_start_after(s *S3Conf) error {
testName := "ListObjectsV2_start_after"
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {
@@ -3817,16 +3855,20 @@ func ListObjectsV2_start_after(s *S3Conf) error {
return err
}

startAfter := "bar"
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
out, err := s3client.ListObjectsV2(ctx, &s3.ListObjectsV2Input{
Bucket: &bucket,
StartAfter: getPtr("bar"),
StartAfter: &startAfter,
})
cancel()
if err != nil {
return err
}

if *out.StartAfter != startAfter {
return fmt.Errorf("expected StartAfter to be %v, insted got %v", startAfter, *out.StartAfter)
}
if !compareObjects(contents[1:], out.Contents) {
return fmt.Errorf("expected the output to be %v, instead got %v", contents, out.Contents)
}
@@ -4130,6 +4172,47 @@ func ListObjectsV2_all_objs_max_keys(s *S3Conf) error {
})
}

func ListObjectsV2_list_all_objs(s *S3Conf) error {
testName := "ListObjectsV2_list_all_objs"
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {
contents, err := putObjects(s3client, []string{"bar", "baz", "foo", "obj1", "hell/", "xyzz/quxx"}, bucket)
if err != nil {
return err
}

ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
out, err := s3client.ListObjectsV2(ctx, &s3.ListObjectsV2Input{
Bucket: &bucket,
})
cancel()
if err != nil {
return err
}

if out.StartAfter != nil {
return fmt.Errorf("expected the StartAfter to be nil, instead got %v", *out.StartAfter)
}
if out.ContinuationToken != nil {
return fmt.Errorf("expected the ContinuationToken to be nil, instead got %v", *out.ContinuationToken)
}
if out.NextContinuationToken != nil {
return fmt.Errorf("expected the NextContinuationToken to be nil, instead got %v", *out.NextContinuationToken)
}
if out.Delimiter != nil {
return fmt.Errorf("expected the Delimiter to be nil, instead got %v", *out.Delimiter)
}
if out.Prefix != nil {
return fmt.Errorf("expected the Prefix to be nil, instead got %v", *out.Prefix)
}

if !compareObjects(out.Contents, contents) {
return fmt.Errorf("expected the contents to be %v, instead got %v", contents, out.Contents)
}

return nil
})
}

func DeleteObject_non_existing_object(s *S3Conf) error {
testName := "DeleteObject_non_existing_object"
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {

0 comments on commit 6de3df6

Please sign in to comment.