mirror of
https://github.com/gin-gonic/gin.git
synced 2025-07-04 11:23:20 +08:00
Add mixed param and non-param paths (port of httprouter#329) (#2663)
Co-authored-by: Bo-Yi Wu <appleboy.tw@gmail.com>
This commit is contained in:
50
tree_test.go
50
tree_test.go
@ -137,6 +137,8 @@ func TestTreeWildcard(t *testing.T) {
|
||||
"/",
|
||||
"/cmd/:tool/:sub",
|
||||
"/cmd/:tool/",
|
||||
"/cmd/whoami",
|
||||
"/cmd/whoami/root/",
|
||||
"/src/*filepath",
|
||||
"/search/",
|
||||
"/search/:query",
|
||||
@ -155,8 +157,12 @@ func TestTreeWildcard(t *testing.T) {
|
||||
|
||||
checkRequests(t, tree, testRequests{
|
||||
{"/", false, "/", nil},
|
||||
{"/cmd/test/", false, "/cmd/:tool/", Params{Param{Key: "tool", Value: "test"}}},
|
||||
{"/cmd/test", true, "", Params{Param{Key: "tool", Value: "test"}}},
|
||||
{"/cmd/test", true, "/cmd/:tool/", Params{Param{"tool", "test"}}},
|
||||
{"/cmd/test/", false, "/cmd/:tool/", Params{Param{"tool", "test"}}},
|
||||
{"/cmd/whoami", false, "/cmd/whoami", nil},
|
||||
{"/cmd/whoami/", true, "/cmd/whoami", nil},
|
||||
{"/cmd/whoami/root/", false, "/cmd/whoami/root/", nil},
|
||||
{"/cmd/whoami/root", true, "/cmd/whoami/root/", nil},
|
||||
{"/cmd/test/3", false, "/cmd/:tool/:sub", Params{Param{Key: "tool", Value: "test"}, Param{Key: "sub", Value: "3"}}},
|
||||
{"/src/", false, "/src/*filepath", Params{Param{Key: "filepath", Value: "/"}}},
|
||||
{"/src/some/file.png", false, "/src/*filepath", Params{Param{Key: "filepath", Value: "/some/file.png"}}},
|
||||
@ -245,20 +251,38 @@ func testRoutes(t *testing.T, routes []testRoute) {
|
||||
func TestTreeWildcardConflict(t *testing.T) {
|
||||
routes := []testRoute{
|
||||
{"/cmd/:tool/:sub", false},
|
||||
{"/cmd/vet", true},
|
||||
{"/cmd/vet", false},
|
||||
{"/foo/bar", false},
|
||||
{"/foo/:name", false},
|
||||
{"/foo/:names", true},
|
||||
{"/cmd/*path", true},
|
||||
{"/cmd/:badvar", true},
|
||||
{"/cmd/:tool/names", false},
|
||||
{"/cmd/:tool/:badsub/details", true},
|
||||
{"/src/*filepath", false},
|
||||
{"/src/:file", true},
|
||||
{"/src/static.json", true},
|
||||
{"/src/*filepathx", true},
|
||||
{"/src/", true},
|
||||
{"/src/foo/bar", true},
|
||||
{"/src1/", false},
|
||||
{"/src1/*filepath", true},
|
||||
{"/src2*filepath", true},
|
||||
{"/src2/*filepath", false},
|
||||
{"/search/:query", false},
|
||||
{"/search/invalid", true},
|
||||
{"/search/valid", false},
|
||||
{"/user_:name", false},
|
||||
{"/user_x", true},
|
||||
{"/user_x", false},
|
||||
{"/user_:name", false},
|
||||
{"/id:id", false},
|
||||
{"/id/:id", true},
|
||||
{"/id/:id", false},
|
||||
}
|
||||
testRoutes(t, routes)
|
||||
}
|
||||
|
||||
func TestCatchAllAfterSlash(t *testing.T) {
|
||||
routes := []testRoute{
|
||||
{"/non-leading-*catchall", true},
|
||||
}
|
||||
testRoutes(t, routes)
|
||||
}
|
||||
@ -266,14 +290,17 @@ func TestTreeWildcardConflict(t *testing.T) {
|
||||
func TestTreeChildConflict(t *testing.T) {
|
||||
routes := []testRoute{
|
||||
{"/cmd/vet", false},
|
||||
{"/cmd/:tool/:sub", true},
|
||||
{"/cmd/:tool", false},
|
||||
{"/cmd/:tool/:sub", false},
|
||||
{"/cmd/:tool/misc", false},
|
||||
{"/cmd/:tool/:othersub", true},
|
||||
{"/src/AUTHORS", false},
|
||||
{"/src/*filepath", true},
|
||||
{"/user_x", false},
|
||||
{"/user_:name", true},
|
||||
{"/user_:name", false},
|
||||
{"/id/:id", false},
|
||||
{"/id:id", true},
|
||||
{"/:id", true},
|
||||
{"/id:id", false},
|
||||
{"/:id", false},
|
||||
{"/*filepath", true},
|
||||
}
|
||||
testRoutes(t, routes)
|
||||
@ -688,8 +715,7 @@ func TestTreeWildcardConflictEx(t *testing.T) {
|
||||
{"/who/are/foo", "/foo", `/who/are/\*you`, `/\*you`},
|
||||
{"/who/are/foo/", "/foo/", `/who/are/\*you`, `/\*you`},
|
||||
{"/who/are/foo/bar", "/foo/bar", `/who/are/\*you`, `/\*you`},
|
||||
{"/conxxx", "xxx", `/con:tact`, `:tact`},
|
||||
{"/conooo/xxx", "ooo", `/con:tact`, `:tact`},
|
||||
{"/con:nection", ":nection", `/con:tact`, `:tact`},
|
||||
}
|
||||
|
||||
for _, conflict := range conflicts {
|
||||
|
Reference in New Issue
Block a user