github.com/Cloud-Foundations/Dominator@v0.3.4/lib/net/proxy/common.go (about)

     1  package proxy
     2  
     3  import (
     4  	"errors"
     5  	"net"
     6  	"net/url"
     7  )
     8  
     9  var (
    10  	errorUnsupportedProxy = errors.New("unsupported proxy")
    11  )
    12  
    13  func newDialer(proxy string, dialer *net.Dialer) (Dialer, error) {
    14  	if dialer == nil {
    15  		dialer = new(net.Dialer)
    16  	}
    17  	if proxy == "" {
    18  		return dialer, nil
    19  	}
    20  	if parsedProxy, err := url.Parse(proxy); err != nil {
    21  		return nil, err
    22  	} else {
    23  		switch parsedProxy.Scheme {
    24  		case "socks": // Assume SOCKS 5
    25  			return &socksDialer{
    26  				dialer:       dialer,
    27  				proxyAddress: parsedProxy.Host,
    28  				proxyDNS:     true,
    29  				udpSupported: true,
    30  			}, nil
    31  		case "socks4":
    32  			return &socksDialer{
    33  				dialer:       dialer,
    34  				proxyAddress: parsedProxy.Host,
    35  			}, nil
    36  		case "socks4a":
    37  			return &socksDialer{
    38  				dialer:       dialer,
    39  				proxyAddress: parsedProxy.Host,
    40  				proxyDNS:     true,
    41  			}, nil
    42  		case "socks5":
    43  			return &socksDialer{
    44  				dialer:       dialer,
    45  				proxyAddress: parsedProxy.Host,
    46  				proxyDNS:     true,
    47  				udpSupported: true,
    48  			}, nil
    49  		default:
    50  			return nil, errorUnsupportedProxy
    51  		}
    52  	}
    53  }