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: TestStatic
PASS: TestParameter PASS: TestParameter
PASS: TestMixed
PASS: TestWildcard PASS: TestWildcard
PASS: TestMap PASS: TestMap
PASS: TestMethods PASS: TestMethods

View File

@ -72,9 +72,35 @@ func TestParameter(t *testing.T) {
assert.Equal(t, data, "Comment") 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) { func TestWildcard(t *testing.T) {
r := router.New[string]() r := router.New[string]()
r.Add("GET", "/", "Front page") r.Add("GET", "/", "Frontpage")
r.Add("GET", "/users/:id", "Parameter") r.Add("GET", "/users/:id", "Parameter")
r.Add("GET", "/images/static", "Static") r.Add("GET", "/images/static", "Static")
r.Add("GET", "/images/*path", "Wildcard") r.Add("GET", "/images/*path", "Wildcard")
@ -84,7 +110,7 @@ func TestWildcard(t *testing.T) {
data, params := r.Lookup("GET", "/") data, params := r.Lookup("GET", "/")
assert.Equal(t, len(params), 0) assert.Equal(t, len(params), 0)
assert.Equal(t, data, "Front page") assert.Equal(t, data, "Frontpage")
data, params = r.Lookup("GET", "/blog-post") data, params = r.Lookup("GET", "/blog-post")
assert.Equal(t, len(params), 1) assert.Equal(t, len(params), 1)

17
Tree.go
View File

@ -92,10 +92,12 @@ func (tree *Tree[T]) Lookup(path string) (T, []Parameter) {
// LookupNoAlloc finds the data for the given path without using any memory allocations. // LookupNoAlloc finds the data for the given path without using any memory allocations.
func (tree *Tree[T]) LookupNoAlloc(path string, addParameter func(key string, value string)) T { func (tree *Tree[T]) LookupNoAlloc(path string, addParameter func(key string, value string)) T {
var ( var (
i uint i uint
wildcardPath string parameterPath string
wildcard *treeNode[T] wildcardPath string
node = &tree.root parameter *treeNode[T]
wildcard *treeNode[T]
node = &tree.root
) )
// Skip the first loop iteration if the starting characters are equal // Skip the first loop iteration if the starting characters are equal
@ -115,6 +117,8 @@ begin:
wildcardPath = path[i:] wildcardPath = path[i:]
} }
parameter = node.parameter
parameterPath = path[i:]
char := path[i] char := path[i]
if char >= node.startIndex && char < node.endIndex { if char >= node.startIndex && char < node.endIndex {
@ -178,6 +182,11 @@ begin:
// node: /|*any // node: /|*any
// path: /|image.png // path: /|image.png
notFound: notFound:
if parameter != nil {
addParameter(parameter.prefix, parameterPath)
return parameter.data
}
if wildcard != nil { if wildcard != nil {
addParameter(wildcard.prefix, wildcardPath) addParameter(wildcard.prefix, wildcardPath)
return wildcard.data return wildcard.data