in transport/proxy.go [57:111]
func ProxyDialer(log *logp.Logger, config *ProxyConfig, forward Dialer) (Dialer, error) {
if config == nil || config.URL == "" {
return forward, nil
}
url, err := url.Parse(config.URL)
if err != nil {
return nil, err
}
if _, err := proxy.FromURL(url, nil); err != nil {
return nil, err
}
log.Infof("proxy host: '%s'", url.Host)
return DialerFunc(func(ctx context.Context, network, address string) (net.Conn, error) {
var err error
var addresses []string
host, port, err := net.SplitHostPort(address)
if err != nil {
return nil, err
}
if config.LocalResolve {
addresses, err = net.LookupHost(host)
if err != nil {
log.Warnf(`DNS lookup failure "%s": %+v`, host, err)
return nil, err
}
} else {
// Do not resolve the address locally. It will be resolved on the
// SOCKS server. The beat will have no control over the randomization
// of the IP used when multiple IPs are returned by DNS.
addresses = []string{host}
}
dialer, err := proxy.FromURL(url, forward)
if err != nil {
return nil, err
}
contextDialer, ok := dialer.(Dialer)
// This will never be executed because the proxy package always returns
// a ContextDialer but they didn't break the interface for backward compatibility.
// See golang/go#58376
if !ok {
contextDialer = DialerFunc(func(ctx context.Context, network, address string) (net.Conn, error) {
return dialer.Dial(network, address)
})
}
return DialWith(ctx, contextDialer, network, host, addresses, port)
}), nil
}