diff --git a/transport/internet/tls/ech.go b/transport/internet/tls/ech.go index b9b7deb2c..171b60b01 100644 --- a/transport/internet/tls/ech.go +++ b/transport/internet/tls/ech.go @@ -17,6 +17,7 @@ import ( utls "github.com/refraction-networking/utls" "github.com/xtls/xray-core/common/crypto" + "github.com/xtls/xray-core/common/session" "golang.org/x/net/http2" "github.com/miekg/dns" @@ -198,23 +199,27 @@ func dnsQuery(server string, domain string, sockopt *internet.SocketConfig) ([]b IdleConnTimeout: net.ConnIdleTimeout, ReadIdleTimeout: net.ChromeH2KeepAlivePeriod, DialTLSContext: func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } dest, err := net.ParseDestination(network + ":" + addr) if err != nil { return nil, err } + dnsCtx := ctx + if h2c { + dnsCtx = session.ContextWithMitmAlpn11(dnsCtx, false) // for insurance + dnsCtx = session.ContextWithMitmServerName(dnsCtx, host) + } var conn net.Conn - - conn, err = internet.DialSystem(ctx, dest, sockopt) + conn, err = internet.DialSystem(dnsCtx, dest, sockopt) if err != nil { return nil, err } if !h2c { - u, err := url.Parse(server) - if err != nil { - return nil, err - } - conn = utls.UClient(conn, &utls.Config{ServerName: u.Hostname()}, utls.HelloChrome_Auto) + conn = utls.UClient(conn, &utls.Config{ServerName: host}, utls.HelloChrome_Auto) if err := conn.(*utls.UConn).HandshakeContext(ctx); err != nil { return nil, err }