Fixed incorrect path traversal
This commit is contained in:
parent
20945fb424
commit
63655425af
@ -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
|
||||||
|
@ -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
17
Tree.go
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user