forked from mirror/gin
fix(route): redirectSlash bug (#3227)
fixes https://github.com/gin-gonic/gin/issues/2959 fixes https://github.com/gin-gonic/gin/issues/2282 fixes https://github.com/gin-gonic/gin/issues/2211
This commit is contained in:
parent
51aea73ba0
commit
8b9c55e8b0
9
tree.go
9
tree.go
|
@ -107,7 +107,8 @@ func countSections(path string) uint16 {
|
||||||
type nodeType uint8
|
type nodeType uint8
|
||||||
|
|
||||||
const (
|
const (
|
||||||
root nodeType = iota + 1
|
static nodeType = iota
|
||||||
|
root
|
||||||
param
|
param
|
||||||
catchAll
|
catchAll
|
||||||
)
|
)
|
||||||
|
@ -173,6 +174,7 @@ walk:
|
||||||
child := node{
|
child := node{
|
||||||
path: n.path[i:],
|
path: n.path[i:],
|
||||||
wildChild: n.wildChild,
|
wildChild: n.wildChild,
|
||||||
|
nType: static,
|
||||||
indices: n.indices,
|
indices: n.indices,
|
||||||
children: n.children,
|
children: n.children,
|
||||||
handlers: n.handlers,
|
handlers: n.handlers,
|
||||||
|
@ -604,6 +606,11 @@ walk: // Outer loop for walking the tree
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if path == "/" && n.nType == static {
|
||||||
|
value.tsr = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// No handle found. Check if a handle for this path + a
|
// No handle found. Check if a handle for this path + a
|
||||||
// trailing slash exists for trailing slash recommendation
|
// trailing slash exists for trailing slash recommendation
|
||||||
for i, c := range []byte(n.indices) {
|
for i, c := range []byte(n.indices) {
|
||||||
|
|
20
tree_test.go
20
tree_test.go
|
@ -684,6 +684,26 @@ func TestTreeRootTrailingSlashRedirect(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRedirectTrailingSlash(t *testing.T) {
|
||||||
|
var data = []struct {
|
||||||
|
path string
|
||||||
|
}{
|
||||||
|
{"/hello/:name"},
|
||||||
|
{"/hello/:name/123"},
|
||||||
|
{"/hello/:name/234"},
|
||||||
|
}
|
||||||
|
|
||||||
|
node := &node{}
|
||||||
|
for _, item := range data {
|
||||||
|
node.addRoute(item.path, fakeHandler("test"))
|
||||||
|
}
|
||||||
|
|
||||||
|
value := node.getValue("/hello/abx/", nil, getSkippedNodes(), false)
|
||||||
|
if value.tsr != true {
|
||||||
|
t.Fatalf("want true, is false")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestTreeFindCaseInsensitivePath(t *testing.T) {
|
func TestTreeFindCaseInsensitivePath(t *testing.T) {
|
||||||
tree := &node{}
|
tree := &node{}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue