| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- //go:build !confonly
- // +build !confonly
- package dns
- import (
- fakedns "github.com/v2fly/v2ray-core/v5/app/dns/fakedns"
- "github.com/v2fly/v2ray-core/v5/common/net"
- "github.com/v2fly/v2ray-core/v5/features/dns"
- )
- // FakeDNSClient is an implementation of dns.Client with FakeDNS enabled.
- type FakeDNSClient struct {
- *DNS
- }
- // LookupIP implements dns.Client.
- func (s *FakeDNSClient) LookupIP(domain string) ([]net.IP, error) {
- return s.lookupIPInternal(domain, dns.IPOption{IPv4Enable: true, IPv6Enable: true, FakeEnable: true})
- }
- // LookupIPv4 implements dns.IPv4Lookup.
- func (s *FakeDNSClient) LookupIPv4(domain string) ([]net.IP, error) {
- return s.lookupIPInternal(domain, dns.IPOption{IPv4Enable: true, FakeEnable: true})
- }
- // LookupIPv6 implements dns.IPv6Lookup.
- func (s *FakeDNSClient) LookupIPv6(domain string) ([]net.IP, error) {
- return s.lookupIPInternal(domain, dns.IPOption{IPv6Enable: true, FakeEnable: true})
- }
- // FakeDNSEngine is an implementation of dns.FakeDNSEngine based on a fully functional DNS.
- type FakeDNSEngine struct {
- dns *DNS
- fakeHolders *fakedns.HolderMulti
- fakeDefault *fakedns.HolderMulti
- }
- // Type implements common.HasType.
- func (*FakeDNSEngine) Type() interface{} {
- return dns.FakeDNSEngineType()
- }
- // Start implements common.Runnable.
- func (f *FakeDNSEngine) Start() error {
- return f.fakeHolders.Start()
- }
- // Close implements common.Closable.
- func (f *FakeDNSEngine) Close() error {
- return f.fakeHolders.Close()
- }
- // GetFakeIPForDomain implements dns.FakeDNSEngine.
- func (f *FakeDNSEngine) GetFakeIPForDomain(domain string) []net.Address {
- return f.GetFakeIPForDomain3(domain, true, true)
- }
- // GetDomainFromFakeDNS implements dns.FakeDNSEngine.
- func (f *FakeDNSEngine) GetDomainFromFakeDNS(ip net.Address) string {
- return f.fakeHolders.GetDomainFromFakeDNS(ip)
- }
- // IsIPInIPPool implements dns.FakeDNSEngineRev0.
- func (f *FakeDNSEngine) IsIPInIPPool(ip net.Address) bool {
- return f.fakeHolders.IsIPInIPPool(ip)
- }
- // GetFakeIPForDomain3 implements dns.FakeDNSEngineRev0.
- func (f *FakeDNSEngine) GetFakeIPForDomain3(domain string, IPv4 bool, IPv6 bool) []net.Address { // nolint: gocritic
- option := dns.IPOption{IPv4Enable: IPv4, IPv6Enable: IPv6, FakeEnable: true}
- for _, client := range f.dns.sortClients(domain, option) {
- fakeServer, ok := client.fakeDNS.(*FakeDNSServer)
- if !ok {
- continue
- }
- fakeEngine, ok := fakeServer.fakeDNSEngine.(dns.FakeDNSEngineRev0)
- if !ok {
- return filterIP(fakeServer.fakeDNSEngine.GetFakeIPForDomain(domain), option)
- }
- return fakeEngine.GetFakeIPForDomain3(domain, IPv4, IPv6)
- }
- if f.fakeDefault != nil {
- return f.fakeDefault.GetFakeIPForDomain3(domain, IPv4, IPv6)
- }
- return nil
- }
|