Check record type in xTransport
Prepare for IPv6-only support by the way Fixes #189
This commit is contained in:
parent
5de18b5274
commit
38fd879b56
|
@ -36,7 +36,7 @@ func main() {
|
||||||
dlog.Debug(err)
|
dlog.Debug(err)
|
||||||
}
|
}
|
||||||
app.proxy = NewProxy()
|
app.proxy = NewProxy()
|
||||||
app.proxy.xTransport = NewXTransport(30 * time.Second)
|
app.proxy.xTransport = NewXTransport(30*time.Second, true, false)
|
||||||
|
|
||||||
if err := ConfigLoad(&app.proxy, svcFlag); err != nil {
|
if err := ConfigLoad(&app.proxy, svcFlag); err != nil {
|
||||||
dlog.Fatal(err)
|
dlog.Fatal(err)
|
||||||
|
|
|
@ -32,16 +32,20 @@ type XTransport struct {
|
||||||
cachedIPs CachedIPs
|
cachedIPs CachedIPs
|
||||||
fallbackResolver string
|
fallbackResolver string
|
||||||
ignoreSystemDNS bool
|
ignoreSystemDNS bool
|
||||||
|
useIPv4 bool
|
||||||
|
useIPv6 bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var IdleConnTimeout = 5 * time.Second
|
var IdleConnTimeout = 5 * time.Second
|
||||||
|
|
||||||
func NewXTransport(timeout time.Duration) *XTransport {
|
func NewXTransport(timeout time.Duration, useIPv4 bool, useIPv6 bool) *XTransport {
|
||||||
xTransport := XTransport{
|
xTransport := XTransport{
|
||||||
cachedIPs: CachedIPs{cache: make(map[string]string)},
|
cachedIPs: CachedIPs{cache: make(map[string]string)},
|
||||||
timeout: timeout,
|
timeout: timeout,
|
||||||
fallbackResolver: DefaultFallbackResolver,
|
fallbackResolver: DefaultFallbackResolver,
|
||||||
ignoreSystemDNS: false,
|
ignoreSystemDNS: false,
|
||||||
|
useIPv4: useIPv4,
|
||||||
|
useIPv6: useIPv6,
|
||||||
}
|
}
|
||||||
xTransport.rebuildTransport()
|
xTransport.rebuildTransport()
|
||||||
return &xTransport
|
return &xTransport
|
||||||
|
@ -129,6 +133,9 @@ func (xTransport *XTransport) Fetch(method string, url *url.URL, accept string,
|
||||||
dlog.Debugf("IP for [%s] was cached to [%s], but connection failed: [%s]", host, cachedIP, err)
|
dlog.Debugf("IP for [%s] was cached to [%s], but connection failed: [%s]", host, cachedIP, err)
|
||||||
return nil, 0, err
|
return nil, 0, err
|
||||||
}
|
}
|
||||||
|
if !xTransport.useIPv4 {
|
||||||
|
return nil, 0, fmt.Errorf("IPv4 connectivity would be required to use [%s]", host)
|
||||||
|
}
|
||||||
dnsClient := new(dns.Client)
|
dnsClient := new(dns.Client)
|
||||||
msg := new(dns.Msg)
|
msg := new(dns.Msg)
|
||||||
msg.SetQuestion(dns.Fqdn(host), dns.TypeA)
|
msg.SetQuestion(dns.Fqdn(host), dns.TypeA)
|
||||||
|
@ -142,12 +149,19 @@ func (xTransport *XTransport) Fetch(method string, url *url.URL, accept string,
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, 0, err
|
return nil, 0, err
|
||||||
}
|
}
|
||||||
if len(in.Answer) <= 0 {
|
var foundIP *string
|
||||||
|
for _, answer := range in.Answer {
|
||||||
|
if answer.Header().Rrtype == dns.TypeA {
|
||||||
|
foundIPx := in.Answer[0].(*dns.A).A.String()
|
||||||
|
foundIP = &foundIPx
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if foundIP == nil {
|
||||||
return nil, 0, fmt.Errorf("No IP found for [%s]", host)
|
return nil, 0, fmt.Errorf("No IP found for [%s]", host)
|
||||||
}
|
}
|
||||||
foundIP := in.Answer[0].(*dns.A).A.String()
|
|
||||||
xTransport.cachedIPs.Lock()
|
xTransport.cachedIPs.Lock()
|
||||||
xTransport.cachedIPs.cache[host] = foundIP
|
xTransport.cachedIPs.cache[host] = *foundIP
|
||||||
xTransport.cachedIPs.Unlock()
|
xTransport.cachedIPs.Unlock()
|
||||||
dlog.Debugf("[%s] IP address [%s] added to the cache", host, foundIP)
|
dlog.Debugf("[%s] IP address [%s] added to the cache", host, foundIP)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue