Skip to content

Commit 847e14b

Browse files
committed
enable new utls conn factory
1 parent 1dd928a commit 847e14b

File tree

3 files changed

+54
-21
lines changed

3 files changed

+54
-21
lines changed

dialer/h2.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,11 @@ func H2ProxyDialerFromURL(u *url.URL, next xproxy.Dialer) (xproxy.Dialer, error)
3232
port := u.Port()
3333

3434
var (
35-
tlsConfig *tls.Config
36-
err error
37-
h2c bool
38-
scheme string
35+
tlsConfig *tls.Config
36+
tlsFactory func(net.Conn, *tls.Config) net.Conn
37+
err error
38+
h2c bool
39+
scheme string
3940
)
4041
switch strings.ToLower(u.Scheme) {
4142
case "h2c":
@@ -55,6 +56,10 @@ func H2ProxyDialerFromURL(u *url.URL, next xproxy.Dialer) (xproxy.Dialer, error)
5556
if err != nil {
5657
return nil, fmt.Errorf("TLS configuration failed: %w", err)
5758
}
59+
tlsFactory, err = tlsutil.TLSFactoryFromURL(u)
60+
if err != nil {
61+
return nil, fmt.Errorf("TLS configuration failed: %w", err)
62+
}
5863
scheme = "https"
5964
default:
6065
return nil, errors.New("unsupported proxy type")
@@ -120,7 +125,7 @@ func H2ProxyDialerFromURL(u *url.URL, next xproxy.Dialer) (xproxy.Dialer, error)
120125
if err != nil {
121126
return nil, err
122127
}
123-
conn = tls.Client(conn, tlsConfig)
128+
conn = tlsFactory(conn, tlsConfig)
124129
return conn, nil
125130
}
126131
}

dialer/optimistic.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ import (
1717
)
1818

1919
type OptimisticHTTPProxyDialer struct {
20-
address string
21-
tlsConfig *tls.Config
22-
userinfo *url.Userinfo
23-
next Dialer
20+
address string
21+
tlsConfig *tls.Config
22+
tlsFactory func(net.Conn, *tls.Config) net.Conn
23+
userinfo *url.Userinfo
24+
next Dialer
2425
}
2526

2627
func NewOptimisticHTTPProxyDialer(address string, tlsConfig *tls.Config, userinfo *url.Userinfo, next LegacyDialer) *OptimisticHTTPProxyDialer {
@@ -36,8 +37,11 @@ func OptimisticHTTPProxyDialerFromURL(u *url.URL, next xproxy.Dialer) (xproxy.Di
3637
host := u.Hostname()
3738
port := u.Port()
3839

39-
var tlsConfig *tls.Config
40-
var err error
40+
var (
41+
tlsConfig *tls.Config
42+
tlsFactory func(net.Conn, *tls.Config) net.Conn
43+
err error
44+
)
4145
switch strings.ToLower(u.Scheme) {
4246
case "http+optimistic":
4347
if port == "" {
@@ -51,13 +55,23 @@ func OptimisticHTTPProxyDialerFromURL(u *url.URL, next xproxy.Dialer) (xproxy.Di
5155
if err != nil {
5256
return nil, fmt.Errorf("TLS configuration failed: %w", err)
5357
}
58+
tlsFactory, err = tlsutil.TLSFactoryFromURL(u)
59+
if err != nil {
60+
return nil, fmt.Errorf("TLS configuration failed: %w", err)
61+
}
5462
default:
5563
return nil, errors.New("unsupported proxy type")
5664
}
5765

5866
address := net.JoinHostPort(host, port)
5967

60-
return NewOptimisticHTTPProxyDialer(address, tlsConfig, u.User, next), nil
68+
return &OptimisticHTTPProxyDialer{
69+
address: address,
70+
tlsConfig: tlsConfig,
71+
tlsFactory: tlsFactory,
72+
userinfo: u.User,
73+
next: MaybeWrapWithContextDialer(next),
74+
}, nil
6175
}
6276

6377
func (d *OptimisticHTTPProxyDialer) Dial(network, address string) (net.Conn, error) {
@@ -75,7 +89,7 @@ func (d *OptimisticHTTPProxyDialer) DialContext(ctx context.Context, network, ad
7589
return nil, fmt.Errorf("proxy dialer is unable to make connection: %w", err)
7690
}
7791
if d.tlsConfig != nil {
78-
conn = tls.Client(conn, d.tlsConfig)
92+
conn = d.tlsFactory(conn, d.tlsConfig)
7993
}
8094

8195
return &futureH1ProxiedConn{

dialer/upstream.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@ import (
2121
)
2222

2323
type HTTPProxyDialer struct {
24-
address string
25-
tlsConfig *tls.Config
26-
userinfo *url.Userinfo
27-
next Dialer
24+
address string
25+
tlsConfig *tls.Config
26+
tlsFactory func(net.Conn, *tls.Config) net.Conn
27+
userinfo *url.Userinfo
28+
next Dialer
2829
}
2930

3031
func NewHTTPProxyDialer(address string, tlsConfig *tls.Config, userinfo *url.Userinfo, next LegacyDialer) *HTTPProxyDialer {
@@ -40,8 +41,11 @@ func HTTPProxyDialerFromURL(u *url.URL, next xproxy.Dialer) (xproxy.Dialer, erro
4041
host := u.Hostname()
4142
port := u.Port()
4243

43-
var tlsConfig *tls.Config
44-
var err error
44+
var (
45+
tlsConfig *tls.Config
46+
tlsFactory func(net.Conn, *tls.Config) net.Conn
47+
err error
48+
)
4549
switch strings.ToLower(u.Scheme) {
4650
case "http":
4751
if port == "" {
@@ -55,13 +59,23 @@ func HTTPProxyDialerFromURL(u *url.URL, next xproxy.Dialer) (xproxy.Dialer, erro
5559
if err != nil {
5660
return nil, fmt.Errorf("TLS configuration failed: %w", err)
5761
}
62+
tlsFactory, err = tlsutil.TLSFactoryFromURL(u)
63+
if err != nil {
64+
return nil, fmt.Errorf("TLS configuration failed: %w", err)
65+
}
5866
default:
5967
return nil, errors.New("unsupported proxy type")
6068
}
6169

6270
address := net.JoinHostPort(host, port)
6371

64-
return NewHTTPProxyDialer(address, tlsConfig, u.User, next), nil
72+
return &HTTPProxyDialer{
73+
address: address,
74+
tlsConfig: tlsConfig,
75+
tlsFactory: tlsFactory,
76+
next: MaybeWrapWithContextDialer(next),
77+
userinfo: u.User,
78+
}, nil
6579
}
6680

6781
func (d *HTTPProxyDialer) Dial(network, address string) (net.Conn, error) {
@@ -79,7 +93,7 @@ func (d *HTTPProxyDialer) DialContext(ctx context.Context, network, address stri
7993
return nil, fmt.Errorf("proxy dialer is unable to make connection: %w", err)
8094
}
8195
if d.tlsConfig != nil {
82-
conn = tls.Client(conn, d.tlsConfig)
96+
conn = d.tlsFactory(conn, d.tlsConfig)
8397
}
8498

8599
stopGuardEvent := make(chan struct{})

0 commit comments

Comments
 (0)