|
|
@@ -37,9 +37,14 @@ type testRequests []struct {
|
|
|
ps Params
|
|
|
}
|
|
|
|
|
|
-func checkRequests(t *testing.T, tree *node, requests testRequests) {
|
|
|
+func checkRequests(t *testing.T, tree *node, requests testRequests, unescapes ...bool) {
|
|
|
+ unescape := false
|
|
|
+ if len(unescapes) >= 1 {
|
|
|
+ unescape = unescapes[0]
|
|
|
+ }
|
|
|
+
|
|
|
for _, request := range requests {
|
|
|
- handler, ps, _ := tree.getValue(request.path, nil)
|
|
|
+ handler, ps, _ := tree.getValue(request.path, nil, unescape)
|
|
|
|
|
|
if handler == nil {
|
|
|
if !request.nilHandler {
|
|
|
@@ -197,6 +202,45 @@ func TestTreeWildcard(t *testing.T) {
|
|
|
checkMaxParams(t, tree)
|
|
|
}
|
|
|
|
|
|
+func TestUnescapeParameters(t *testing.T) {
|
|
|
+ tree := &node{}
|
|
|
+
|
|
|
+ routes := [...]string{
|
|
|
+ "/",
|
|
|
+ "/cmd/:tool/:sub",
|
|
|
+ "/cmd/:tool/",
|
|
|
+ "/src/*filepath",
|
|
|
+ "/search/:query",
|
|
|
+ "/files/:dir/*filepath",
|
|
|
+ "/info/:user/project/:project",
|
|
|
+ "/info/:user",
|
|
|
+ }
|
|
|
+ for _, route := range routes {
|
|
|
+ tree.addRoute(route, fakeHandler(route))
|
|
|
+ }
|
|
|
+
|
|
|
+ //printChildren(tree, "")
|
|
|
+ unescape := true
|
|
|
+ checkRequests(t, tree, testRequests{
|
|
|
+ {"/", false, "/", nil},
|
|
|
+ {"/cmd/test/", false, "/cmd/:tool/", Params{Param{"tool", "test"}}},
|
|
|
+ {"/cmd/test", true, "", Params{Param{"tool", "test"}}},
|
|
|
+ {"/src/some/file.png", false, "/src/*filepath", Params{Param{"filepath", "/some/file.png"}}},
|
|
|
+ {"/src/some/file+test.png", false, "/src/*filepath", Params{Param{"filepath", "/some/file test.png"}}},
|
|
|
+ {"/src/some/file++++%%%%test.png", false, "/src/*filepath", Params{Param{"filepath", "/some/file++++%%%%test.png"}}},
|
|
|
+ {"/src/some/file%2Ftest.png", false, "/src/*filepath", Params{Param{"filepath", "/some/file/test.png"}}},
|
|
|
+ {"/search/someth!ng+in+ünìcodé", false, "/search/:query", Params{Param{"query", "someth!ng in ünìcodé"}}},
|
|
|
+ {"/info/gordon/project/go", false, "/info/:user/project/:project", Params{Param{"user", "gordon"}, Param{"project", "go"}}},
|
|
|
+ {"/info/slash%2Fgordon", false, "/info/:user", Params{Param{"user", "slash/gordon"}}},
|
|
|
+ {"/info/slash%2Fgordon/project/Project%20%231", false, "/info/:user/project/:project", Params{Param{"user", "slash/gordon"}, Param{"project", "Project #1"}}},
|
|
|
+ {"/info/slash%%%%", false, "/info/:user", Params{Param{"user", "slash%%%%"}}},
|
|
|
+ {"/info/slash%%%%2Fgordon/project/Project%%%%20%231", false, "/info/:user/project/:project", Params{Param{"user", "slash%%%%2Fgordon"}, Param{"project", "Project%%%%20%231"}}},
|
|
|
+ }, unescape)
|
|
|
+
|
|
|
+ checkPriorities(t, tree)
|
|
|
+ checkMaxParams(t, tree)
|
|
|
+}
|
|
|
+
|
|
|
func catchPanic(testFunc func()) (recv interface{}) {
|
|
|
defer func() {
|
|
|
recv = recover()
|
|
|
@@ -430,7 +474,7 @@ func TestTreeTrailingSlashRedirect(t *testing.T) {
|
|
|
"/doc/",
|
|
|
}
|
|
|
for _, route := range tsrRoutes {
|
|
|
- handler, _, tsr := tree.getValue(route, nil)
|
|
|
+ handler, _, tsr := tree.getValue(route, nil, false)
|
|
|
if handler != nil {
|
|
|
t.Fatalf("non-nil handler for TSR route '%s", route)
|
|
|
} else if !tsr {
|
|
|
@@ -447,7 +491,7 @@ func TestTreeTrailingSlashRedirect(t *testing.T) {
|
|
|
"/api/world/abc",
|
|
|
}
|
|
|
for _, route := range noTsrRoutes {
|
|
|
- handler, _, tsr := tree.getValue(route, nil)
|
|
|
+ handler, _, tsr := tree.getValue(route, nil, false)
|
|
|
if handler != nil {
|
|
|
t.Fatalf("non-nil handler for No-TSR route '%s", route)
|
|
|
} else if tsr {
|
|
|
@@ -466,7 +510,7 @@ func TestTreeRootTrailingSlashRedirect(t *testing.T) {
|
|
|
t.Fatalf("panic inserting test route: %v", recv)
|
|
|
}
|
|
|
|
|
|
- handler, _, tsr := tree.getValue("/", nil)
|
|
|
+ handler, _, tsr := tree.getValue("/", nil, false)
|
|
|
if handler != nil {
|
|
|
t.Fatalf("non-nil handler")
|
|
|
} else if tsr {
|
|
|
@@ -617,7 +661,7 @@ func TestTreeInvalidNodeType(t *testing.T) {
|
|
|
|
|
|
// normal lookup
|
|
|
recv := catchPanic(func() {
|
|
|
- tree.getValue("/test", nil)
|
|
|
+ tree.getValue("/test", nil, false)
|
|
|
})
|
|
|
if rs, ok := recv.(string); !ok || rs != panicMsg {
|
|
|
t.Fatalf("Expected panic '"+panicMsg+"', got '%v'", recv)
|