Skip to content

Commit

Permalink
fix: route containing escaped colon should be matchable but is not ma…
Browse files Browse the repository at this point in the history
…tched to request path (fixes #2046)
  • Loading branch information
aldas committed Dec 17, 2021
1 parent 7bde9ae commit 6b5e62b
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 2 deletions.
3 changes: 3 additions & 0 deletions router.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,9 @@ func (r *Router) Add(method, path string, h HandlerFunc) {
for i, lcpIndex := 0, len(path); i < lcpIndex; i++ {
if path[i] == ':' {
if i > 0 && path[i-1] == '\\' {
path = path[:i-1] + path[i:]
i--
lcpIndex--
continue
}
j := i + 1
Expand Down
16 changes: 14 additions & 2 deletions router_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1124,6 +1124,8 @@ func TestRouterParam_escapeColon(t *testing.T) {
e := New()

e.POST("/files/a/long/file\\:undelete", handlerFunc)
e.POST("/multilevel\\:undelete/second\\:something", handlerFunc)
e.POST("/mixed/:id/second\\:something", handlerFunc)
e.POST("/v1/some/resource/name:customVerb", handlerFunc)

var testCases = []struct {
Expand All @@ -1133,12 +1135,22 @@ func TestRouterParam_escapeColon(t *testing.T) {
expectError string
}{
{
whenURL: "/files/a/long/file\\:undelete",
whenURL: "/files/a/long/file:undelete",
expectRoute: "/files/a/long/file\\:undelete",
expectParam: map[string]string{},
},
{
whenURL: "/files/a/long/file\\:notMatching",
whenURL: "/multilevel:undelete/second:something",
expectRoute: "/multilevel\\:undelete/second\\:something",
expectParam: map[string]string{},
},
{
whenURL: "/mixed/123/second:something",
expectRoute: "/mixed/:id/second\\:something",
expectParam: map[string]string{"id": "123"},
},
{
whenURL: "/files/a/long/file:notMatching",
expectRoute: nil,
expectError: "code=404, message=Not Found",
expectParam: nil,
Expand Down

0 comments on commit 6b5e62b

Please sign in to comment.