fix: support regexp in path/pathprefix in matcher v2
This commit is contained in:
parent
b636b21167
commit
fc897f6756
2 changed files with 44 additions and 8 deletions
|
@ -25,15 +25,21 @@ var httpFuncsV2 = map[string]func(*matchersTree, ...string) error{
|
||||||
}
|
}
|
||||||
|
|
||||||
func pathV2(tree *matchersTree, paths ...string) error {
|
func pathV2(tree *matchersTree, paths ...string) error {
|
||||||
|
var routes []*mux.Route
|
||||||
|
|
||||||
for _, path := range paths {
|
for _, path := range paths {
|
||||||
if !strings.HasPrefix(path, "/") {
|
route := mux.NewRouter().NewRoute()
|
||||||
return fmt.Errorf("path %q does not start with a '/'", path)
|
|
||||||
|
if err := route.Path(path).GetError(); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
routes = append(routes, route)
|
||||||
}
|
}
|
||||||
|
|
||||||
tree.matcher = func(req *http.Request) bool {
|
tree.matcher = func(req *http.Request) bool {
|
||||||
for _, path := range paths {
|
for _, route := range routes {
|
||||||
if req.URL.Path == path {
|
if route.Match(req, &mux.RouteMatch{}) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,15 +51,21 @@ func pathV2(tree *matchersTree, paths ...string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func pathPrefixV2(tree *matchersTree, paths ...string) error {
|
func pathPrefixV2(tree *matchersTree, paths ...string) error {
|
||||||
|
var routes []*mux.Route
|
||||||
|
|
||||||
for _, path := range paths {
|
for _, path := range paths {
|
||||||
if !strings.HasPrefix(path, "/") {
|
route := mux.NewRouter().NewRoute()
|
||||||
return fmt.Errorf("path %q does not start with a '/'", path)
|
|
||||||
|
if err := route.PathPrefix(path).GetError(); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
routes = append(routes, route)
|
||||||
}
|
}
|
||||||
|
|
||||||
tree.matcher = func(req *http.Request) bool {
|
tree.matcher = func(req *http.Request) bool {
|
||||||
for _, path := range paths {
|
for _, route := range routes {
|
||||||
if strings.HasPrefix(req.URL.Path, path) {
|
if route.Match(req, &mux.RouteMatch{}) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -454,6 +454,18 @@ func TestPathV2Matcher(t *testing.T) {
|
||||||
"https://example.com/css/main.css": http.StatusNotFound,
|
"https://example.com/css/main.css": http.StatusNotFound,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
desc: "valid Path matcher with regexp",
|
||||||
|
rule: "Path(`/css{path:(/.*)?}`)",
|
||||||
|
expected: map[string]int{
|
||||||
|
"https://example.com": http.StatusNotFound,
|
||||||
|
"https://example.com/css/main.css": http.StatusOK,
|
||||||
|
"https://example.org/css/main.css": http.StatusOK,
|
||||||
|
"https://example.com/css/components/component.css": http.StatusOK,
|
||||||
|
"https://example.com/css.css": http.StatusNotFound,
|
||||||
|
"https://example.com/js/main.js": http.StatusNotFound,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
|
@ -535,6 +547,18 @@ func TestPathPrefixV2Matcher(t *testing.T) {
|
||||||
"https://example.com/css/main.css": http.StatusOK,
|
"https://example.com/css/main.css": http.StatusOK,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
desc: "valid PathPrefix matcher with regexp",
|
||||||
|
rule: "PathPrefix(`/css-{name:[0-9]?}`)",
|
||||||
|
expected: map[string]int{
|
||||||
|
"https://example.com": http.StatusNotFound,
|
||||||
|
"https://example.com/css-1/main.css": http.StatusOK,
|
||||||
|
"https://example.org/css-222/main.css": http.StatusOK,
|
||||||
|
"https://example.com/css-333333/components/component.css": http.StatusOK,
|
||||||
|
"https://example.com/css.css": http.StatusNotFound,
|
||||||
|
"https://example.com/js/main.js": http.StatusNotFound,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
|
|
Loading…
Reference in a new issue