chore: better tls handshake
This commit is contained in:
parent
ceac5bfaa4
commit
5bfe7ba169
3 changed files with 11 additions and 4 deletions
|
@ -21,7 +21,7 @@ type UClientHelloID struct {
|
||||||
var initRandomFingerprint UClientHelloID
|
var initRandomFingerprint UClientHelloID
|
||||||
var initUtlsClient string
|
var initUtlsClient string
|
||||||
|
|
||||||
func UClient(c net.Conn, config *tls.Config, fingerprint UClientHelloID) net.Conn {
|
func UClient(c net.Conn, config *tls.Config, fingerprint UClientHelloID) *UConn {
|
||||||
utlsConn := utls.UClient(c, copyConfig(config), utls.ClientHelloID{
|
utlsConn := utls.UClient(c, copyConfig(config), utls.ClientHelloID{
|
||||||
Client: fingerprint.Client,
|
Client: fingerprint.Client,
|
||||||
Version: fingerprint.Version,
|
Version: fingerprint.Version,
|
||||||
|
|
|
@ -209,11 +209,11 @@ func NewHTTP2Client(dialFn DialFn, tlsConfig *tls.Config, Fingerprint string, re
|
||||||
if realityConfig == nil {
|
if realityConfig == nil {
|
||||||
if fingerprint, exists := tlsC.GetFingerprint(Fingerprint); exists {
|
if fingerprint, exists := tlsC.GetFingerprint(Fingerprint); exists {
|
||||||
utlsConn := tlsC.UClient(pconn, cfg, fingerprint)
|
utlsConn := tlsC.UClient(pconn, cfg, fingerprint)
|
||||||
if err := utlsConn.(*tlsC.UConn).HandshakeContext(ctx); err != nil {
|
if err := utlsConn.HandshakeContext(ctx); err != nil {
|
||||||
pconn.Close()
|
pconn.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
state := utlsConn.(*tlsC.UConn).ConnectionState()
|
state := utlsConn.ConnectionState()
|
||||||
if p := state.NegotiatedProtocol; p != http2.NextProtoTLS {
|
if p := state.NegotiatedProtocol; p != http2.NextProtoTLS {
|
||||||
utlsConn.Close()
|
utlsConn.Close()
|
||||||
return nil, fmt.Errorf("http2: unexpected ALPN protocol %s, want %s", p, http2.NextProtoTLS)
|
return nil, fmt.Errorf("http2: unexpected ALPN protocol %s, want %s", p, http2.NextProtoTLS)
|
||||||
|
|
|
@ -330,7 +330,7 @@ func streamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig,
|
||||||
if fingerprint, exists := tlsC.GetFingerprint(c.ClientFingerprint); exists {
|
if fingerprint, exists := tlsC.GetFingerprint(c.ClientFingerprint); exists {
|
||||||
utlsConn := tlsC.UClient(conn, c.TLSConfig, fingerprint)
|
utlsConn := tlsC.UClient(conn, c.TLSConfig, fingerprint)
|
||||||
|
|
||||||
if err := utlsConn.(*tlsC.UConn).BuildWebsocketHandshakeState(); err != nil {
|
if err := utlsConn.BuildWebsocketHandshakeState(); err != nil {
|
||||||
return nil, fmt.Errorf("parse url %s error: %w", c.Path, err)
|
return nil, fmt.Errorf("parse url %s error: %w", c.Path, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -360,6 +360,13 @@ func streamWebsocketConn(ctx context.Context, conn net.Conn, c *WebsocketConfig,
|
||||||
} else {
|
} else {
|
||||||
conn = tls.Client(conn, dialer.TLSConfig)
|
conn = tls.Client(conn, dialer.TLSConfig)
|
||||||
}
|
}
|
||||||
|
if tlsConn, ok := conn.(interface {
|
||||||
|
HandshakeContext(ctx context.Context) error
|
||||||
|
}); ok {
|
||||||
|
if err = tlsConn.HandshakeContext(ctx); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
request := &http.Request{
|
request := &http.Request{
|
||||||
Method: http.MethodGet,
|
Method: http.MethodGet,
|
||||||
|
|
Loading…
Reference in a new issue