summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2017-03-27 16:32:04 +0000
committerBrad Fitzpatrick <bradfitz@golang.org>2017-03-27 17:01:57 +0000
commit89ebe5bbca0638567771cb2b0376b059122a77ba (patch)
tree487893cb37912ec4667eef51144f7ca7d13a05d2
parent4234d1decd853b2373c17340eb4c0033c0fe9566 (diff)
downloadgo-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.go6
-rw-r--r--src/net/http/httptest/server_test.go17
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
+}