1 Star 2 Fork 3

kristas/booting-go

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
web_filter.go 2.55 KB
一键复制 编辑 原始数据 按行查看 历史
kristas 提交于 2021-09-03 16:59 . feat: refactor controller adapter
package web_filter
import (
"gitee.com/kristas/booting-go/framework/common/util/lang"
"gitee.com/kristas/booting-go/framework/web"
"net/http"
"regexp"
"sort"
)
var (
filters []web.Filter
)
func AddFilters(filter web.Filter) {
filters = append(filters, filter)
}
type FilterChain struct {
filter web.Filter
next web.FilterChain
service web.Service
}
func (f *FilterChain) GetFilter() web.Filter {
return f.filter
}
func (f *FilterChain) SetNext(chain web.FilterChain) {
f.next = chain
}
func (f *FilterChain) GetNext() web.FilterChain {
return f.next
}
func (f *FilterChain) SetService(service web.Service) {
f.service = service
}
func (f *FilterChain) DoService(w http.ResponseWriter, r *http.Request) error {
return f.service(w, r)
}
func (f *FilterChain) DoFilter(w http.ResponseWriter, r *http.Request) error {
next := findNextFilter(r.RequestURI, f.next)
if next == nil {
return f.DoService(w, r)
}
return next.GetFilter().DoFilter(w, r, next)
}
func newFilterChain(filter web.Filter, service web.Service) web.FilterChain {
return &FilterChain{
filter: filter,
service: service,
}
}
func NewFilterChainWithMapper(mapper web.ParamMapper, service web.Service) error {
w, _ := mapper.GetResponseWriter()
r, _ := mapper.GetRequest()
return NewFilterChain(w, r, service)
}
func NewFilterChain(w http.ResponseWriter, r *http.Request, service web.Service) error {
var headFilter, currentFilter web.FilterChain
if len(filters) == 0 {
AddFilters(new(defaultFilter))
}
for i := range filters {
filter := filters[i]
if headFilter == nil {
headFilter = newFilterChain(filter, service)
currentFilter = headFilter
} else {
next := newFilterChain(filter, service)
currentFilter.SetNext(next)
currentFilter = next
}
}
entryFilter := findNextFilter(r.RequestURI, headFilter)
if entryFilter == nil {
return nil
}
return entryFilter.GetFilter().DoFilter(w, r, entryFilter)
}
func findNextFilter(uri string, curr web.FilterChain) web.FilterChain {
var nextFilter = curr
for nextFilter != nil {
patterns := nextFilter.GetFilter().UrlPatterns()
for _, pattern := range patterns {
pattern = lang.NewString("^").Concat(pattern).String()
matched, _ := regexp.MatchString(pattern, uri)
if matched {
return nextFilter
}
}
nextFilter = nextFilter.GetNext()
}
return nil
}
func sortFilters() {
sort.Slice(filters, func(i, j int) bool {
return filters[i].Order() < filters[j].Order()
})
}
func InitFilters(trace func(order int, filter web.Filter)) {
sortFilters()
for i := range filters {
trace(i+1, filters[i])
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/kristas/booting-go.git
git@gitee.com:kristas/booting-go.git
kristas
booting-go
booting-go
v1.3.8

搜索帮助