sing-box/route/rule/rule_item_domain_keyword.go

48 lines
1,004 B
Go
Raw Normal View History

2024-10-21 15:38:34 +00:00
package rule
2022-07-02 14:55:10 +00:00
import (
"strings"
"github.com/sagernet/sing-box/adapter"
)
var _ RuleItem = (*DomainKeywordItem)(nil)
type DomainKeywordItem struct {
keywords []string
}
func NewDomainKeywordItem(keywords []string) *DomainKeywordItem {
return &DomainKeywordItem{keywords}
}
func (r *DomainKeywordItem) Match(metadata *adapter.InboundContext) bool {
var domainHost string
if metadata.Domain != "" {
domainHost = metadata.Domain
} else {
domainHost = metadata.Destination.Fqdn
}
if domainHost == "" {
return false
}
2023-02-02 07:14:43 +00:00
domainHost = strings.ToLower(domainHost)
2022-07-02 14:55:10 +00:00
for _, keyword := range r.keywords {
if strings.Contains(domainHost, keyword) {
return true
}
}
return false
}
func (r *DomainKeywordItem) String() string {
kLen := len(r.keywords)
if kLen == 1 {
return "domain_keyword=" + r.keywords[0]
} else if kLen > 3 {
return "domain_keyword=[" + strings.Join(r.keywords[:3], " ") + "...]"
} else {
return "domain_keyword=[" + strings.Join(r.keywords, " ") + "]"
}
}