Fix url escaping #188
4 changed files with 67 additions and 8 deletions
|
@ -13,6 +13,7 @@ This document outlines major changes between releases.
|
||||||
- Replace part on re-upload when use multipart upload (#176)
|
- Replace part on re-upload when use multipart upload (#176)
|
||||||
- Fix goroutine leak on put object error (#178)
|
- Fix goroutine leak on put object error (#178)
|
||||||
- Fix parsing signed headers in presigned urls (#182)
|
- Fix parsing signed headers in presigned urls (#182)
|
||||||
|
- Fix url escaping (#188)
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- Add a metric with addresses of nodes of the same and highest priority that are currently healthy (#51)
|
- Add a metric with addresses of nodes of the same and highest priority that are currently healthy (#51)
|
||||||
|
|
|
@ -100,6 +100,26 @@ func TestS3BucketListDelimiterBasic(t *testing.T) {
|
||||||
require.Equal(t, "quux/", listV1Response.CommonPrefixes[1].Prefix)
|
require.Equal(t, "quux/", listV1Response.CommonPrefixes[1].Prefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestS3BucketListV2DelimiterPercentage(t *testing.T) {
|
||||||
|
tc := prepareHandlerContext(t)
|
||||||
|
|
||||||
|
bktName := "bucket-for-listing"
|
||||||
|
objects := []string{"b%ar", "b%az", "c%ab", "foo"}
|
||||||
|
bktInfo, _ := createBucketAndObject(tc, bktName, objects[0])
|
||||||
|
|
||||||
|
for _, objName := range objects[1:] {
|
||||||
|
createTestObject(tc, bktInfo, objName)
|
||||||
|
}
|
||||||
|
|
||||||
|
listV2Response := listObjectsV2(t, tc, bktName, "", "%", "", "", -1)
|
||||||
|
require.Equal(t, "%", listV2Response.Delimiter)
|
||||||
|
require.Len(t, listV2Response.Contents, 1)
|
||||||
|
require.Equal(t, "foo", listV2Response.Contents[0].Key)
|
||||||
|
require.Len(t, listV2Response.CommonPrefixes, 2)
|
||||||
|
require.Equal(t, "b%", listV2Response.CommonPrefixes[0].Prefix)
|
||||||
|
require.Equal(t, "c%", listV2Response.CommonPrefixes[1].Prefix)
|
||||||
|
}
|
||||||
|
|
||||||
func TestS3BucketListV2DelimiterPrefix(t *testing.T) {
|
func TestS3BucketListV2DelimiterPrefix(t *testing.T) {
|
||||||
tc := prepareHandlerContext(t)
|
tc := prepareHandlerContext(t)
|
||||||
|
|
||||||
|
|
|
@ -242,14 +242,7 @@ func AddObjectName(l *zap.Logger) Func {
|
||||||
|
|
||||||
rctx := chi.RouteContext(ctx)
|
rctx := chi.RouteContext(ctx)
|
||||||
// trim leading slash (always present)
|
// trim leading slash (always present)
|
||||||
obj := rctx.RoutePath[1:]
|
reqInfo.ObjectName = rctx.RoutePath[1:]
|
||||||
|
|
||||||
object, err := url.PathUnescape(obj)
|
|
||||||
if err != nil {
|
|
||||||
object = obj
|
|
||||||
}
|
|
||||||
|
|
||||||
reqInfo.ObjectName = object
|
|
||||||
|
|
||||||
reqLogger := reqLogOrDefault(ctx, l)
|
reqLogger := reqLogOrDefault(ctx, l)
|
||||||
r = r.WithContext(SetReqLogger(ctx, reqLogger.With(zap.String("object", reqInfo.ObjectName))))
|
r = r.WithContext(SetReqLogger(ctx, reqLogger.With(zap.String("object", reqInfo.ObjectName))))
|
||||||
|
|
|
@ -61,6 +61,51 @@ func TestRouterObjectWithSlashes(t *testing.T) {
|
||||||
require.Equal(t, objName, resp.ReqInfo.ObjectName)
|
require.Equal(t, objName, resp.ReqInfo.ObjectName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRouterObjectEscaping(t *testing.T) {
|
||||||
|
chiRouter := prepareRouter(t)
|
||||||
|
|
||||||
|
bktName := "dkirillov"
|
||||||
|
|
||||||
|
for _, tc := range []struct {
|
||||||
|
name string
|
||||||
|
expectedObjName string
|
||||||
|
objName string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "simple",
|
||||||
|
expectedObjName: "object",
|
||||||
|
objName: "object",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "with slashes",
|
||||||
|
expectedObjName: "fix/object",
|
||||||
|
objName: "fix/object",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "with percentage",
|
||||||
|
expectedObjName: "fix/object%ac",
|
||||||
|
objName: "fix/object%ac",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "with percentage escaped",
|
||||||
|
expectedObjName: "fix/object%ac",
|
||||||
|
objName: "fix/object%25ac",
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
target := fmt.Sprintf("/%s/%s", bktName, tc.objName)
|
||||||
|
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
r := httptest.NewRequest(http.MethodPut, target, nil)
|
||||||
|
|
||||||
|
chiRouter.ServeHTTP(w, r)
|
||||||
|
resp := readResponse(t, w)
|
||||||
|
require.Equal(t, "PutObject", resp.Method)
|
||||||
|
require.Equal(t, tc.expectedObjName, resp.ReqInfo.ObjectName)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func prepareRouter(t *testing.T) *chi.Mux {
|
func prepareRouter(t *testing.T) *chi.Mux {
|
||||||
throttleOps := middleware.ThrottleOpts{
|
throttleOps := middleware.ThrottleOpts{
|
||||||
Limit: 10,
|
Limit: 10,
|
||||||
|
|
Loading…
Reference in a new issue