Check for multiple wildcards per path segment Fixes #56
diff --git a/tree.go b/tree.go index c84a489..e96d361 100644 --- a/tree.go +++ b/tree.go
@@ -186,7 +186,7 @@ } func (n *node) insertChild(numParams uint8, path string, handle Handle) { - var offset int + var offset int // already handled bytes of the path // find prefix until first wildcard (beginning with ':'' or '*'') for i, max := 0, len(path); numParams > 0; i++ { @@ -195,7 +195,7 @@ continue } - // Check if this Node existing children which would be + // check if this Node existing children which would be // unreachable if we insert the wildcard here if len(n.children) > 0 { panic("wildcard route conflicts with existing children") @@ -204,9 +204,16 @@ // find wildcard end (either '/' or path end) end := i + 1 for end < max && path[end] != '/' { - end++ + switch path[end] { + // the wildcard name must not contain ':' and '*' + case ':', '*': + panic("only one wildcard per path segment is allowed") + default: + end++ + } } + // check if the wildcard has a name if end-i < 2 { panic("wildcards must be named with a non-empty name") }
diff --git a/tree_test.go b/tree_test.go index ed1f9a8..484621e 100644 --- a/tree_test.go +++ b/tree_test.go
@@ -339,6 +339,27 @@ testRoutes(t, routes) } +func TestTreeDoubleWildcard(t *testing.T) { + const panicMsg = "only one wildcard per path segment is allowed" + + routes := [...]string{ + "/:foo:bar", + "/:foo:bar/", + "/:foo*bar", + } + + for _, route := range routes { + tree := &node{} + recv := catchPanic(func() { + tree.addRoute(route, nil) + }) + + if rs, ok := recv.(string); !ok || rs != panicMsg { + t.Fatalf(`"Expected panic "%s" for route '%s', got "%v"`, panicMsg, route, recv) + } + } +} + /*func TestTreeDuplicateWildcard(t *testing.T) { tree := &node{}