[#383] Fix request type determination #383
2 changed files with 84 additions and 2 deletions
|
@ -191,11 +191,11 @@ func getBucketObject(r *http.Request, domains []string) (reqType ReqType, bktNam
|
||||||
return noneType, "", ""
|
return noneType, "", ""
|
||||||
}
|
}
|
||||||
|
|
||||||
if ind := strings.IndexByte(bktObj, '/'); ind != -1 {
|
if ind := strings.IndexByte(bktObj, '/'); ind != -1 && bktObj[ind+1:] != "" {
|
||||||
return objectType, bktObj[:ind], bktObj[ind+1:]
|
return objectType, bktObj[:ind], bktObj[ind+1:]
|
||||||
}
|
}
|
||||||
|
|
||||||
return bucketType, bktObj, ""
|
return bucketType, strings.TrimSuffix(bktObj, "/"), ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func determineOperation(r *http.Request, reqType ReqType) (operation string) {
|
func determineOperation(r *http.Request, reqType ReqType) (operation string) {
|
||||||
|
|
82
api/middleware/policy_test.go
Normal file
82
api/middleware/policy_test.go
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
package middleware
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestReqTypeDetermination(t *testing.T) {
|
||||||
|
bkt, obj, domain := "test-bucket", "test-object", "domain"
|
||||||
|
|
||||||
|
for _, tc := range []struct {
|
||||||
|
name string
|
||||||
|
target string
|
||||||
|
host string
|
||||||
|
domains []string
|
||||||
|
expectedType ReqType
|
||||||
|
expectedBktName string
|
||||||
|
expectedObjName string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "bucket request, path-style",
|
||||||
|
target: "/" + bkt,
|
||||||
|
expectedType: bucketType,
|
||||||
|
expectedBktName: bkt,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "bucket request with slash, path-style",
|
||||||
|
target: "/" + bkt + "/",
|
||||||
|
expectedType: bucketType,
|
||||||
|
expectedBktName: bkt,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "object request, path-style",
|
||||||
|
target: "/" + bkt + "/" + obj,
|
||||||
|
expectedType: objectType,
|
||||||
|
expectedBktName: bkt,
|
||||||
|
expectedObjName: obj,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "object request with slash, path-style",
|
||||||
|
target: "/" + bkt + "/" + obj + "/",
|
||||||
|
expectedType: objectType,
|
||||||
|
expectedBktName: bkt,
|
||||||
|
expectedObjName: obj + "/",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "none type request",
|
||||||
|
target: "/",
|
||||||
|
expectedType: noneType,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "bucket request, virtual-hosted style",
|
||||||
|
target: "/",
|
||||||
|
host: bkt + "." + domain,
|
||||||
|
domains: []string{"some-domain", domain},
|
||||||
|
expectedType: bucketType,
|
||||||
|
expectedBktName: bkt,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "object request, virtual-hosted style",
|
||||||
|
target: "/" + obj,
|
||||||
|
host: bkt + "." + domain,
|
||||||
|
domains: []string{"some-domain", domain},
|
||||||
|
expectedType: objectType,
|
||||||
|
expectedBktName: bkt,
|
||||||
|
expectedObjName: obj,
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
r := httptest.NewRequest(http.MethodPut, tc.target, nil)
|
||||||
|
r.Host = tc.host
|
||||||
|
|
||||||
|
reqType, bktName, objName := getBucketObject(r, tc.domains)
|
||||||
|
require.Equal(t, tc.expectedType, reqType)
|
||||||
|
require.Equal(t, tc.expectedBktName, bktName)
|
||||||
|
require.Equal(t, tc.expectedObjName, objName)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue