mirror of https://github.com/XTLS/Xray-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.2 KiB
44 lines
1.2 KiB
package dns |
|
|
|
//go:generate go run github.com/xtls/xray-core/common/errors/errorgen |
|
|
|
import ( |
|
"github.com/xtls/xray-core/common/net" |
|
"github.com/xtls/xray-core/features/dns" |
|
"github.com/xtls/xray-core/features/routing" |
|
) |
|
|
|
// ResolvableContext is an implementation of routing.Context, with domain resolving capability. |
|
type ResolvableContext struct { |
|
routing.Context |
|
dnsClient dns.Client |
|
resolvedIPs []net.IP |
|
} |
|
|
|
// GetTargetIPs overrides original routing.Context's implementation. |
|
func (ctx *ResolvableContext) GetTargetIPs() []net.IP { |
|
if ips := ctx.Context.GetTargetIPs(); len(ips) != 0 { |
|
return ips |
|
} |
|
|
|
if len(ctx.resolvedIPs) > 0 { |
|
return ctx.resolvedIPs |
|
} |
|
|
|
if domain := ctx.GetTargetDomain(); len(domain) != 0 { |
|
ips, err := ctx.dnsClient.LookupIP(domain) |
|
if err == nil { |
|
ctx.resolvedIPs = ips |
|
return ips |
|
} |
|
newError("resolve ip for ", domain).Base(err).WriteToLog() |
|
} |
|
|
|
return nil |
|
} |
|
|
|
// ContextWithDNSClient creates a new routing context with domain resolving capability. |
|
// Resolved domain IPs can be retrieved by GetTargetIPs(). |
|
func ContextWithDNSClient(ctx routing.Context, client dns.Client) routing.Context { |
|
return &ResolvableContext{Context: ctx, dnsClient: client} |
|
}
|
|
|