diff --git a/example/matcher/main.go b/example/matcher/main.go index 477df7c..f6dbe3e 100644 --- a/example/matcher/main.go +++ b/example/matcher/main.go @@ -29,6 +29,12 @@ func main() { context.Next() }) + //添加带路径匹配器的自定义中间件 + chain.UseMatcher(matcher.PathPrefix("/hello"), func(context *knife.Context) { + log.Println("pathPrefix matcher") + context.Next() + }) + //启动服务 _ = http.ListenAndServe(":8080", chain) } diff --git a/knife/matcher/path.go b/knife/matcher/path.go new file mode 100644 index 0000000..9f911d9 --- /dev/null +++ b/knife/matcher/path.go @@ -0,0 +1,41 @@ +// 关于路径的匹配器 + +package matcher + +import ( + "fmt" + "knife" + "log" + "regexp" + "strings" +) + +// PathPrefix 路径前缀匹配 +func PathPrefix(prefix string) knife.MiddlewareMatcher { + return func(response knife.HttpResponseWriter, request knife.HttpRequest) bool { + return strings.HasPrefix(request.URL.Path, prefix) + } +} + +// PathMatch 路径正则匹配 +func PathMatch(pattern string) knife.MiddlewareMatcher { + return func(response knife.HttpResponseWriter, request knife.HttpRequest) bool { + matched, err := isPathMatched(request.URL.Path, pattern) + if err != nil { + log.Println("path matched failed") + return false + } + return matched + } +} + +// isPathMatched 路径匹配方式 +// path 路径 +// pattern 正则表达式 +func isPathMatched(path string, pattern string) (bool, error) { + re, err := regexp.Compile(pattern) + if err != nil { + return false, fmt.Errorf("invalid regular expression: %w", err) + } + return re.MatchString(path), nil +}