From 9c50a9f567298fc9fe14e3846efe600045bea1ec Mon Sep 17 00:00:00 2001 From: Remco Verhoef Date: Thu, 11 May 2017 15:07:52 -0700 Subject: [PATCH] Fix ListObjectParts to list properly all parts - closes #4322 --- cmd/gateway-gcs.go | 4 ++-- cmd/gateway-gcs_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/cmd/gateway-gcs.go b/cmd/gateway-gcs.go index e37fbc978..679593a5a 100644 --- a/cmd/gateway-gcs.go +++ b/cmd/gateway-gcs.go @@ -649,7 +649,7 @@ func fromGCSMultipartKey(s string) (key, uploadID string, partID int, err error) key = unescape(parts[1]) - uploadID = parts[3] + uploadID = parts[2] partID, err = strconv.Atoi(parts[3]) if err != nil { @@ -728,7 +728,7 @@ func (l *gcsGateway) ListObjectParts(bucket string, key string, uploadID string, isTruncated := false - it.PageInfo().Token = toGCSMultipartKey(key, uploadID, partNumberMarker) + it.PageInfo().Token = toGCSPageToken(toGCSMultipartKey(key, uploadID, partNumberMarker)) it.PageInfo().MaxSize = maxParts nextPartnumberMarker := 0 diff --git a/cmd/gateway-gcs_test.go b/cmd/gateway-gcs_test.go index b56d96af4..9cf6fffa6 100644 --- a/cmd/gateway-gcs_test.go +++ b/cmd/gateway-gcs_test.go @@ -18,6 +18,41 @@ package cmd import "testing" +func TestEscape(t *testing.T) { + testCases := []struct { + Value string + EscapedValue string + }{ + { + Value: "test-test", + EscapedValue: "test%2Dtest", + }, + { + Value: "test/test", + EscapedValue: "test%2Ftest", + }, + { + Value: "test%test", + EscapedValue: "test%25test", + }, + { + Value: "%%%////+++", + EscapedValue: "%25%25%25%2F%2F%2F%2F+++", + }, + } + + for i, testCase := range testCases { + if escape(testCase.Value) != testCase.EscapedValue { + t.Errorf("Test %d: Expected %s, got %s", i+1, testCase.EscapedValue, escape(testCase.Value)) + } + + if unescape(testCase.EscapedValue) != testCase.Value { + t.Errorf("Test %d: Expected %s, got %s", i+1, testCase.Value, unescape(testCase.EscapedValue)) + } + } + +} + func TestToGCSPageToken(t *testing.T) { testCases := []struct { Name string