func ProxyDialer()

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
}