context.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package dns
  2. //go:generate errorgen
  3. import (
  4. "v2ray.com/core/common/net"
  5. "v2ray.com/core/features/dns"
  6. "v2ray.com/core/features/routing"
  7. )
  8. // ResolvableContext is an implementation of routing.Context, with domain resolving capability.
  9. type ResolvableContext struct {
  10. routing.Context
  11. dnsClient dns.Client
  12. resolvedIPs []net.IP
  13. }
  14. // GetTargetIPs overrides original routing.Context's implementation.
  15. func (ctx *ResolvableContext) GetTargetIPs() []net.IP {
  16. if ips := ctx.Context.GetTargetIPs(); len(ips) != 0 {
  17. return ips
  18. }
  19. if len(ctx.resolvedIPs) > 0 {
  20. return ctx.resolvedIPs
  21. }
  22. if domain := ctx.GetTargetDomain(); len(domain) != 0 {
  23. ips, err := ctx.dnsClient.LookupIP(domain)
  24. if err == nil {
  25. ctx.resolvedIPs = ips
  26. return ips
  27. }
  28. newError("resolve ip for ", domain).Base(err).WriteToLog()
  29. }
  30. return nil
  31. }
  32. // ContextWithDNSClient creates a new routing context with domain resolving capability.
  33. // Resolved domain IPs can be retrieved by GetTargetIPs().
  34. func ContextWithDNSClient(ctx routing.Context, client dns.Client) routing.Context {
  35. return &ResolvableContext{Context: ctx, dnsClient: client}
  36. }