mirror of https://github.com/gin-gonic/gin.git
parent
d4ca9a0fb1
commit
0a55865c3f
|
@ -410,6 +410,25 @@ func TestTreeRunDynamicRouting(t *testing.T) {
|
||||||
router.GET("/get/:param/abc/", func(c *Context) { c.String(http.StatusOK, "/get/:param/abc/") })
|
router.GET("/get/:param/abc/", func(c *Context) { c.String(http.StatusOK, "/get/:param/abc/") })
|
||||||
router.GET("/something/:paramname/thirdthing", func(c *Context) { c.String(http.StatusOK, "/something/:paramname/thirdthing") })
|
router.GET("/something/:paramname/thirdthing", func(c *Context) { c.String(http.StatusOK, "/something/:paramname/thirdthing") })
|
||||||
router.GET("/something/secondthing/test", func(c *Context) { c.String(http.StatusOK, "/something/secondthing/test") })
|
router.GET("/something/secondthing/test", func(c *Context) { c.String(http.StatusOK, "/something/secondthing/test") })
|
||||||
|
router.GET("/get/abc", func(c *Context) { c.String(http.StatusOK, "/get/abc") })
|
||||||
|
router.GET("/get/:param", func(c *Context) { c.String(http.StatusOK, "/get/:param") })
|
||||||
|
router.GET("/get/abc/123abc", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abc") })
|
||||||
|
router.GET("/get/abc/:param", func(c *Context) { c.String(http.StatusOK, "/get/abc/:param") })
|
||||||
|
router.GET("/get/abc/123abc/xxx8", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abc/xxx8") })
|
||||||
|
router.GET("/get/abc/123abc/:param", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abc/:param") })
|
||||||
|
router.GET("/get/abc/123abc/xxx8/1234", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abc/xxx8/1234") })
|
||||||
|
router.GET("/get/abc/123abc/xxx8/:param", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abc/xxx8/:param") })
|
||||||
|
router.GET("/get/abc/123abc/xxx8/1234/ffas", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abc/xxx8/1234/ffas") })
|
||||||
|
router.GET("/get/abc/123abc/xxx8/1234/:param", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abc/xxx8/1234/:param") })
|
||||||
|
router.GET("/get/abc/123abc/xxx8/1234/kkdd/12c", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abc/xxx8/1234/kkdd/12c") })
|
||||||
|
router.GET("/get/abc/123abc/xxx8/1234/kkdd/:param", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abc/xxx8/1234/kkdd/:param") })
|
||||||
|
router.GET("/get/abc/:param/test", func(c *Context) { c.String(http.StatusOK, "/get/abc/:param/test") })
|
||||||
|
router.GET("/get/abc/123abd/:param", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abd/:param") })
|
||||||
|
router.GET("/get/abc/123abddd/:param", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abddd/:param") })
|
||||||
|
router.GET("/get/abc/123/:param", func(c *Context) { c.String(http.StatusOK, "/get/abc/123/:param") })
|
||||||
|
router.GET("/get/abc/123abg/:param", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abg/:param") })
|
||||||
|
router.GET("/get/abc/123abf/:param", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abf/:param") })
|
||||||
|
router.GET("/get/abc/123abfff/:param", func(c *Context) { c.String(http.StatusOK, "/get/abc/123abfff/:param") })
|
||||||
|
|
||||||
ts := httptest.NewServer(router)
|
ts := httptest.NewServer(router)
|
||||||
defer ts.Close()
|
defer ts.Close()
|
||||||
|
@ -424,8 +443,26 @@ func TestTreeRunDynamicRouting(t *testing.T) {
|
||||||
testRequest(t, ts.URL+"/c/d/e/ff", "", "/:cc/:dd/:ee/ff")
|
testRequest(t, ts.URL+"/c/d/e/ff", "", "/:cc/:dd/:ee/ff")
|
||||||
testRequest(t, ts.URL+"/c/d/e/f/gg", "", "/:cc/:dd/:ee/:ff/gg")
|
testRequest(t, ts.URL+"/c/d/e/f/gg", "", "/:cc/:dd/:ee/:ff/gg")
|
||||||
testRequest(t, ts.URL+"/c/d/e/f/g/hh", "", "/:cc/:dd/:ee/:ff/:gg/hh")
|
testRequest(t, ts.URL+"/c/d/e/f/g/hh", "", "/:cc/:dd/:ee/:ff/:gg/hh")
|
||||||
|
testRequest(t, ts.URL+"/cc/dd/ee/ff/gg/hh", "", "/:cc/:dd/:ee/:ff/:gg/hh")
|
||||||
testRequest(t, ts.URL+"/a", "", "/:cc")
|
testRequest(t, ts.URL+"/a", "", "/:cc")
|
||||||
|
testRequest(t, ts.URL+"/d", "", "/:cc")
|
||||||
|
testRequest(t, ts.URL+"/ad", "", "/:cc")
|
||||||
|
testRequest(t, ts.URL+"/dd", "", "/:cc")
|
||||||
|
testRequest(t, ts.URL+"/aa", "", "/:cc")
|
||||||
|
testRequest(t, ts.URL+"/aaa", "", "/:cc")
|
||||||
|
testRequest(t, ts.URL+"/aaa/cc", "", "/:cc/cc")
|
||||||
|
testRequest(t, ts.URL+"/ab", "", "/:cc")
|
||||||
|
testRequest(t, ts.URL+"/abb", "", "/:cc")
|
||||||
|
testRequest(t, ts.URL+"/abb/cc", "", "/:cc/cc")
|
||||||
|
testRequest(t, ts.URL+"/dddaa", "", "/:cc")
|
||||||
|
testRequest(t, ts.URL+"/allxxxx", "", "/:cc")
|
||||||
|
testRequest(t, ts.URL+"/alldd", "", "/:cc")
|
||||||
|
testRequest(t, ts.URL+"/cc/cc", "", "/:cc/cc")
|
||||||
|
testRequest(t, ts.URL+"/ccc/cc", "", "/:cc/cc")
|
||||||
|
testRequest(t, ts.URL+"/deedwjfs/cc", "", "/:cc/cc")
|
||||||
|
testRequest(t, ts.URL+"/acllcc/cc", "", "/:cc/cc")
|
||||||
testRequest(t, ts.URL+"/get/test/abc/", "", "/get/test/abc/")
|
testRequest(t, ts.URL+"/get/test/abc/", "", "/get/test/abc/")
|
||||||
|
testRequest(t, ts.URL+"/get/testaa/abc/", "", "/get/:param/abc/")
|
||||||
testRequest(t, ts.URL+"/get/te/abc/", "", "/get/:param/abc/")
|
testRequest(t, ts.URL+"/get/te/abc/", "", "/get/:param/abc/")
|
||||||
testRequest(t, ts.URL+"/get/xx/abc/", "", "/get/:param/abc/")
|
testRequest(t, ts.URL+"/get/xx/abc/", "", "/get/:param/abc/")
|
||||||
testRequest(t, ts.URL+"/get/tt/abc/", "", "/get/:param/abc/")
|
testRequest(t, ts.URL+"/get/tt/abc/", "", "/get/:param/abc/")
|
||||||
|
@ -434,10 +471,55 @@ func TestTreeRunDynamicRouting(t *testing.T) {
|
||||||
testRequest(t, ts.URL+"/get/aa/abc/", "", "/get/:param/abc/")
|
testRequest(t, ts.URL+"/get/aa/abc/", "", "/get/:param/abc/")
|
||||||
testRequest(t, ts.URL+"/get/abas/abc/", "", "/get/:param/abc/")
|
testRequest(t, ts.URL+"/get/abas/abc/", "", "/get/:param/abc/")
|
||||||
testRequest(t, ts.URL+"/something/secondthing/test", "", "/something/secondthing/test")
|
testRequest(t, ts.URL+"/something/secondthing/test", "", "/something/secondthing/test")
|
||||||
|
testRequest(t, ts.URL+"/something/secondthingaaaa/thirdthing", "", "/something/:paramname/thirdthing")
|
||||||
testRequest(t, ts.URL+"/something/abcdad/thirdthing", "", "/something/:paramname/thirdthing")
|
testRequest(t, ts.URL+"/something/abcdad/thirdthing", "", "/something/:paramname/thirdthing")
|
||||||
testRequest(t, ts.URL+"/something/se/thirdthing", "", "/something/:paramname/thirdthing")
|
testRequest(t, ts.URL+"/something/se/thirdthing", "", "/something/:paramname/thirdthing")
|
||||||
testRequest(t, ts.URL+"/something/s/thirdthing", "", "/something/:paramname/thirdthing")
|
testRequest(t, ts.URL+"/something/s/thirdthing", "", "/something/:paramname/thirdthing")
|
||||||
testRequest(t, ts.URL+"/something/secondthing/thirdthing", "", "/something/:paramname/thirdthing")
|
testRequest(t, ts.URL+"/something/secondthing/thirdthing", "", "/something/:paramname/thirdthing")
|
||||||
|
testRequest(t, ts.URL+"/get/abc", "", "/get/abc")
|
||||||
|
testRequest(t, ts.URL+"/get/a", "", "/get/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abz", "", "/get/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/12a", "", "/get/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abcd", "", "/get/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc", "", "/get/abc/123abc")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/12", "", "/get/abc/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123ab", "", "/get/abc/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/xyz", "", "/get/abc/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abcddxx", "", "/get/abc/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8", "", "/get/abc/123abc/xxx8")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/x", "", "/get/abc/123abc/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx", "", "/get/abc/123abc/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/abc", "", "/get/abc/123abc/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8xxas", "", "/get/abc/123abc/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1234", "", "/get/abc/123abc/xxx8/1234")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1", "", "/get/abc/123abc/xxx8/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/123", "", "/get/abc/123abc/xxx8/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/78k", "", "/get/abc/123abc/xxx8/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1234xxxd", "", "/get/abc/123abc/xxx8/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1234/ffas", "", "/get/abc/123abc/xxx8/1234/ffas")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1234/f", "", "/get/abc/123abc/xxx8/1234/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1234/ffa", "", "/get/abc/123abc/xxx8/1234/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1234/kka", "", "/get/abc/123abc/xxx8/1234/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1234/ffas321", "", "/get/abc/123abc/xxx8/1234/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1234/kkdd/12c", "", "/get/abc/123abc/xxx8/1234/kkdd/12c")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1234/kkdd/1", "", "/get/abc/123abc/xxx8/1234/kkdd/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1234/kkdd/12", "", "/get/abc/123abc/xxx8/1234/kkdd/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1234/kkdd/12b", "", "/get/abc/123abc/xxx8/1234/kkdd/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1234/kkdd/34", "", "/get/abc/123abc/xxx8/1234/kkdd/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abc/xxx8/1234/kkdd/12c2e3", "", "/get/abc/123abc/xxx8/1234/kkdd/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/12/test", "", "/get/abc/:param/test")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abdd/test", "", "/get/abc/:param/test")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abdddf/test", "", "/get/abc/:param/test")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123ab/test", "", "/get/abc/:param/test")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abgg/test", "", "/get/abc/:param/test")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abff/test", "", "/get/abc/:param/test")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abffff/test", "", "/get/abc/:param/test")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abd/test", "", "/get/abc/123abd/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abddd/test", "", "/get/abc/123abddd/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123/test22", "", "/get/abc/123/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abg/test", "", "/get/abc/123abg/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abf/testss", "", "/get/abc/123abf/:param")
|
||||||
|
testRequest(t, ts.URL+"/get/abc/123abfff/te", "", "/get/abc/123abfff/:param")
|
||||||
// 404 not found
|
// 404 not found
|
||||||
testRequest(t, ts.URL+"/a/dd", "404 Not Found")
|
testRequest(t, ts.URL+"/a/dd", "404 Not Found")
|
||||||
testRequest(t, ts.URL+"/addr/dd/aa", "404 Not Found")
|
testRequest(t, ts.URL+"/addr/dd/aa", "404 Not Found")
|
||||||
|
|
67
tree.go
67
tree.go
|
@ -400,23 +400,10 @@ type nodeValue struct {
|
||||||
// made if a handle exists with an extra (without the) trailing slash for the
|
// made if a handle exists with an extra (without the) trailing slash for the
|
||||||
// given path.
|
// given path.
|
||||||
func (n *node) getValue(path string, params *Params, unescape bool) (value nodeValue) {
|
func (n *node) getValue(path string, params *Params, unescape bool) (value nodeValue) {
|
||||||
// path: /abc/123/def
|
|
||||||
// level 1 router:abc
|
|
||||||
// level 2 router:123
|
|
||||||
// level 3 router:def
|
|
||||||
var (
|
var (
|
||||||
skippedPath string
|
skippedPath string
|
||||||
latestNode = n // not found `level 2 router` use latestNode
|
latestNode = n // Caching the latest node
|
||||||
|
|
||||||
// match '/' count
|
|
||||||
// matchNum < 1: `level 2 router` not found,the current node needs to be equal to latestNode
|
|
||||||
// matchNum >= 1: `level (2 or 3 or 4 or ...) router`: Normal handling
|
|
||||||
matchNum int // each match will accumulate
|
|
||||||
)
|
)
|
||||||
//if path == "/", no need to look for tree node
|
|
||||||
if len(path) == 1 {
|
|
||||||
matchNum = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
walk: // Outer loop for walking the tree
|
walk: // Outer loop for walking the tree
|
||||||
for {
|
for {
|
||||||
|
@ -444,17 +431,13 @@ walk: // Outer loop for walking the tree
|
||||||
}
|
}
|
||||||
|
|
||||||
n = n.children[i]
|
n = n.children[i]
|
||||||
|
|
||||||
// match '/', If this condition is matched, the next route is found
|
|
||||||
if (len(n.fullPath) != 0 && n.wildChild) || path[len(path)-1] == '/' {
|
|
||||||
matchNum++
|
|
||||||
}
|
|
||||||
continue walk
|
continue walk
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// If the path at the end of the loop is not equal to '/' and the current node has no child nodes
|
||||||
// level 2 router not found,the current node needs to be equal to latestNode
|
// the current node needs to be equal to the latest matching node
|
||||||
if matchNum < 1 {
|
matched := path != "/" && !n.wildChild
|
||||||
|
if matched {
|
||||||
n = latestNode
|
n = latestNode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -472,6 +455,16 @@ walk: // Outer loop for walking the tree
|
||||||
|
|
||||||
switch n.nType {
|
switch n.nType {
|
||||||
case param:
|
case param:
|
||||||
|
// fix truncate the parameter
|
||||||
|
// tree_test.go line: 204
|
||||||
|
if matched {
|
||||||
|
path = prefix + path
|
||||||
|
// The saved path is used after the prefix route is intercepted by matching
|
||||||
|
if n.indices == "/" {
|
||||||
|
path = skippedPath[1:]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Find param end (either '/' or path end)
|
// Find param end (either '/' or path end)
|
||||||
end := 0
|
end := 0
|
||||||
for end < len(path) && path[end] != '/' {
|
for end < len(path) && path[end] != '/' {
|
||||||
|
@ -503,18 +496,6 @@ walk: // Outer loop for walking the tree
|
||||||
if len(n.children) > 0 {
|
if len(n.children) > 0 {
|
||||||
path = path[end:]
|
path = path[end:]
|
||||||
n = n.children[0]
|
n = n.children[0]
|
||||||
// next node,the latestNode needs to be equal to currentNode and handle next router
|
|
||||||
latestNode = n
|
|
||||||
// not found router in (level 1 router and handle next node),skippedPath cannot execute
|
|
||||||
// example:
|
|
||||||
// * /:cc/cc
|
|
||||||
// call /a/cc expectations:match/200 Actual:match/200
|
|
||||||
// call /a/dd expectations:unmatch/404 Actual: panic
|
|
||||||
// call /addr/dd/aa expectations:unmatch/404 Actual: panic
|
|
||||||
// skippedPath: It can only be executed if the secondary route is not found
|
|
||||||
// matchNum: Go to the next level of routing tree node search,need add matchNum
|
|
||||||
skippedPath = ""
|
|
||||||
matchNum++
|
|
||||||
continue walk
|
continue walk
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -567,8 +548,9 @@ walk: // Outer loop for walking the tree
|
||||||
}
|
}
|
||||||
|
|
||||||
if path == prefix {
|
if path == prefix {
|
||||||
// level 2 router not found and latestNode.wildChild is true
|
// If the current path does not equal '/' and the node does not have a registered handle and the most recently matched node has a child node
|
||||||
if matchNum < 1 && latestNode.wildChild {
|
// the current node needs to be equal to the latest matching node
|
||||||
|
if latestNode.wildChild && n.handlers == nil && path != "/" {
|
||||||
n = latestNode.children[len(latestNode.children)-1]
|
n = latestNode.children[len(latestNode.children)-1]
|
||||||
}
|
}
|
||||||
// We should have reached the node containing the handle.
|
// We should have reached the node containing the handle.
|
||||||
|
@ -600,10 +582,17 @@ walk: // Outer loop for walking the tree
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// path != "/" && skippedPath != ""
|
if path != "/" && len(skippedPath) > 0 && strings.HasSuffix(skippedPath, path) {
|
||||||
if len(path) != 1 && len(skippedPath) > 0 && strings.HasSuffix(skippedPath, path) {
|
|
||||||
path = skippedPath
|
path = skippedPath
|
||||||
n = latestNode
|
// Reduce the number of cycles
|
||||||
|
n, latestNode = latestNode, n
|
||||||
|
// skippedPath cannot execute
|
||||||
|
// example:
|
||||||
|
// * /:cc/cc
|
||||||
|
// call /a/cc expectations:match/200 Actual:match/200
|
||||||
|
// call /a/dd expectations:unmatch/404 Actual: panic
|
||||||
|
// call /addr/dd/aa expectations:unmatch/404 Actual: panic
|
||||||
|
// skippedPath: It can only be executed if the secondary route is not found
|
||||||
skippedPath = ""
|
skippedPath = ""
|
||||||
continue walk
|
continue walk
|
||||||
}
|
}
|
||||||
|
|
91
tree_test.go
91
tree_test.go
|
@ -166,6 +166,25 @@ func TestTreeWildcard(t *testing.T) {
|
||||||
"/get/:param/abc/",
|
"/get/:param/abc/",
|
||||||
"/something/:paramname/thirdthing",
|
"/something/:paramname/thirdthing",
|
||||||
"/something/secondthing/test",
|
"/something/secondthing/test",
|
||||||
|
"/get/abc",
|
||||||
|
"/get/:param",
|
||||||
|
"/get/abc/123abc",
|
||||||
|
"/get/abc/:param",
|
||||||
|
"/get/abc/123abc/xxx8",
|
||||||
|
"/get/abc/123abc/:param",
|
||||||
|
"/get/abc/123abc/xxx8/1234",
|
||||||
|
"/get/abc/123abc/xxx8/:param",
|
||||||
|
"/get/abc/123abc/xxx8/1234/ffas",
|
||||||
|
"/get/abc/123abc/xxx8/1234/:param",
|
||||||
|
"/get/abc/123abc/xxx8/1234/kkdd/12c",
|
||||||
|
"/get/abc/123abc/xxx8/1234/kkdd/:param",
|
||||||
|
"/get/abc/:param/test",
|
||||||
|
"/get/abc/123abd/:param",
|
||||||
|
"/get/abc/123abddd/:param",
|
||||||
|
"/get/abc/123/:param",
|
||||||
|
"/get/abc/123abg/:param",
|
||||||
|
"/get/abc/123abf/:param",
|
||||||
|
"/get/abc/123abfff/:param",
|
||||||
}
|
}
|
||||||
for _, route := range routes {
|
for _, route := range routes {
|
||||||
tree.addRoute(route, fakeHandler(route))
|
tree.addRoute(route, fakeHandler(route))
|
||||||
|
@ -201,13 +220,31 @@ func TestTreeWildcard(t *testing.T) {
|
||||||
{"/aa/aa", false, "/aa/*xx", Params{Param{Key: "xx", Value: "/aa"}}},
|
{"/aa/aa", false, "/aa/*xx", Params{Param{Key: "xx", Value: "/aa"}}},
|
||||||
{"/ab/ab", false, "/ab/*xx", Params{Param{Key: "xx", Value: "/ab"}}},
|
{"/ab/ab", false, "/ab/*xx", Params{Param{Key: "xx", Value: "/ab"}}},
|
||||||
{"/a", false, "/:cc", Params{Param{Key: "cc", Value: "a"}}},
|
{"/a", false, "/:cc", Params{Param{Key: "cc", Value: "a"}}},
|
||||||
// * level 1 router match param will be Intercept first
|
// * Error with argument being intercepted
|
||||||
// new PR handle (/all /all/cc /a/cc)
|
// new PR handle (/all /all/cc /a/cc)
|
||||||
{"/all", false, "/:cc", Params{Param{Key: "cc", Value: "ll"}}},
|
// fix PR: https://github.com/gin-gonic/gin/pull/2796
|
||||||
{"/all/cc", false, "/:cc/cc", Params{Param{Key: "cc", Value: "ll"}}},
|
{"/all", false, "/:cc", Params{Param{Key: "cc", Value: "all"}}},
|
||||||
{"/a/cc", false, "/:cc/cc", Params{Param{Key: "cc", Value: ""}}},
|
{"/d", false, "/:cc", Params{Param{Key: "cc", Value: "d"}}},
|
||||||
|
{"/ad", false, "/:cc", Params{Param{Key: "cc", Value: "ad"}}},
|
||||||
|
{"/dd", false, "/:cc", Params{Param{Key: "cc", Value: "dd"}}},
|
||||||
|
{"/dddaa", false, "/:cc", Params{Param{Key: "cc", Value: "dddaa"}}},
|
||||||
|
{"/aa", false, "/:cc", Params{Param{Key: "cc", Value: "aa"}}},
|
||||||
|
{"/aaa", false, "/:cc", Params{Param{Key: "cc", Value: "aaa"}}},
|
||||||
|
{"/aaa/cc", false, "/:cc/cc", Params{Param{Key: "cc", Value: "aaa"}}},
|
||||||
|
{"/ab", false, "/:cc", Params{Param{Key: "cc", Value: "ab"}}},
|
||||||
|
{"/abb", false, "/:cc", Params{Param{Key: "cc", Value: "abb"}}},
|
||||||
|
{"/abb/cc", false, "/:cc/cc", Params{Param{Key: "cc", Value: "abb"}}},
|
||||||
|
{"/allxxxx", false, "/:cc", Params{Param{Key: "cc", Value: "allxxxx"}}},
|
||||||
|
{"/alldd", false, "/:cc", Params{Param{Key: "cc", Value: "alldd"}}},
|
||||||
|
{"/all/cc", false, "/:cc/cc", Params{Param{Key: "cc", Value: "all"}}},
|
||||||
|
{"/a/cc", false, "/:cc/cc", Params{Param{Key: "cc", Value: "a"}}},
|
||||||
|
{"/cc/cc", false, "/:cc/cc", Params{Param{Key: "cc", Value: "cc"}}},
|
||||||
|
{"/ccc/cc", false, "/:cc/cc", Params{Param{Key: "cc", Value: "ccc"}}},
|
||||||
|
{"/deedwjfs/cc", false, "/:cc/cc", Params{Param{Key: "cc", Value: "deedwjfs"}}},
|
||||||
|
{"/acllcc/cc", false, "/:cc/cc", Params{Param{Key: "cc", Value: "acllcc"}}},
|
||||||
{"/get/test/abc/", false, "/get/test/abc/", nil},
|
{"/get/test/abc/", false, "/get/test/abc/", nil},
|
||||||
{"/get/te/abc/", false, "/get/:param/abc/", Params{Param{Key: "param", Value: "te"}}},
|
{"/get/te/abc/", false, "/get/:param/abc/", Params{Param{Key: "param", Value: "te"}}},
|
||||||
|
{"/get/testaa/abc/", false, "/get/:param/abc/", Params{Param{Key: "param", Value: "testaa"}}},
|
||||||
{"/get/xx/abc/", false, "/get/:param/abc/", Params{Param{Key: "param", Value: "xx"}}},
|
{"/get/xx/abc/", false, "/get/:param/abc/", Params{Param{Key: "param", Value: "xx"}}},
|
||||||
{"/get/tt/abc/", false, "/get/:param/abc/", Params{Param{Key: "param", Value: "tt"}}},
|
{"/get/tt/abc/", false, "/get/:param/abc/", Params{Param{Key: "param", Value: "tt"}}},
|
||||||
{"/get/a/abc/", false, "/get/:param/abc/", Params{Param{Key: "param", Value: "a"}}},
|
{"/get/a/abc/", false, "/get/:param/abc/", Params{Param{Key: "param", Value: "a"}}},
|
||||||
|
@ -216,12 +253,58 @@ func TestTreeWildcard(t *testing.T) {
|
||||||
{"/get/abas/abc/", false, "/get/:param/abc/", Params{Param{Key: "param", Value: "abas"}}},
|
{"/get/abas/abc/", false, "/get/:param/abc/", Params{Param{Key: "param", Value: "abas"}}},
|
||||||
{"/something/secondthing/test", false, "/something/secondthing/test", nil},
|
{"/something/secondthing/test", false, "/something/secondthing/test", nil},
|
||||||
{"/something/abcdad/thirdthing", false, "/something/:paramname/thirdthing", Params{Param{Key: "paramname", Value: "abcdad"}}},
|
{"/something/abcdad/thirdthing", false, "/something/:paramname/thirdthing", Params{Param{Key: "paramname", Value: "abcdad"}}},
|
||||||
|
{"/something/secondthingaaaa/thirdthing", false, "/something/:paramname/thirdthing", Params{Param{Key: "paramname", Value: "secondthingaaaa"}}},
|
||||||
{"/something/se/thirdthing", false, "/something/:paramname/thirdthing", Params{Param{Key: "paramname", Value: "se"}}},
|
{"/something/se/thirdthing", false, "/something/:paramname/thirdthing", Params{Param{Key: "paramname", Value: "se"}}},
|
||||||
{"/something/s/thirdthing", false, "/something/:paramname/thirdthing", Params{Param{Key: "paramname", Value: "s"}}},
|
{"/something/s/thirdthing", false, "/something/:paramname/thirdthing", Params{Param{Key: "paramname", Value: "s"}}},
|
||||||
{"/c/d/ee", false, "/:cc/:dd/ee", Params{Param{Key: "cc", Value: "c"}, Param{Key: "dd", Value: "d"}}},
|
{"/c/d/ee", false, "/:cc/:dd/ee", Params{Param{Key: "cc", Value: "c"}, Param{Key: "dd", Value: "d"}}},
|
||||||
{"/c/d/e/ff", false, "/:cc/:dd/:ee/ff", Params{Param{Key: "cc", Value: "c"}, Param{Key: "dd", Value: "d"}, Param{Key: "ee", Value: "e"}}},
|
{"/c/d/e/ff", false, "/:cc/:dd/:ee/ff", Params{Param{Key: "cc", Value: "c"}, Param{Key: "dd", Value: "d"}, Param{Key: "ee", Value: "e"}}},
|
||||||
{"/c/d/e/f/gg", false, "/:cc/:dd/:ee/:ff/gg", Params{Param{Key: "cc", Value: "c"}, Param{Key: "dd", Value: "d"}, Param{Key: "ee", Value: "e"}, Param{Key: "ff", Value: "f"}}},
|
{"/c/d/e/f/gg", false, "/:cc/:dd/:ee/:ff/gg", Params{Param{Key: "cc", Value: "c"}, Param{Key: "dd", Value: "d"}, Param{Key: "ee", Value: "e"}, Param{Key: "ff", Value: "f"}}},
|
||||||
{"/c/d/e/f/g/hh", false, "/:cc/:dd/:ee/:ff/:gg/hh", Params{Param{Key: "cc", Value: "c"}, Param{Key: "dd", Value: "d"}, Param{Key: "ee", Value: "e"}, Param{Key: "ff", Value: "f"}, Param{Key: "gg", Value: "g"}}},
|
{"/c/d/e/f/g/hh", false, "/:cc/:dd/:ee/:ff/:gg/hh", Params{Param{Key: "cc", Value: "c"}, Param{Key: "dd", Value: "d"}, Param{Key: "ee", Value: "e"}, Param{Key: "ff", Value: "f"}, Param{Key: "gg", Value: "g"}}},
|
||||||
|
{"/cc/dd/ee/ff/gg/hh", false, "/:cc/:dd/:ee/:ff/:gg/hh", Params{Param{Key: "cc", Value: "cc"}, Param{Key: "dd", Value: "dd"}, Param{Key: "ee", Value: "ee"}, Param{Key: "ff", Value: "ff"}, Param{Key: "gg", Value: "gg"}}},
|
||||||
|
{"/get/abc", false, "/get/abc", nil},
|
||||||
|
{"/get/a", false, "/get/:param", Params{Param{Key: "param", Value: "a"}}},
|
||||||
|
{"/get/abz", false, "/get/:param", Params{Param{Key: "param", Value: "abz"}}},
|
||||||
|
{"/get/12a", false, "/get/:param", Params{Param{Key: "param", Value: "12a"}}},
|
||||||
|
{"/get/abcd", false, "/get/:param", Params{Param{Key: "param", Value: "abcd"}}},
|
||||||
|
{"/get/abc/123abc", false, "/get/abc/123abc", nil},
|
||||||
|
{"/get/abc/12", false, "/get/abc/:param", Params{Param{Key: "param", Value: "12"}}},
|
||||||
|
{"/get/abc/123ab", false, "/get/abc/:param", Params{Param{Key: "param", Value: "123ab"}}},
|
||||||
|
{"/get/abc/xyz", false, "/get/abc/:param", Params{Param{Key: "param", Value: "xyz"}}},
|
||||||
|
{"/get/abc/123abcddxx", false, "/get/abc/:param", Params{Param{Key: "param", Value: "123abcddxx"}}},
|
||||||
|
{"/get/abc/123abc/xxx8", false, "/get/abc/123abc/xxx8", nil},
|
||||||
|
{"/get/abc/123abc/x", false, "/get/abc/123abc/:param", Params{Param{Key: "param", Value: "x"}}},
|
||||||
|
{"/get/abc/123abc/xxx", false, "/get/abc/123abc/:param", Params{Param{Key: "param", Value: "xxx"}}},
|
||||||
|
{"/get/abc/123abc/abc", false, "/get/abc/123abc/:param", Params{Param{Key: "param", Value: "abc"}}},
|
||||||
|
{"/get/abc/123abc/xxx8xxas", false, "/get/abc/123abc/:param", Params{Param{Key: "param", Value: "xxx8xxas"}}},
|
||||||
|
{"/get/abc/123abc/xxx8/1234", false, "/get/abc/123abc/xxx8/1234", nil},
|
||||||
|
{"/get/abc/123abc/xxx8/1", false, "/get/abc/123abc/xxx8/:param", Params{Param{Key: "param", Value: "1"}}},
|
||||||
|
{"/get/abc/123abc/xxx8/123", false, "/get/abc/123abc/xxx8/:param", Params{Param{Key: "param", Value: "123"}}},
|
||||||
|
{"/get/abc/123abc/xxx8/78k", false, "/get/abc/123abc/xxx8/:param", Params{Param{Key: "param", Value: "78k"}}},
|
||||||
|
{"/get/abc/123abc/xxx8/1234xxxd", false, "/get/abc/123abc/xxx8/:param", Params{Param{Key: "param", Value: "1234xxxd"}}},
|
||||||
|
{"/get/abc/123abc/xxx8/1234/ffas", false, "/get/abc/123abc/xxx8/1234/ffas", nil},
|
||||||
|
{"/get/abc/123abc/xxx8/1234/f", false, "/get/abc/123abc/xxx8/1234/:param", Params{Param{Key: "param", Value: "f"}}},
|
||||||
|
{"/get/abc/123abc/xxx8/1234/ffa", false, "/get/abc/123abc/xxx8/1234/:param", Params{Param{Key: "param", Value: "ffa"}}},
|
||||||
|
{"/get/abc/123abc/xxx8/1234/kka", false, "/get/abc/123abc/xxx8/1234/:param", Params{Param{Key: "param", Value: "kka"}}},
|
||||||
|
{"/get/abc/123abc/xxx8/1234/ffas321", false, "/get/abc/123abc/xxx8/1234/:param", Params{Param{Key: "param", Value: "ffas321"}}},
|
||||||
|
{"/get/abc/123abc/xxx8/1234/kkdd/12c", false, "/get/abc/123abc/xxx8/1234/kkdd/12c", nil},
|
||||||
|
{"/get/abc/123abc/xxx8/1234/kkdd/1", false, "/get/abc/123abc/xxx8/1234/kkdd/:param", Params{Param{Key: "param", Value: "1"}}},
|
||||||
|
{"/get/abc/123abc/xxx8/1234/kkdd/12", false, "/get/abc/123abc/xxx8/1234/kkdd/:param", Params{Param{Key: "param", Value: "12"}}},
|
||||||
|
{"/get/abc/123abc/xxx8/1234/kkdd/12b", false, "/get/abc/123abc/xxx8/1234/kkdd/:param", Params{Param{Key: "param", Value: "12b"}}},
|
||||||
|
{"/get/abc/123abc/xxx8/1234/kkdd/34", false, "/get/abc/123abc/xxx8/1234/kkdd/:param", Params{Param{Key: "param", Value: "34"}}},
|
||||||
|
{"/get/abc/123abc/xxx8/1234/kkdd/12c2e3", false, "/get/abc/123abc/xxx8/1234/kkdd/:param", Params{Param{Key: "param", Value: "12c2e3"}}},
|
||||||
|
{"/get/abc/12/test", false, "/get/abc/:param/test", Params{Param{Key: "param", Value: "12"}}},
|
||||||
|
{"/get/abc/123abdd/test", false, "/get/abc/:param/test", Params{Param{Key: "param", Value: "123abdd"}}},
|
||||||
|
{"/get/abc/123abdddf/test", false, "/get/abc/:param/test", Params{Param{Key: "param", Value: "123abdddf"}}},
|
||||||
|
{"/get/abc/123ab/test", false, "/get/abc/:param/test", Params{Param{Key: "param", Value: "123ab"}}},
|
||||||
|
{"/get/abc/123abgg/test", false, "/get/abc/:param/test", Params{Param{Key: "param", Value: "123abgg"}}},
|
||||||
|
{"/get/abc/123abff/test", false, "/get/abc/:param/test", Params{Param{Key: "param", Value: "123abff"}}},
|
||||||
|
{"/get/abc/123abffff/test", false, "/get/abc/:param/test", Params{Param{Key: "param", Value: "123abffff"}}},
|
||||||
|
{"/get/abc/123abd/test", false, "/get/abc/123abd/:param", Params{Param{Key: "param", Value: "test"}}},
|
||||||
|
{"/get/abc/123abddd/test", false, "/get/abc/123abddd/:param", Params{Param{Key: "param", Value: "test"}}},
|
||||||
|
{"/get/abc/123/test22", false, "/get/abc/123/:param", Params{Param{Key: "param", Value: "test22"}}},
|
||||||
|
{"/get/abc/123abg/test", false, "/get/abc/123abg/:param", Params{Param{Key: "param", Value: "test"}}},
|
||||||
|
{"/get/abc/123abf/testss", false, "/get/abc/123abf/:param", Params{Param{Key: "param", Value: "testss"}}},
|
||||||
|
{"/get/abc/123abfff/te", false, "/get/abc/123abfff/:param", Params{Param{Key: "param", Value: "te"}}},
|
||||||
})
|
})
|
||||||
|
|
||||||
checkPriorities(t, tree)
|
checkPriorities(t, tree)
|
||||||
|
|
Loading…
Reference in New Issue