mirror of
https://github.com/TeaOSLab/EdgeCommon.git
synced 2025-11-04 05:00:24 +08:00
118 lines
2.4 KiB
Go
118 lines
2.4 KiB
Go
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
|
|
|
package serverconfigs
|
|
|
|
import (
|
|
"net/http"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
type UserAgentAction = string
|
|
|
|
const (
|
|
UserAgentActionAllow UserAgentAction = "allow"
|
|
UserAgentActionDeny UserAgentAction = "deny"
|
|
)
|
|
|
|
type UserAgentKeyword struct {
|
|
keyword string
|
|
reg *regexp.Regexp
|
|
}
|
|
|
|
func NewUserAgentKeyword(keyword string) *UserAgentKeyword {
|
|
var reg *regexp.Regexp
|
|
if strings.Contains(keyword, "*") {
|
|
var pieces = strings.Split(keyword, "*")
|
|
for index, piece := range pieces {
|
|
pieces[index] = regexp.QuoteMeta(piece)
|
|
}
|
|
var newKeyword = strings.Join(pieces, ".*")
|
|
r, _ := regexp.Compile("(?i)" + newKeyword)
|
|
reg = r
|
|
} else {
|
|
r, _ := regexp.Compile("(?i)" + regexp.QuoteMeta(keyword))
|
|
reg = r
|
|
}
|
|
|
|
return &UserAgentKeyword{
|
|
keyword: keyword,
|
|
reg: reg,
|
|
}
|
|
}
|
|
|
|
type UserAgentFilter struct {
|
|
Keywords []string `yaml:"keywords" json:"keywords"` // 关键词
|
|
Action UserAgentAction `yaml:"action" json:"action"` // 动作
|
|
|
|
keywords []*UserAgentKeyword
|
|
}
|
|
|
|
func (this *UserAgentFilter) Init() error {
|
|
this.keywords = []*UserAgentKeyword{}
|
|
for _, keyword := range this.Keywords {
|
|
this.keywords = append(this.keywords, NewUserAgentKeyword(keyword))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (this *UserAgentFilter) Match(userAgent string) bool {
|
|
if len(this.Keywords) == 0 {
|
|
return false
|
|
}
|
|
|
|
for _, keyword := range this.keywords {
|
|
if len(keyword.keyword) == 0 {
|
|
// 空白
|
|
if len(userAgent) == 0 {
|
|
return true
|
|
}
|
|
} else if keyword.reg != nil {
|
|
if keyword.reg.MatchString(userAgent) {
|
|
return true
|
|
}
|
|
} else if strings.Contains(userAgent, keyword.keyword) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
type UserAgentConfig struct {
|
|
IsPrior bool `yaml:"isPrior" json:"isPrior"`
|
|
IsOn bool `yaml:"isOn" json:"isOn"`
|
|
Filters []*UserAgentFilter `yaml:"filters" json:"filters"`
|
|
}
|
|
|
|
func NewUserAgentConfig() *UserAgentConfig {
|
|
return &UserAgentConfig{}
|
|
}
|
|
|
|
func (this *UserAgentConfig) Init() error {
|
|
for _, filter := range this.Filters {
|
|
err := filter.Init()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (this *UserAgentConfig) AllowRequest(req *http.Request) bool {
|
|
if len(this.Filters) == 0 {
|
|
return true
|
|
}
|
|
|
|
var userAgent = req.UserAgent()
|
|
|
|
for _, filter := range this.Filters {
|
|
if filter.Match(userAgent) {
|
|
return filter.Action == UserAgentActionAllow
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|