mirror of
				https://github.com/optim-enterprises-bv/Xray-core.git
				synced 2025-10-31 02:27:53 +00:00 
			
		
		
		
	 7086d286be
			
		
	
	7086d286be
	
	
	
		
			
			* Add feature migration notice * Remove legacy code of transport processing * Clear legacy proto field * Fix missing * Unify protocolname * Test remove * Supressor * Weird code * Remove errorgen related comments
		
			
				
	
	
		
			50 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package dns
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 
 | |
| 	"github.com/xtls/xray-core/common/errors"
 | |
| 	"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 len(ctx.resolvedIPs) > 0 {
 | |
| 		return ctx.resolvedIPs
 | |
| 	}
 | |
| 
 | |
| 	if domain := ctx.GetTargetDomain(); len(domain) != 0 {
 | |
| 		ips, err := ctx.dnsClient.LookupIP(domain, dns.IPOption{
 | |
| 			IPv4Enable: true,
 | |
| 			IPv6Enable: true,
 | |
| 			FakeEnable: false,
 | |
| 		})
 | |
| 		if err == nil {
 | |
| 			ctx.resolvedIPs = ips
 | |
| 			return ips
 | |
| 		}
 | |
| 		errors.LogInfoInner(context.Background(), err, "resolve ip for ", domain)
 | |
| 	}
 | |
| 
 | |
| 	if ips := ctx.Context.GetTargetIPs(); len(ips) != 0 {
 | |
| 		return ips
 | |
| 	}
 | |
| 
 | |
| 	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}
 | |
| }
 |