diff options
author | Brad Fitzpatrick <bradfitz@golang.org> | 2017-03-27 16:32:04 +0000 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2017-03-27 17:01:57 +0000 |
commit | 89ebe5bbca0638567771cb2b0376b059122a77ba (patch) | |
tree | 487893cb37912ec4667eef51144f7ca7d13a05d2 | |
parent | 4234d1decd853b2373c17340eb4c0033c0fe9566 (diff) | |
download | go-git-89ebe5bbca0638567771cb2b0376b059122a77ba.tar.gz |
net/http/httptest: don't panic on Close of user-constructed Server value
If the user created an httptest.Server directly without using a
constructor it won't have the new unexported 'client' field. So don't
assume it's non-nil.
Fixes #19729
Change-Id: Ie92e5da66cf4e7fb8d95f3ad0f4e3987d3ae8b77
Reviewed-on: https://go-review.googlesource.com/38710
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Kevin Burke <kev@inburke.com>
-rw-r--r-- | src/net/http/httptest/server.go | 6 | ||||
-rw-r--r-- | src/net/http/httptest/server_test.go | 17 |
2 files changed, 21 insertions, 2 deletions
diff --git a/src/net/http/httptest/server.go b/src/net/http/httptest/server.go index b5b18c747d..549ef04623 100644 --- a/src/net/http/httptest/server.go +++ b/src/net/http/httptest/server.go @@ -209,8 +209,10 @@ func (s *Server) Close() { } // Also close the client idle connections. - if t, ok := s.client.Transport.(closeIdleTransport); ok { - t.CloseIdleConnections() + if s.client != nil { + if t, ok := s.client.Transport.(closeIdleTransport); ok { + t.CloseIdleConnections() + } } s.wg.Wait() diff --git a/src/net/http/httptest/server_test.go b/src/net/http/httptest/server_test.go index 62846de02c..d97cec5fdd 100644 --- a/src/net/http/httptest/server_test.go +++ b/src/net/http/httptest/server_test.go @@ -145,3 +145,20 @@ func TestTLSServerClientTransportType(t *testing.T) { t.Errorf("got %T, want *http.Transport", client.Transport) } } + +type onlyCloseListener struct { + net.Listener +} + +func (onlyCloseListener) Close() error { return nil } + +// Issue 19729: panic in Server.Close for values created directly +// without a constructor (so the unexported client field is nil). +func TestServerZeroValueClose(t *testing.T) { + ts := &Server{ + Listener: onlyCloseListener{}, + Config: &http.Server{}, + } + + ts.Close() // tests that it doesn't panic +} |