Apply utls in geodata

This commit is contained in:
Fangliding
2026-06-24 14:08:56 +08:00
parent ac04c445bd
commit 518a7efac2
+38 -22
View File
@@ -9,6 +9,7 @@ import (
"path/filepath" "path/filepath"
"time" "time"
utls "github.com/refraction-networking/utls"
"github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/errors"
"github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/net"
"github.com/xtls/xray-core/common/platform/filesystem" "github.com/xtls/xray-core/common/platform/filesystem"
@@ -59,35 +60,50 @@ func newDownloader(ctx context.Context, dispatcher routing.Dispatcher, outbound
} }
func newClient(baseCtx context.Context, dispatcher routing.Dispatcher, outbound string) *http.Client { func newClient(baseCtx context.Context, dispatcher routing.Dispatcher, outbound string) *http.Client {
dial := func(ctx context.Context, network, address string) (net.Conn, error) {
var conn net.Conn
err := task.Run(ctx, func() error {
if tagged.Dialer == nil {
return errors.New("tagged dialer is not initialized")
}
dest, err := net.ParseDestination(network + ":" + address)
if err != nil {
return errors.New("cannot understand address").Base(err)
}
c, err := tagged.Dialer(baseCtx, dispatcher, dest, outbound)
if err != nil {
return errors.New("cannot dial remote address ", dest).Base(err)
}
conn = c
return nil
})
if err != nil {
return nil, errors.New("cannot finish connection").Base(err)
}
return &idleConn{
Conn: conn,
}, nil
}
return &http.Client{ return &http.Client{
Transport: &http.Transport{ Transport: &http.Transport{
Proxy: nil, Proxy: nil,
DisableKeepAlives: true, DisableKeepAlives: true,
DialContext: func(ctx context.Context, network, address string) (net.Conn, error) { DialContext: dial,
var conn net.Conn DialTLSContext: func(ctx context.Context, network, address string) (net.Conn, error) {
err := task.Run(ctx, func() error { conn, err := dial(ctx, network, address)
if tagged.Dialer == nil {
return errors.New("tagged dialer is not initialized")
}
dest, err := net.ParseDestination(network + ":" + address)
if err != nil {
return errors.New("cannot understand address").Base(err)
}
c, err := tagged.Dialer(baseCtx, dispatcher, dest, outbound)
if err != nil {
return errors.New("cannot dial remote address ", dest).Base(err)
}
conn = c
return nil
})
if err != nil { if err != nil {
return nil, errors.New("cannot finish connection").Base(err) return nil, err
} }
return &idleConn{ host, _, _ := net.SplitHostPort(address)
Conn: conn, tlsConn := utls.UClient(conn, &utls.Config{ServerName: host}, utls.HelloChrome_Auto)
}, nil handshakeCtx, cancel := context.WithTimeout(ctx, idleTimeout)
defer cancel()
if err := tlsConn.HandshakeContext(handshakeCtx); err != nil {
conn.Close()
return nil, err
}
return tlsConn, nil
}, },
TLSHandshakeTimeout: idleTimeout,
ResponseHeaderTimeout: idleTimeout, ResponseHeaderTimeout: idleTimeout,
}, },
CheckRedirect: func(req *http.Request, via []*http.Request) error { CheckRedirect: func(req *http.Request, via []*http.Request) error {