s3: fix encoding for control characters - Fixes #3345

This commit is contained in:
Nick Craig-Wood 2019-07-23 12:24:10 +01:00
parent 6ae7bd7914
commit a8adce9c59

View File

@ -20,6 +20,7 @@ import (
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
"net/url"
"path" "path"
"regexp" "regexp"
"strings" "strings"
@ -1226,6 +1227,7 @@ func (f *Fs) list(ctx context.Context, bucket, directory, prefix string, addBuck
Prefix: &directory, Prefix: &directory,
MaxKeys: &maxKeys, MaxKeys: &maxKeys,
Marker: marker, Marker: marker,
EncodingType: aws.String(s3.EncodingTypeUrl),
} }
var resp *s3.ListObjectsOutput var resp *s3.ListObjectsOutput
var err error var err error
@ -1259,6 +1261,11 @@ func (f *Fs) list(ctx context.Context, bucket, directory, prefix string, addBuck
continue continue
} }
remote := *commonPrefix.Prefix remote := *commonPrefix.Prefix
remote, err = url.QueryUnescape(remote)
if err != nil {
fs.Logf(f, "failed to URL decode %q in listing common prefix: %v", *commonPrefix.Prefix, err)
continue
}
if !strings.HasPrefix(remote, prefix) { if !strings.HasPrefix(remote, prefix) {
fs.Logf(f, "Odd name received %q", remote) fs.Logf(f, "Odd name received %q", remote)
continue continue
@ -1278,6 +1285,11 @@ func (f *Fs) list(ctx context.Context, bucket, directory, prefix string, addBuck
} }
for _, object := range resp.Contents { for _, object := range resp.Contents {
remote := aws.StringValue(object.Key) remote := aws.StringValue(object.Key)
remote, err = url.QueryUnescape(remote)
if err != nil {
fs.Logf(f, "failed to URL decode %q in listing: %v", aws.StringValue(object.Key), err)
continue
}
if !strings.HasPrefix(remote, prefix) { if !strings.HasPrefix(remote, prefix) {
fs.Logf(f, "Odd name received %q", remote) fs.Logf(f, "Odd name received %q", remote)
continue continue