Skip to content

Commit 62cebb2

Browse files
committed
net/http: close connection if OnProxyConnectResponse returns an error
Fixes #64804 Change-Id: Ibe56ab8d114b8826e477b0718470d0b9fbfef9b0 Reviewed-on: https://go-review.googlesource.com/c/go/+/560856 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Jonathan Amsterdam <[email protected]>
1 parent e17e530 commit 62cebb2

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

src/net/http/transport.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1761,6 +1761,7 @@ func (t *Transport) dialConn(ctx context.Context, cm connectMethod) (pconn *pers
17611761
if t.OnProxyConnectResponse != nil {
17621762
err = t.OnProxyConnectResponse(ctx, cm.proxyURL, connectReq, resp)
17631763
if err != nil {
1764+
conn.Close()
17641765
return nil, err
17651766
}
17661767
}

src/net/http/transport_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1523,6 +1523,24 @@ func TestOnProxyConnectResponse(t *testing.T) {
15231523

15241524
c := proxy.Client()
15251525

1526+
var (
1527+
dials atomic.Int32
1528+
closes atomic.Int32
1529+
)
1530+
c.Transport.(*Transport).DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
1531+
conn, err := net.Dial(network, addr)
1532+
if err != nil {
1533+
return nil, err
1534+
}
1535+
dials.Add(1)
1536+
return noteCloseConn{
1537+
Conn: conn,
1538+
closeFunc: func() {
1539+
closes.Add(1)
1540+
},
1541+
}, nil
1542+
}
1543+
15261544
c.Transport.(*Transport).Proxy = ProxyURL(pu)
15271545
c.Transport.(*Transport).OnProxyConnectResponse = func(ctx context.Context, proxyURL *url.URL, connectReq *Request, connectRes *Response) error {
15281546
if proxyURL.String() != pu.String() {
@@ -1534,10 +1552,23 @@ func TestOnProxyConnectResponse(t *testing.T) {
15341552
}
15351553
return tcase.err
15361554
}
1555+
wantCloses := int32(0)
15371556
if _, err := c.Head(ts.URL); err != nil {
1557+
wantCloses = 1
15381558
if tcase.err != nil && !strings.Contains(err.Error(), tcase.err.Error()) {
15391559
t.Errorf("got %v, want %v", err, tcase.err)
15401560
}
1561+
} else {
1562+
if tcase.err != nil {
1563+
t.Errorf("got %v, want nil", err)
1564+
}
1565+
}
1566+
if got, want := dials.Load(), int32(1); got != want {
1567+
t.Errorf("got %v dials, want %v", got, want)
1568+
}
1569+
// #64804: If OnProxyConnectResponse returns an error, we should close the conn.
1570+
if got, want := closes.Load(), wantCloses; got != want {
1571+
t.Errorf("got %v closes, want %v", got, want)
15411572
}
15421573
}
15431574
}

0 commit comments

Comments
 (0)