diff --git a/edgediscovery/dial.go b/edgediscovery/dial.go index 675e5dc5..b8af077c 100644 --- a/edgediscovery/dial.go +++ b/edgediscovery/dial.go @@ -7,6 +7,7 @@ import ( "time" "github.com/pkg/errors" + "golang.org/x/net/proxy" ) // DialEdgeWithH2Mux makes a TLS connection to a Cloudflare edge node @@ -17,15 +18,26 @@ func DialEdge( edgeTCPAddr *net.TCPAddr, localIP net.IP, ) (net.Conn, error) { - // Inherit from parent context so we can cancel (Ctrl-C) while dialing - dialCtx, dialCancel := context.WithTimeout(ctx, timeout) - defer dialCancel() - dialer := net.Dialer{} if localIP != nil { dialer.LocalAddr = &net.TCPAddr{IP: localIP, Port: 0} } - edgeConn, err := dialer.DialContext(dialCtx, "tcp", edgeTCPAddr.String()) + proxyDialer := proxy.FromEnvironmentUsing(&dialer) + + var edgeConn net.Conn + var err error + + ctxDialer, ok := proxyDialer.(interface { + DialContext(context.Context, string, string) (net.Conn, error) + }) + if ok { + // Inherit from parent context so we can cancel (Ctrl-C) while dialing + dialCtx, dialCancel := context.WithTimeout(ctx, timeout) + defer dialCancel() + edgeConn, err = ctxDialer.DialContext(dialCtx, "tcp", edgeTCPAddr.String()) + } else { + edgeConn, err = proxyDialer.Dial("tcp", edgeTCPAddr.String()) + } if err != nil { return nil, newDialError(err, "DialContext error") }