Fixed incorrect path traversal

This commit is contained in:
Eduard Urbach 2025-03-01 14:27:26 +01:00
parent 20945fb424
commit 63655425af
Signed by: akyoto
GPG Key ID: C874F672B1AF20C0
3 changed files with 42 additions and 6 deletions

View File

@ -45,6 +45,7 @@ data := router.LookupNoAlloc("GET", "/users/42", func(key string, value string)
```
PASS: TestStatic
PASS: TestParameter
PASS: TestMixed
PASS: TestWildcard
PASS: TestMap
PASS: TestMethods

View File

@ -72,6 +72,32 @@ func TestParameter(t *testing.T) {
assert.Equal(t, data, "Comment")
}
func TestMixed(t *testing.T) {
r := router.New[string]()
r.Add("GET", "/", "Frontpage")
r.Add("GET", "/blog", "Blog")
r.Add("GET", "/:post", "Post")
r.Add("GET", "/sitemap.txt", "Sitemap")
data, params := r.Lookup("GET", "/")
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "Frontpage")
data, params = r.Lookup("GET", "/blog")
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "Blog")
data, params = r.Lookup("GET", "/software")
assert.Equal(t, len(params), 1)
assert.Equal(t, params[0].Key, "post")
assert.Equal(t, params[0].Value, "software")
assert.Equal(t, data, "Post")
data, params = r.Lookup("GET", "/sitemap.txt")
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "Sitemap")
}
func TestWildcard(t *testing.T) {
r := router.New[string]()
r.Add("GET", "/", "Frontpage")

View File

@ -93,7 +93,9 @@ func (tree *Tree[T]) Lookup(path string) (T, []Parameter) {
func (tree *Tree[T]) LookupNoAlloc(path string, addParameter func(key string, value string)) T {
var (
i uint
parameterPath string
wildcardPath string
parameter *treeNode[T]
wildcard *treeNode[T]
node = &tree.root
)
@ -115,6 +117,8 @@ begin:
wildcardPath = path[i:]
}
parameter = node.parameter
parameterPath = path[i:]
char := path[i]
if char >= node.startIndex && char < node.endIndex {
@ -178,6 +182,11 @@ begin:
// node: /|*any
// path: /|image.png
notFound:
if parameter != nil {
addParameter(parameter.prefix, parameterPath)
return parameter.data
}
if wildcard != nil {
addParameter(wildcard.prefix, wildcardPath)
return wildcard.data