diff --git a/path.go b/path.go index 27f09f5f9e..927a97aaca 100644 --- a/path.go +++ b/path.go @@ -362,23 +362,15 @@ func findLastCharsetPosition(search string, charset []byte) int { // findNextCharsetPositionConstraint search the next char position from the charset // unlike findNextCharsetPosition, it takes care of constraint start-end chars to parse route pattern func findNextCharsetPositionConstraint(search string, charset []byte) int { + constraintStart := findNextNonEscapedCharsetPosition(search, parameterConstraintStartChars) + constraintEnd := findNextNonEscapedCharsetPosition(search, parameterConstraintEndChars) nextPosition := -1 - constraintStart := -1 - constraintEnd := -1 for _, char := range charset { pos := strings.IndexByte(search, char) - if char == paramConstraintStart { - constraintStart = pos - } - - if char == paramConstraintEnd { - constraintEnd = pos - } - if pos != -1 && (pos < nextPosition || nextPosition == -1) { - if pos > constraintStart && pos < constraintEnd { + if (pos > constraintStart && pos > constraintEnd) || (pos < constraintStart && pos < constraintEnd) { nextPosition = pos } } diff --git a/path_test.go b/path_test.go index ca02ea2b15..b25816c401 100644 --- a/path_test.go +++ b/path_test.go @@ -568,6 +568,35 @@ func Test_Path_matchParams(t *testing.T) { {url: "/api/v1/1200", params: []string{"1200"}, match: true}, {url: "/api/v1/true", params: []string{"true"}, match: false}, }) + testCase("/api/v1/:lang/videos/:page", []testparams{ + {url: "/api/v1/try/videos/200", params: []string{"try", "200"}, match: false}, + {url: "/api/v1/tr/videos/1800", params: []string{"tr", "1800"}, match: false}, + {url: "/api/v1/tr/videos/100", params: []string{"tr", "100"}, match: true}, + {url: "/api/v1/e/videos/10", params: []string{"tr", "200"}, match: false}, + }) + testCase("/api/v1/:lang/:page", []testparams{ + {url: "/api/v1/try/200", params: []string{"try", "200"}, match: false}, + {url: "/api/v1/tr/1800", params: []string{"tr", "1800"}, match: false}, + {url: "/api/v1/tr/100", params: []string{"tr", "100"}, match: true}, + {url: "/api/v1/e/10", params: []string{"tr", "200"}, match: false}, + }) + testCase("/api/v1/:lang/:page", []testparams{ + {url: "/api/v1/try/200", params: []string{"try", "200"}, match: true}, + {url: "/api/v1/tr/1800", params: []string{"tr", "1800"}, match: false}, + {url: "/api/v1/tr/100", params: []string{"tr", "100"}, match: true}, + {url: "/api/v1/e/10", params: []string{"tr", "200"}, match: false}, + }) + testCase("/api/v1/:lang/:page", []testparams{ + {url: "/api/v1/try/200", params: []string{"try", "200"}, match: false}, + {url: "/api/v1/tr/1800", params: []string{"tr", "1800"}, match: true}, + {url: "/api/v1/tr/100", params: []string{"tr", "100"}, match: true}, + {url: "/api/v1/e/10", params: []string{"tr", "200"}, match: false}, + }) + testCase("/api/v1/:date/:regex", []testparams{ + {url: "/api/v1/2005-11-01/a", params: []string{"2005-11-01", "a"}, match: false}, + {url: "/api/v1/2005-1101/paach", params: []string{"2005-1101", "a"}, match: false}, + {url: "/api/v1/2005-11-01/peach", params: []string{"2005-11-01", "peach"}, match: true}, + }) } func Test_Utils_GetTrimmedParam(t *testing.T) { @@ -793,4 +822,33 @@ func Benchmark_Path_matchParams(t *testing.B) { {url: "/api/v1/1200", params: []string{"1200"}, match: true}, {url: "/api/v1/true", params: []string{"true"}, match: false}, }) + benchCase("/api/v1/:lang/videos/:page", []testparams{ + {url: "/api/v1/try/videos/200", params: []string{"try", "200"}, match: false}, + {url: "/api/v1/tr/videos/1800", params: []string{"tr", "1800"}, match: false}, + {url: "/api/v1/tr/videos/100", params: []string{"tr", "100"}, match: true}, + {url: "/api/v1/e/videos/10", params: []string{"tr", "200"}, match: false}, + }) + benchCase("/api/v1/:lang/:page", []testparams{ + {url: "/api/v1/try/200", params: []string{"try", "200"}, match: false}, + {url: "/api/v1/tr/1800", params: []string{"tr", "1800"}, match: false}, + {url: "/api/v1/tr/100", params: []string{"tr", "100"}, match: true}, + {url: "/api/v1/e/10", params: []string{"tr", "200"}, match: false}, + }) + benchCase("/api/v1/:lang/:page", []testparams{ + {url: "/api/v1/try/200", params: []string{"try", "200"}, match: true}, + {url: "/api/v1/tr/1800", params: []string{"tr", "1800"}, match: false}, + {url: "/api/v1/tr/100", params: []string{"tr", "100"}, match: true}, + {url: "/api/v1/e/10", params: []string{"tr", "200"}, match: false}, + }) + benchCase("/api/v1/:lang/:page", []testparams{ + {url: "/api/v1/try/200", params: []string{"try", "200"}, match: false}, + {url: "/api/v1/tr/1800", params: []string{"tr", "1800"}, match: true}, + {url: "/api/v1/tr/100", params: []string{"tr", "100"}, match: true}, + {url: "/api/v1/e/10", params: []string{"tr", "200"}, match: false}, + }) + benchCase("/api/v1/:date/:regex", []testparams{ + {url: "/api/v1/2005-11-01/a", params: []string{"2005-11-01", "a"}, match: false}, + {url: "/api/v1/2005-1101/paach", params: []string{"2005-1101", "a"}, match: false}, + {url: "/api/v1/2005-11-01/peach", params: []string{"2005-11-01", "peach"}, match: true}, + }) }