control/controlhttp: use ws:// when HTTPSPort is NoPort in JS dialer

When HTTPS is explicitly disabled (HTTPSPort == NoPort), the JS WebSocket
dialer should use ws:// instead of wss://. This matches the behavior of
the non-JS client and fixes connections to development control servers
e.g. http://localhost:31544.

Updates tailscale/corp#40944

Signed-off-by: Adriano Sela Aviles <adriano@tailscale.com>
This commit is contained in:
Adriano Sela Aviles 2026-05-06 15:26:50 -07:00 committed by Adriano Sela Aviles
parent d06cc56987
commit daddb14b8f

View File

@ -32,7 +32,9 @@ func (d *Dialer) Dial(ctx context.Context) (*ClientConn, error) {
host := d.Hostname
// If using a custom control server (on a non-standard port), prefer that.
// This mirrors the port selection in newNoiseClient from noise.go.
if d.HTTPPort != "" && d.HTTPPort != "80" && d.HTTPSPort == "443" {
// Also use ws:// when HTTPS is explicitly disabled (NoPort), which happens
// for http:// URLs with private hostnames (e.g. http://localhost:31544).
if d.HTTPPort != "" && d.HTTPPort != "80" && (d.HTTPSPort == "443" || d.HTTPSPort == NoPort) {
wsScheme = "ws"
host = net.JoinHostPort(host, d.HTTPPort)
}