rule_domain_keyword.go 963 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package route
  2. import (
  3. "strings"
  4. "github.com/sagernet/sing-box/adapter"
  5. )
  6. var _ RuleItem = (*DomainKeywordItem)(nil)
  7. type DomainKeywordItem struct {
  8. keywords []string
  9. }
  10. func NewDomainKeywordItem(keywords []string) *DomainKeywordItem {
  11. return &DomainKeywordItem{keywords}
  12. }
  13. func (r *DomainKeywordItem) Match(metadata *adapter.InboundContext) bool {
  14. var domainHost string
  15. if metadata.Domain != "" {
  16. domainHost = metadata.Domain
  17. } else {
  18. domainHost = metadata.Destination.Fqdn
  19. }
  20. if domainHost == "" {
  21. return false
  22. }
  23. for _, keyword := range r.keywords {
  24. if strings.Contains(domainHost, keyword) {
  25. return true
  26. }
  27. }
  28. return false
  29. }
  30. func (r *DomainKeywordItem) String() string {
  31. kLen := len(r.keywords)
  32. if kLen == 1 {
  33. return "domain_keyword=" + r.keywords[0]
  34. } else if kLen > 3 {
  35. return "domain_keyword=[" + strings.Join(r.keywords[:3], " ") + "...]"
  36. } else {
  37. return "domain_keyword=[" + strings.Join(r.keywords, " ") + "]"
  38. }
  39. }