|
|
|
|
@ -297,9 +297,11 @@ func (d *Dialer) clock() tstime.Clock { |
|
|
|
|
var debugNoiseDial = envknob.RegisterBool("TS_DEBUG_NOISE_DIAL") |
|
|
|
|
|
|
|
|
|
// dialHost connects to the configured Dialer.Hostname and upgrades the
|
|
|
|
|
// connection into a controlbase.Conn. If addr is valid, then no DNS is used
|
|
|
|
|
// and the connection will be made to the provided address.
|
|
|
|
|
func (a *Dialer) dialHost(ctx context.Context, addr netip.Addr) (*ClientConn, error) { |
|
|
|
|
// connection into a controlbase.Conn.
|
|
|
|
|
//
|
|
|
|
|
// If optAddr is valid, then no DNS is used and the connection will be made to the
|
|
|
|
|
// provided address.
|
|
|
|
|
func (a *Dialer) dialHost(ctx context.Context, optAddr netip.Addr) (*ClientConn, error) { |
|
|
|
|
// Create one shared context used by both port 80 and port 443 dials.
|
|
|
|
|
// If port 80 is still in flight when 443 returns, this deferred cancel
|
|
|
|
|
// will stop the port 80 dial.
|
|
|
|
|
@ -330,11 +332,11 @@ func (a *Dialer) dialHost(ctx context.Context, addr netip.Addr) (*ClientConn, er |
|
|
|
|
ch := make(chan tryURLRes) // must be unbuffered
|
|
|
|
|
try := func(u *url.URL) { |
|
|
|
|
if debugNoiseDial() { |
|
|
|
|
a.logf("trying noise dial (%v, %v) ...", u, addr) |
|
|
|
|
a.logf("trying noise dial (%v, %v) ...", u, optAddr) |
|
|
|
|
} |
|
|
|
|
cbConn, err := a.dialURL(ctx, u, addr) |
|
|
|
|
cbConn, err := a.dialURL(ctx, u, optAddr) |
|
|
|
|
if debugNoiseDial() { |
|
|
|
|
a.logf("noise dial (%v, %v) = (%v, %v)", u, addr, cbConn, err) |
|
|
|
|
a.logf("noise dial (%v, %v) = (%v, %v)", u, optAddr, cbConn, err) |
|
|
|
|
} |
|
|
|
|
select { |
|
|
|
|
case ch <- tryURLRes{u, cbConn, err}: |
|
|
|
|
@ -388,12 +390,15 @@ func (a *Dialer) dialHost(ctx context.Context, addr netip.Addr) (*ClientConn, er |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// dialURL attempts to connect to the given URL.
|
|
|
|
|
func (a *Dialer) dialURL(ctx context.Context, u *url.URL, addr netip.Addr) (*ClientConn, error) { |
|
|
|
|
//
|
|
|
|
|
// If optAddr is valid, then no DNS is used and the connection will be made to the
|
|
|
|
|
// provided address.
|
|
|
|
|
func (a *Dialer) dialURL(ctx context.Context, u *url.URL, optAddr netip.Addr) (*ClientConn, error) { |
|
|
|
|
init, cont, err := controlbase.ClientDeferred(a.MachineKey, a.ControlKey, a.ProtocolVersion) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
netConn, err := a.tryURLUpgrade(ctx, u, addr, init) |
|
|
|
|
netConn, err := a.tryURLUpgrade(ctx, u, optAddr, init) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
@ -439,19 +444,20 @@ var macOSScreenTime = health.Register(&health.Warnable{ |
|
|
|
|
ImpactsConnectivity: true, |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
// tryURLUpgrade connects to u, and tries to upgrade it to a net.Conn. If addr
|
|
|
|
|
// is valid, then no DNS is used and the connection will be made to the
|
|
|
|
|
// provided address.
|
|
|
|
|
// tryURLUpgrade connects to u, and tries to upgrade it to a net.Conn.
|
|
|
|
|
//
|
|
|
|
|
// If optAddr is valid, then no DNS is used and the connection will be made to
|
|
|
|
|
// the provided address.
|
|
|
|
|
//
|
|
|
|
|
// Only the provided ctx is used, not a.ctx.
|
|
|
|
|
func (a *Dialer) tryURLUpgrade(ctx context.Context, u *url.URL, addr netip.Addr, init []byte) (_ net.Conn, retErr error) { |
|
|
|
|
func (a *Dialer) tryURLUpgrade(ctx context.Context, u *url.URL, optAddr netip.Addr, init []byte) (_ net.Conn, retErr error) { |
|
|
|
|
var dns *dnscache.Resolver |
|
|
|
|
|
|
|
|
|
// If we were provided an address to dial, then create a resolver that just
|
|
|
|
|
// returns that value; otherwise, fall back to DNS.
|
|
|
|
|
if addr.IsValid() { |
|
|
|
|
if optAddr.IsValid() { |
|
|
|
|
dns = &dnscache.Resolver{ |
|
|
|
|
SingleHostStaticResult: []netip.Addr{addr}, |
|
|
|
|
SingleHostStaticResult: []netip.Addr{optAddr}, |
|
|
|
|
SingleHost: u.Hostname(), |
|
|
|
|
Logf: a.Logf, // not a.logf method; we want to propagate nil-ness
|
|
|
|
|
} |
|
|
|
|
|