From 9ca3372870029672ae6eda72104d017b0a421910 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Tue, 26 Jan 2016 21:55:50 -0800 Subject: [PATCH] listObjects: Marker should be unescaped before being used internally. Without this change listObjects() goes into an infinite loop for files which have special characters i.e "++" encoded with "%2B%2B". We have to unescape and convert them to their native representation before being used internally. Fixes #1052 --- pkg/fs/fs-bucket-listobjects.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/fs/fs-bucket-listobjects.go b/pkg/fs/fs-bucket-listobjects.go index ef031e277..7e43a1c63 100644 --- a/pkg/fs/fs-bucket-listobjects.go +++ b/pkg/fs/fs-bucket-listobjects.go @@ -19,6 +19,7 @@ package fs import ( "errors" "hash/fnv" + "net/url" "os" "path/filepath" "strings" @@ -259,10 +260,16 @@ func (fs Filesystem) ListObjects(bucket, prefix, marker, delimiter string, maxKe return ListObjectsResult{}, probe.NewError(e) } + // Unescape the marker values. + markerUnescaped, e := url.QueryUnescape(marker) + if e != nil { + return ListObjectsResult{}, probe.NewError(e) + } + reqParams := listObjectsParams{} reqParams.Bucket = bucket reqParams.Prefix = filepath.FromSlash(prefix) - reqParams.Marker = filepath.FromSlash(marker) + reqParams.Marker = filepath.FromSlash(markerUnescaped) reqParams.Delimiter = filepath.FromSlash(delimiter) reqParams.MaxKeys = maxKeys