client.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package localdns
  2. import (
  3. "context"
  4. "v2ray.com/core/common/net"
  5. "v2ray.com/core/features/dns"
  6. )
  7. // Client is an implementation of dns.Client, which queries localhost for DNS.
  8. type Client struct {
  9. resolver net.Resolver
  10. }
  11. // Type implements common.HasType.
  12. func (*Client) Type() interface{} {
  13. return dns.ClientType()
  14. }
  15. // Start implements common.Runnable.
  16. func (*Client) Start() error { return nil }
  17. // Close implements common.Closable.
  18. func (*Client) Close() error { return nil }
  19. // LookupIP implements Client.
  20. func (c *Client) LookupIP(host string) ([]net.IP, error) {
  21. ipAddr, err := c.resolver.LookupIPAddr(context.Background(), host)
  22. if err != nil {
  23. return nil, err
  24. }
  25. ips := make([]net.IP, 0, len(ipAddr))
  26. for _, addr := range ipAddr {
  27. ips = append(ips, addr.IP)
  28. }
  29. return ips, nil
  30. }
  31. // LookupIPv4 implements IPv4Lookup.
  32. func (c *Client) LookupIPv4(host string) ([]net.IP, error) {
  33. ips, err := c.LookupIP(host)
  34. if err != nil {
  35. return nil, err
  36. }
  37. var ipv4 []net.IP
  38. for _, ip := range ips {
  39. parsed := net.IPAddress(ip)
  40. if parsed.Family().IsIPv4() {
  41. ipv4 = append(ipv4, parsed.IP())
  42. }
  43. }
  44. return ipv4, nil
  45. }
  46. // LookupIPv6 implements IPv6Lookup.
  47. func (c *Client) LookupIPv6(host string) ([]net.IP, error) {
  48. ips, err := c.LookupIP(host)
  49. if err != nil {
  50. return nil, err
  51. }
  52. var ipv6 []net.IP
  53. for _, ip := range ips {
  54. parsed := net.IPAddress(ip)
  55. if parsed.Family().IsIPv6() {
  56. ipv6 = append(ipv6, parsed.IP())
  57. }
  58. }
  59. return ipv6, nil
  60. }
  61. // New create a new dns.Client that queries localhost for DNS.
  62. func New() *Client {
  63. return &Client{
  64. resolver: net.Resolver{
  65. PreferGo: true,
  66. },
  67. }
  68. }