mirror of https://github.com/gin-gonic/gin.git
Bugfix for the FullPath feature (#1919)
* worked with more complex situations * the original pr not work when and a short route with the same prefix to some already added routes
This commit is contained in:
parent
fc920dc561
commit
f65018d7b1
|
@ -560,10 +560,15 @@ func TestRouteContextHoldsFullPath(t *testing.T) {
|
|||
|
||||
// Test routes
|
||||
routes := []string{
|
||||
"/",
|
||||
"/simple",
|
||||
"/project/:name",
|
||||
"/",
|
||||
"/news/home",
|
||||
"/news",
|
||||
"/simple-two/one",
|
||||
"/simple-two/one-two",
|
||||
"/project/:name/build/*params",
|
||||
"/project/:name/bui",
|
||||
}
|
||||
|
||||
for _, route := range routes {
|
||||
|
|
9
tree.go
9
tree.go
|
@ -128,6 +128,8 @@ func (n *node) addRoute(path string, handlers HandlersChain) {
|
|||
n.priority++
|
||||
numParams := countParams(path)
|
||||
|
||||
parentFullPathIndex := 0
|
||||
|
||||
// non-empty tree
|
||||
if len(n.path) > 0 || len(n.children) > 0 {
|
||||
walk:
|
||||
|
@ -155,7 +157,7 @@ func (n *node) addRoute(path string, handlers HandlersChain) {
|
|||
children: n.children,
|
||||
handlers: n.handlers,
|
||||
priority: n.priority - 1,
|
||||
fullPath: fullPath,
|
||||
fullPath: n.fullPath,
|
||||
}
|
||||
|
||||
// Update maxParams (max of all children)
|
||||
|
@ -171,6 +173,7 @@ func (n *node) addRoute(path string, handlers HandlersChain) {
|
|||
n.path = path[:i]
|
||||
n.handlers = nil
|
||||
n.wildChild = false
|
||||
n.fullPath = fullPath[:parentFullPathIndex+i]
|
||||
}
|
||||
|
||||
// Make new node a child of this node
|
||||
|
@ -178,6 +181,7 @@ func (n *node) addRoute(path string, handlers HandlersChain) {
|
|||
path = path[i:]
|
||||
|
||||
if n.wildChild {
|
||||
parentFullPathIndex += len(n.path)
|
||||
n = n.children[0]
|
||||
n.priority++
|
||||
|
||||
|
@ -211,6 +215,7 @@ func (n *node) addRoute(path string, handlers HandlersChain) {
|
|||
|
||||
// slash after param
|
||||
if n.nType == param && c == '/' && len(n.children) == 1 {
|
||||
parentFullPathIndex += len(n.path)
|
||||
n = n.children[0]
|
||||
n.priority++
|
||||
continue walk
|
||||
|
@ -219,6 +224,7 @@ func (n *node) addRoute(path string, handlers HandlersChain) {
|
|||
// Check if a child with the next path byte exists
|
||||
for i := 0; i < len(n.indices); i++ {
|
||||
if c == n.indices[i] {
|
||||
parentFullPathIndex += len(n.path)
|
||||
i = n.incrementChildPrio(i)
|
||||
n = n.children[i]
|
||||
continue walk
|
||||
|
@ -369,6 +375,7 @@ func (n *node) insertChild(numParams uint8, path string, fullPath string, handle
|
|||
// insert remaining path part and handle to the leaf
|
||||
n.path = path[offset:]
|
||||
n.handlers = handlers
|
||||
n.fullPath = fullPath
|
||||
}
|
||||
|
||||
// nodeValue holds return values of (*Node).getValue method
|
||||
|
|
Loading…
Reference in New Issue