From ba8bdec077028122a3030464d80f2978ff9be98f Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Fri, 27 May 2016 15:43:51 -0700 Subject: [PATCH] XL: ListObjects should not list when delimiter and prefix are '/'. (#1777) --- fs-v1.go | 9 +++++++++ object-api-listobjects_test.go | 8 ++++++++ xl-v1-list-objects.go | 8 ++++++++ 3 files changed, 25 insertions(+) diff --git a/fs-v1.go b/fs-v1.go index 9da06a44b..8f4da244d 100644 --- a/fs-v1.go +++ b/fs-v1.go @@ -338,6 +338,15 @@ func (fs fsObjects) listObjectsFS(bucket, prefix, marker, delimiter string, maxK return ListObjectsInfo{}, nil } + // For delimiter and prefix as '/' we do not list anything at all + // since according to s3 spec we stop at the 'delimiter' + // along // with the prefix. On a flat namespace with 'prefix' + // as '/' we don't have any entries, since all the keys are + // of form 'keyName/...' + if delimiter == slashSeparator && prefix == slashSeparator { + return ListObjectsInfo{}, nil + } + // Over flowing count - reset to maxObjectList. if maxKeys < 0 || maxKeys > maxObjectList { maxKeys = maxObjectList diff --git a/object-api-listobjects_test.go b/object-api-listobjects_test.go index 3578e5510..b02d742bc 100644 --- a/object-api-listobjects_test.go +++ b/object-api-listobjects_test.go @@ -413,6 +413,12 @@ func testListObjects(obj ObjectLayer, instanceType string, t *testing.T) { {Name: "obj2"}, }, }, + // ListObjectsResult-30. + // Prefix and Delimiter is set to '/', (testCase 62). + { + IsTruncated: false, + Objects: []ObjectInfo{}, + }, } testCases := []struct { @@ -521,6 +527,8 @@ func testListObjects(obj ObjectLayer, instanceType string, t *testing.T) { // Test with marker set as hierarhical value and with delimiter. (60-61) {"test-bucket-list-object", "", "Asia/India/India-summer-photos-1", "/", 10, resultCases[28], nil, true}, {"test-bucket-list-object", "", "Asia/India/Karnataka/Bangalore/Koramangala/pics", "/", 10, resultCases[29], nil, true}, + // Test with prefix and delimiter set to '/'. (62) + {"test-bucket-list-object", "/", "", "/", 10, resultCases[30], nil, true}, } for i, testCase := range testCases { diff --git a/xl-v1-list-objects.go b/xl-v1-list-objects.go index ef59cee06..99154d8fd 100644 --- a/xl-v1-list-objects.go +++ b/xl-v1-list-objects.go @@ -114,6 +114,14 @@ func (xl xlObjects) ListObjects(bucket, prefix, marker, delimiter string, maxKey return ListObjectsInfo{}, nil } + // For delimiter and prefix as '/' we do not list anything at all + // since according to s3 spec we stop at the 'delimiter' along + // with the prefix. On a flat namespace with 'prefix' as '/' + // we don't have any entries, since all the keys are of form 'keyName/...' + if delimiter == slashSeparator && prefix == slashSeparator { + return ListObjectsInfo{}, nil + } + // Over flowing count - reset to maxObjectList. if maxKeys < 0 || maxKeys > maxObjectList { maxKeys = maxObjectList