diff --git a/lib/dialer/internal.go b/lib/dialer/internal.go index ca251a0d8..252ad921e 100644 --- a/lib/dialer/internal.go +++ b/lib/dialer/internal.go @@ -21,8 +21,8 @@ import ( var ( l = logger.DefaultLogger.NewFacility("dialer", "Dialing connections") - proxyDialer = getDialer(proxy.Direct) - usingProxy = proxyDialer != proxy.Direct + proxyDialer proxy.Dialer + usingProxy bool noFallback = os.Getenv("ALL_PROXY_NO_FALLBACK") != "" ) @@ -30,6 +30,11 @@ type dialFunc func(network, addr string) (net.Conn, error) func init() { l.SetDebug("dialer", strings.Contains(os.Getenv("STTRACE"), "dialer") || os.Getenv("STTRACE") == "all") + + proxy.RegisterDialerType("socks", socksDialerFunction) + proxyDialer = getDialer(proxy.Direct) + usingProxy = proxyDialer != proxy.Direct + if usingProxy { http.DefaultTransport = &http.Transport{ Dial: Dial, @@ -78,6 +83,20 @@ func dialWithFallback(proxyDialFunc dialFunc, fallbackDialFunc dialFunc, network return conn, err } +// This is a rip off of proxy.FromURL for "socks" URL scheme +func socksDialerFunction(u *url.URL, forward proxy.Dialer) (proxy.Dialer, error) { + var auth *proxy.Auth + if u.User != nil { + auth = new(proxy.Auth) + auth.User = u.User.Username() + if p, ok := u.User.Password(); ok { + auth.Password = p + } + } + + return proxy.SOCKS5("tcp", u.Host, auth, forward) +} + // This is a rip off of proxy.FromEnvironment with a custom forward dialer func getDialer(forward proxy.Dialer) proxy.Dialer { allProxy := os.Getenv("all_proxy")