1
0
mirror of https://github.com/golang/go synced 2024-11-25 10:07:56 -07:00

net/http: fix crash with Transport.CloseIdleConnections

Thanks Michael Lore for the bug report!

Fixes #3266

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5754068
This commit is contained in:
Brad Fitzpatrick 2012-03-09 16:27:32 -08:00
parent 98cfe6770d
commit b2e9f425b9
2 changed files with 27 additions and 1 deletions

View File

@ -196,7 +196,7 @@ func (t *Transport) CloseIdleConnections() {
pconn.close() pconn.close()
} }
} }
t.idleConn = nil t.idleConn = make(map[string][]*persistConn)
} }
// //

View File

@ -698,6 +698,32 @@ func TestTransportPersistConnLeak(t *testing.T) {
} }
} }
// This used to crash; http://golang.org/issue/3266
func TestTransportIdleConnCrash(t *testing.T) {
tr := &Transport{}
c := &Client{Transport: tr}
unblockCh := make(chan bool, 1)
ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
<-unblockCh
tr.CloseIdleConnections()
}))
defer ts.Close()
didreq := make(chan bool)
go func() {
res, err := c.Get(ts.URL)
if err != nil {
t.Error(err)
} else {
res.Body.Close() // returns idle conn
}
didreq <- true
}()
unblockCh <- true
<-didreq
}
type fooProto struct{} type fooProto struct{}
func (fooProto) RoundTrip(req *Request) (*Response, error) { func (fooProto) RoundTrip(req *Request) (*Response, error) {