policy.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package dns
  2. import (
  3. "github.com/metacubex/mihomo/component/trie"
  4. C "github.com/metacubex/mihomo/constant"
  5. "github.com/metacubex/mihomo/constant/provider"
  6. )
  7. type dnsPolicy interface {
  8. Match(domain string) []dnsClient
  9. }
  10. type domainTriePolicy struct {
  11. *trie.DomainTrie[[]dnsClient]
  12. }
  13. func (p domainTriePolicy) Match(domain string) []dnsClient {
  14. record := p.DomainTrie.Search(domain)
  15. if record != nil {
  16. return record.Data()
  17. }
  18. return nil
  19. }
  20. type geositePolicy struct {
  21. matcher fallbackDomainFilter
  22. inverse bool
  23. dnsClients []dnsClient
  24. }
  25. func (p geositePolicy) Match(domain string) []dnsClient {
  26. matched := p.matcher.Match(domain)
  27. if matched != p.inverse {
  28. return p.dnsClients
  29. }
  30. return nil
  31. }
  32. type domainSetPolicy struct {
  33. tunnel provider.Tunnel
  34. name string
  35. dnsClients []dnsClient
  36. }
  37. func (p domainSetPolicy) Match(domain string) []dnsClient {
  38. if ruleProvider, ok := p.tunnel.RuleProviders()[p.name]; ok {
  39. metadata := &C.Metadata{Host: domain}
  40. if ok := ruleProvider.Match(metadata); ok {
  41. return p.dnsClients
  42. }
  43. }
  44. return nil
  45. }