in pkg/common/router/trie/trie.go [198:237]
func (node *Node) Match(parts []string) (*Node, []string, bool) {
key := parts[0]
childKeys := parts[1:]
// isEnd is the end of url path, means node is a place of url end,so the path with parentNode has a real url exists.
isEnd := len(childKeys) == 0
if isEnd {
if node.children != nil && node.children[key] != nil && node.children[key].endOfPath {
return node.children[key], []string{}, true
}
//consider trie node :/aaa/bbb/xxxxx/ccc/ddd /aaa/bbb/:id/ccc and request url is :/aaa/bbb/xxxxx/ccc
if node.PathVariableNode != nil {
if node.PathVariableNode.endOfPath {
return node.PathVariableNode, []string{key}, true
}
}
} else {
if node.children != nil && node.children[key] != nil {
n, param, ok := node.children[key].Match(childKeys)
if ok {
return n, param, ok
}
}
if node.PathVariableNode != nil {
n, param, ok := node.PathVariableNode.Match(childKeys)
param = append(param, key)
if ok {
return n, param, ok
}
}
}
if node.children != nil && node.children[key] != nil && node.children[key].MatchAllNode != nil {
return node.children[key].MatchAllNode, []string{}, true
}
if node.MatchAllNode != nil {
return node.MatchAllNode, []string{}, true
}
return nil, nil, false
}