decode based on the encoding type returned by the server (#6532)

This commit is contained in:
zhijian
2025-12-05 17:11:41 +08:00
committed by GitHub
parent 7967949524
commit 16001ae6a6
4 changed files with 14 additions and 6 deletions

View File

@@ -193,7 +193,7 @@ func (s *ibmcos) List(ctx context.Context, prefix, start, token, delimiter strin
objs := make([]Object, n)
for i := 0; i < n; i++ {
o := resp.Contents[i]
oKey, err := url.QueryUnescape(*o.Key)
oKey, err := decodeKey(*o.Key, resp.EncodingType)
if err != nil {
return nil, false, "", errors.WithMessagef(err, "failed to decode key %s", *o.Key)
}
@@ -201,7 +201,7 @@ func (s *ibmcos) List(ctx context.Context, prefix, start, token, delimiter strin
}
if delimiter != "" {
for _, p := range resp.CommonPrefixes {
prefix, err := url.QueryUnescape(*p.Prefix)
prefix, err := decodeKey(*p.Prefix, resp.EncodingType)
if err != nil {
return nil, false, "", errors.WithMessagef(err, "failed to decode commonPrefixes %s", *p.Prefix)
}

View File

@@ -199,7 +199,7 @@ func (s *ks3) List(ctx context.Context, prefix, start, token, delimiter string,
objs := make([]Object, n)
for i := 0; i < n; i++ {
o := resp.Contents[i]
oKey, err := url.QueryUnescape(*o.Key)
oKey, err := decodeKey(*o.Key, resp.EncodingType)
if err != nil {
return nil, false, "", errors.WithMessagef(err, "failed to decode key %s", *o.Key)
}
@@ -207,7 +207,7 @@ func (s *ks3) List(ctx context.Context, prefix, start, token, delimiter string,
}
if delimiter != "" {
for _, p := range resp.CommonPrefixes {
prefix, err := url.QueryUnescape(*p.Prefix)
prefix, err := decodeKey(*p.Prefix, resp.EncodingType)
if err != nil {
return nil, false, "", errors.WithMessagef(err, "failed to decode commonPrefixes %s", *p.Prefix)
}

View File

@@ -20,6 +20,7 @@ import (
"context"
"fmt"
"io"
"net/url"
"os"
"strconv"
"strings"
@@ -288,3 +289,10 @@ func generateListResult(objs []Object, limit int64) ([]Object, bool, string, err
}
return objs, len(objs) == int(limit), nextMarker, nil
}
func decodeKey(value string, typ *string) (string, error) {
if typ != nil && *typ == "url" {
return url.QueryUnescape(value)
}
return value, nil
}

View File

@@ -249,7 +249,7 @@ func (s *s3client) List(ctx context.Context, prefix, start, token, delimiter str
objs := make([]Object, n)
for i := 0; i < n; i++ {
o := resp.Contents[i]
oKey, err := url.QueryUnescape(*o.Key)
oKey, err := decodeKey(*o.Key, aws.String(string(resp.EncodingType)))
if err != nil {
return nil, false, "", errors.WithMessagef(err, "failed to decode key %s", *o.Key)
}
@@ -266,7 +266,7 @@ func (s *s3client) List(ctx context.Context, prefix, start, token, delimiter str
}
if delimiter != "" {
for _, p := range resp.CommonPrefixes {
prefix, err := url.QueryUnescape(*p.Prefix)
prefix, err := decodeKey(*p.Prefix, aws.String(string(resp.EncodingType)))
if err != nil {
return nil, false, "", errors.WithMessagef(err, "failed to decode commonPrefixes %s", *p.Prefix)
}