client.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. func (c *Client) LookupIPv4(host string) ([]net.IP, error) {
  32. ips, err := c.LookupIP(host)
  33. if err != nil {
  34. return nil, err
  35. }
  36. var ipv4 []net.IP
  37. for _, ip := range ips {
  38. parsed := net.IPAddress(ip)
  39. if parsed.Family().IsIPv4() {
  40. ipv4 = append(ipv4, parsed.IP())
  41. }
  42. }
  43. return ipv4, nil
  44. }
  45. func (c *Client) LookupIPv6(host string) ([]net.IP, error) {
  46. ips, err := c.LookupIP(host)
  47. if err != nil {
  48. return nil, err
  49. }
  50. var ipv6 []net.IP
  51. for _, ip := range ips {
  52. parsed := net.IPAddress(ip)
  53. if parsed.Family().IsIPv6() {
  54. ipv6 = append(ipv6, parsed.IP())
  55. }
  56. }
  57. return ipv6, nil
  58. }
  59. func New() *Client {
  60. return &Client{
  61. resolver: net.Resolver{
  62. PreferGo: true,
  63. },
  64. }
  65. }