[go] net/http: use httptest.Server Client in tests

522 views
Skip to first unread message

Johan Brandhorst (Gerrit)

unread,
Mar 4, 2017, 1:37:04 PM3/4/17
to Ian Lance Taylor, golang-co...@googlegroups.com

Johan Brandhorst has uploaded this change for review.

View Change

net/http: use httptest.Server Client in tests

After merging https://go-review.googlesource.com/c/34639/,
it was pointed out to me that a lot of tests under net/http
could use the new functionality to simplify and unify testing.

Using the httptest.Server provided Client removes the need to
call CloseIdleConnections() on all Transports created, as it
is automatically called on the Transport associated with the
client.

Change-Id: I9f9d15f59d72893deead5678d314388718c91821
---
M src/net/http/client_test.go
M src/net/http/fs_test.go
M src/net/http/httputil/reverseproxy_test.go
M src/net/http/main_test.go
M src/net/http/npn_test.go
M src/net/http/serve_test.go
M src/net/http/transport_test.go
7 files changed, 290 insertions(+), 353 deletions(-)

diff --git a/src/net/http/client_test.go b/src/net/http/client_test.go
index c75456a..27ed4d3 100644
--- a/src/net/http/client_test.go
+++ b/src/net/http/client_test.go
@@ -10,7 +10,6 @@
 	"bytes"
 	"context"
 	"crypto/tls"
-	"crypto/x509"
 	"encoding/base64"
 	"errors"
 	"fmt"
@@ -73,7 +72,8 @@
 	ts := httptest.NewServer(robotsTxtHandler)
 	defer ts.Close()
 
-	c := &Client{Transport: &Transport{DisableKeepAlives: true}}
+	c := ts.Client()
+	c.Transport = &Transport{DisableKeepAlives: true}
 	r, err := c.Get(ts.URL)
 	var b []byte
 	if err == nil {
@@ -220,10 +220,8 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = new(Transport)
 	_, err := c.Get(ts.URL)
 	if e, g := "Get /?n=10: stopped after 10 redirects", fmt.Sprintf("%v", err); e != g {
 		t.Errorf("with default client Get, expected error %q, got %q", e, g)
@@ -252,13 +250,10 @@
 	var checkErr error
 	var lastVia []*Request
 	var lastReq *Request
-	c = &Client{
-		Transport: tr,
-		CheckRedirect: func(req *Request, via []*Request) error {
-			lastReq = req
-			lastVia = via
-			return checkErr
-		},
+	c.CheckRedirect = func(req *Request, via []*Request) error {
+		lastReq = req
+		lastVia = via
+		return checkErr
 	}
 	res, err := c.Get(ts.URL)
 	if err != nil {
@@ -313,21 +308,17 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-
 	ctx, cancel := context.WithCancel(context.Background())
-	c := &Client{
-		Transport: tr,
-		CheckRedirect: func(req *Request, via []*Request) error {
-			cancel()
-			select {
-			case <-req.Context().Done():
-				return nil
-			case <-time.After(5 * time.Second):
-				return errors.New("redirected request's context never expired after root request canceled")
-			}
-		},
+	c := ts.Client()
+	c.Transport = new(Transport)
+	c.CheckRedirect = func(req *Request, via []*Request) error {
+		cancel()
+		select {
+		case <-req.Context().Done():
+			return nil
+		case <-time.After(5 * time.Second):
+			return errors.New("redirected request's context never expired after root request canceled")
+		}
 	}
 	req, _ := NewRequest("GET", ts.URL, nil)
 	req = req.WithContext(ctx)
@@ -461,11 +452,12 @@
 	}))
 	defer ts.Close()
 
+	c := ts.Client()
 	for _, tt := range table {
 		content := tt.redirectBody
 		req, _ := NewRequest(method, ts.URL+tt.suffix, strings.NewReader(content))
 		req.GetBody = func() (io.ReadCloser, error) { return ioutil.NopCloser(strings.NewReader(content)), nil }
-		res, err := DefaultClient.Do(req)
+		res, err := c.Do(req)
 
 		if err != nil {
 			t.Fatal(err)
@@ -519,17 +511,13 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-
-	c := &Client{
-		Transport: tr,
-		CheckRedirect: func(req *Request, via []*Request) error {
-			if req.Response == nil {
-				t.Error("expected non-nil Request.Response")
-			}
-			return ErrUseLastResponse
-		},
+	c := ts.Client()
+	c.Transport = new(Transport)
+	c.CheckRedirect = func(req *Request, via []*Request) error {
+		if req.Response == nil {
+			t.Error("expected non-nil Request.Response")
+		}
+		return ErrUseLastResponse
 	}
 	res, err := c.Get(ts.URL)
 	if err != nil {
@@ -558,7 +546,8 @@
 		w.WriteHeader(308)
 	}))
 	defer ts.Close()
-	c := &Client{Transport: &Transport{DisableKeepAlives: true}}
+	c := ts.Client()
+	c.Transport = &Transport{DisableKeepAlives: true}
 	res, err := c.Get(ts.URL)
 	if err != nil {
 		t.Fatal(err)
@@ -586,7 +575,8 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	c := &Client{Transport: &Transport{DisableKeepAlives: true}}
+	c := ts.Client()
+	c.Transport = &Transport{DisableKeepAlives: true}
 	req.GetBody = nil // so it can't rewind.
 	res, err := c.Do(req)
 	if err != nil {
@@ -678,12 +668,9 @@
 	var ts *httptest.Server
 	ts = httptest.NewServer(echoCookiesRedirectHandler)
 	defer ts.Close()
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{
-		Transport: tr,
-		Jar:       new(TestJar),
-	}
+	c := ts.Client()
+	c.Transport = new(Transport)
+	c.Jar = new(TestJar)
 	u, _ := url.Parse(ts.URL)
 	c.Jar.SetCookies(u, []*Cookie{expectedCookies[0]})
 	resp, err := c.Get(ts.URL)
@@ -727,12 +714,11 @@
 	}))
 	defer ts.Close()
 	jar := new(RecordingJar)
-	c := &Client{
-		Jar: jar,
-		Transport: &Transport{
-			Dial: func(_ string, _ string) (net.Conn, error) {
-				return net.Dial("tcp", ts.Listener.Addr().String())
-			},
+	c := ts.Client()
+	c.Jar = jar
+	c.Transport = &Transport{
+		Dial: func(_ string, _ string) (net.Conn, error) {
+			return net.Dial("tcp", ts.Listener.Addr().String())
 		},
 	}
 	_, err := c.Get("http://firsthost.fake/")
@@ -845,7 +831,8 @@
 		}
 		return c, err
 	}
-	c := &Client{Transport: &Transport{Dial: dialer}}
+	c := ts.Client()
+	c.Transport = &Transport{Dial: dialer}
 
 	_, err := c.Get(ts.URL)
 	if err != nil {
@@ -919,22 +906,6 @@
 	}
 }
 
-func newTLSTransport(t *testing.T, ts *httptest.Server) *Transport {
-	certs := x509.NewCertPool()
-	for _, c := range ts.TLS.Certificates {
-		roots, err := x509.ParseCertificates(c.Certificate[len(c.Certificate)-1])
-		if err != nil {
-			t.Fatalf("error parsing server's root cert: %v", err)
-		}
-		for _, root := range roots {
-			certs.AddCert(root)
-		}
-	}
-	return &Transport{
-		TLSClientConfig: &tls.Config{RootCAs: certs},
-	}
-}
-
 func TestClientWithCorrectTLSServerName(t *testing.T) {
 	defer afterTest(t)
 
@@ -946,9 +917,8 @@
 	}))
 	defer ts.Close()
 
-	trans := newTLSTransport(t, ts)
-	trans.TLSClientConfig.ServerName = serverName
-	c := &Client{Transport: trans}
+	c := ts.Client()
+	c.Transport.(*Transport).TLSClientConfig.ServerName = serverName
 	if _, err := c.Get(ts.URL); err != nil {
 		t.Fatalf("expected successful TLS connection, got error: %v", err)
 	}
@@ -961,9 +931,8 @@
 	errc := make(chanWriter, 10) // but only expecting 1
 	ts.Config.ErrorLog = log.New(errc, "", 0)
 
-	trans := newTLSTransport(t, ts)
-	trans.TLSClientConfig.ServerName = "badserver"
-	c := &Client{Transport: trans}
+	c := ts.Client()
+	c.Transport.(*Transport).TLSClientConfig.ServerName = "badserver"
 	_, err := c.Get(ts.URL)
 	if err == nil {
 		t.Fatalf("expected an error")
@@ -997,13 +966,12 @@
 	}))
 	defer ts.Close()
 
-	tr := newTLSTransport(t, ts)
+	c := ts.Client()
+	tr := c.Transport.(*Transport)
 	tr.TLSClientConfig.ServerName = "example.com" // one of httptest's Server cert names
 	tr.Dial = func(netw, addr string) (net.Conn, error) {
 		return net.Dial(netw, ts.Listener.Addr().String())
 	}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
 	res, err := c.Get("https://some-other-host.tld/")
 	if err != nil {
 		t.Fatal(err)
@@ -1018,13 +986,12 @@
 	}))
 	defer ts.Close()
 
-	tr := newTLSTransport(t, ts)
+	c := ts.Client()
+	tr := c.Transport.(*Transport)
 	tr.TLSClientConfig.CipherSuites = []uint16{tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA}
 	tr.Dial = func(netw, addr string) (net.Conn, error) {
 		return net.Dial(netw, ts.Listener.Addr().String())
 	}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
 	res, err := c.Get("https://example.com/")
 	if err != nil {
 		t.Fatal(err)
@@ -1119,14 +1086,13 @@
 		}
 	}))
 	defer ts.Close()
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
 	req, err := NewRequest("GET", ts.URL, nil)
 	if err != nil {
 		t.Fatal(err)
 	}
 	req.URL.User = url.User(gopher)
+	c := ts.Client()
+	c.Transport = new(Transport)
 	resp, err := c.Do(req)
 	if err != nil {
 		t.Fatal(err)
@@ -1503,21 +1469,18 @@
 	defer ts2.Close()
 	ts2URL = ts2.URL
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{
-		Transport: tr,
-		CheckRedirect: func(r *Request, via []*Request) error {
-			want := Header{
-				"User-Agent": []string{ua},
-				"X-Foo":      []string{xfoo},
-				"Referer":    []string{ts2URL},
-			}
-			if !reflect.DeepEqual(r.Header, want) {
-				t.Errorf("CheckRedirect Request.Header = %#v; want %#v", r.Header, want)
-			}
-			return nil
-		},
+	c := ts1.Client()
+	c.Transport = new(Transport)
+	c.CheckRedirect = func(r *Request, via []*Request) error {
+		want := Header{
+			"User-Agent": []string{ua},
+			"X-Foo":      []string{xfoo},
+			"Referer":    []string{ts2URL},
+		}
+		if !reflect.DeepEqual(r.Header, want) {
+			t.Errorf("CheckRedirect Request.Header = %#v; want %#v", r.Header, want)
+		}
+		return nil
 	}
 
 	req, _ := NewRequest("GET", ts2.URL, nil)
@@ -1606,13 +1569,10 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
 	jar, _ := cookiejar.New(nil)
-	c := &Client{
-		Transport: tr,
-		Jar:       jar,
-	}
+	c := ts.Client()
+	c.Transport = new(Transport)
+	c.Jar = jar
 
 	u, _ := url.Parse(ts.URL)
 	req, _ := NewRequest("GET", ts.URL, nil)
@@ -1730,9 +1690,8 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-
+	c := ts.Client()
+	c.Transport = new(Transport)
 	for i, tt := range tests {
 		handlerc <- func(w ResponseWriter, r *Request) {
 			w.Header().Set("Location", ts.URL)
@@ -1745,7 +1704,6 @@
 			continue
 		}
 
-		c := &Client{Transport: tr}
 		c.CheckRedirect = func(req *Request, via []*Request) error {
 			if got, want := req.Method, tt.wantMethod; got != want {
 				return fmt.Errorf("#%d: got next method %q; want %q", i, got, want)
@@ -1799,9 +1757,9 @@
 		w.Header().Set("X-Body-Read", fmt.Sprintf("%v, %v", n, err))
 	}))
 	defer ts.Close()
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	tr := new(Transport)
+	c := ts.Client()
+	c.Transport = tr
 
 	// Do one initial successful request to create an idle TCP connection
 	// for the subsequent request to reuse. (The Transport only retries
diff --git a/src/net/http/fs_test.go b/src/net/http/fs_test.go
index 1de1cd5..e12350e 100644
--- a/src/net/http/fs_test.go
+++ b/src/net/http/fs_test.go
@@ -74,6 +74,7 @@
 		ServeFile(w, r, "testdata/file")
 	}))
 	defer ts.Close()
+	c := ts.Client()
 
 	var err error
 
@@ -91,7 +92,7 @@
 	req.Method = "GET"
 
 	// straight GET
-	_, body := getBody(t, "straight get", req)
+	_, body := getBody(t, "straight get", req, c)
 	if !bytes.Equal(body, file) {
 		t.Fatalf("body mismatch: got %q, want %q", body, file)
 	}
@@ -102,7 +103,7 @@
 		if rt.r != "" {
 			req.Header.Set("Range", rt.r)
 		}
-		resp, body := getBody(t, fmt.Sprintf("range test %q", rt.r), req)
+		resp, body := getBody(t, fmt.Sprintf("range test %q", rt.r), req, c)
 		if resp.StatusCode != rt.code {
 			t.Errorf("range=%q: StatusCode=%d, want %d", rt.r, resp.StatusCode, rt.code)
 		}
@@ -704,7 +705,8 @@
 	req, _ := NewRequest("GET", ts.URL, nil)
 	req.Header.Set("If-Modified-Since", lastMod)
 
-	res, err = DefaultClient.Do(req)
+	c := ts.Client()
+	res, err = c.Do(req)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -716,7 +718,7 @@
 	// Advance the index.html file's modtime, but not the directory's.
 	indexFile.modtime = indexFile.modtime.Add(1 * time.Hour)
 
-	res, err = DefaultClient.Do(req)
+	res, err = c.Do(req)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -995,7 +997,9 @@
 		for k, v := range tt.reqHeader {
 			req.Header.Set(k, v)
 		}
-		res, err := DefaultClient.Do(req)
+
+		c := ts.Client()
+		res, err := c.Do(req)
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -1050,8 +1054,9 @@
 	}
 	ts := httptest.NewServer(FileServer(fs))
 	defer ts.Close()
+	c := ts.Client()
 	for _, code := range []int{403, 404, 500} {
-		res, err := DefaultClient.Get(fmt.Sprintf("%s/%d", ts.URL, code))
+		res, err := c.Get(fmt.Sprintf("%s/%d", ts.URL, code))
 		if err != nil {
 			t.Errorf("Error fetching /%d: %v", code, err)
 			continue
@@ -1125,8 +1130,8 @@
 	}
 }
 
-func getBody(t *testing.T, testName string, req Request) (*Response, []byte) {
-	r, err := DefaultClient.Do(&req)
+func getBody(t *testing.T, testName string, req Request, client *Client) (*Response, []byte) {
+	r, err := client.Do(&req)
 	if err != nil {
 		t.Fatalf("%s: for URL %q, send error: %v", testName, req.URL.String(), err)
 	}
diff --git a/src/net/http/httputil/reverseproxy_test.go b/src/net/http/httputil/reverseproxy_test.go
index 9153508..c8ce029 100644
--- a/src/net/http/httputil/reverseproxy_test.go
+++ b/src/net/http/httputil/reverseproxy_test.go
@@ -79,6 +79,7 @@
 	proxyHandler.ErrorLog = log.New(ioutil.Discard, "", 0) // quiet for tests
 	frontend := httptest.NewServer(proxyHandler)
 	defer frontend.Close()
+	frontendClient := frontend.Client()
 
 	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
 	getReq.Host = "some-name"
@@ -86,7 +87,7 @@
 	getReq.Header.Set("Proxy-Connection", "should be deleted")
 	getReq.Header.Set("Upgrade", "foo")
 	getReq.Close = true
-	res, err := http.DefaultClient.Do(getReq)
+	res, err := frontendClient.Do(getReq)
 	if err != nil {
 		t.Fatalf("Get: %v", err)
 	}
@@ -126,7 +127,7 @@
 	// a response results in a StatusBadGateway.
 	getReq, _ = http.NewRequest("GET", frontend.URL+"/?mode=hangup", nil)
 	getReq.Close = true
-	res, err = http.DefaultClient.Do(getReq)
+	res, err = frontendClient.Do(getReq)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -172,7 +173,7 @@
 	getReq.Header.Set("Connection", "Upgrade, "+fakeConnectionToken)
 	getReq.Header.Set("Upgrade", "original value")
 	getReq.Header.Set(fakeConnectionToken, "should be deleted")
-	res, err := http.DefaultClient.Do(getReq)
+	res, err := frontend.Client().Do(getReq)
 	if err != nil {
 		t.Fatalf("Get: %v", err)
 	}
@@ -220,7 +221,7 @@
 	getReq.Header.Set("Connection", "close")
 	getReq.Header.Set("X-Forwarded-For", prevForwardedFor)
 	getReq.Close = true
-	res, err := http.DefaultClient.Do(getReq)
+	res, err := frontend.Client().Do(getReq)
 	if err != nil {
 		t.Fatalf("Get: %v", err)
 	}
@@ -259,7 +260,7 @@
 		frontend := httptest.NewServer(NewSingleHostReverseProxy(backendURL))
 		req, _ := http.NewRequest("GET", frontend.URL+tt.reqSuffix, nil)
 		req.Close = true
-		res, err := http.DefaultClient.Do(req)
+		res, err := frontend.Client().Do(req)
 		if err != nil {
 			t.Fatalf("%d. Get: %v", i, err)
 		}
@@ -295,7 +296,7 @@
 
 	req, _ := http.NewRequest("GET", frontend.URL, nil)
 	req.Close = true
-	res, err := http.DefaultClient.Do(req)
+	res, err := frontend.Client().Do(req)
 	if err != nil {
 		t.Fatalf("Get: %v", err)
 	}
@@ -355,7 +356,7 @@
 		<-reqInFlight
 		http.DefaultTransport.(*http.Transport).CancelRequest(getReq)
 	}()
-	res, err := http.DefaultClient.Do(getReq)
+	res, err := frontend.Client().Do(getReq)
 	if res != nil {
 		t.Errorf("got response %v; want nil", res.Status)
 	}
@@ -428,11 +429,12 @@
 	proxyHandler.ErrorLog = log.New(ioutil.Discard, "", 0) // quiet for tests
 	frontend := httptest.NewServer(proxyHandler)
 	defer frontend.Close()
+	frontendClient := frontend.Client()
 
 	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
 	getReq.Header.Set("User-Agent", explicitUA)
 	getReq.Close = true
-	res, err := http.DefaultClient.Do(getReq)
+	res, err := frontendClient.Do(getReq)
 	if err != nil {
 		t.Fatalf("Get: %v", err)
 	}
@@ -441,7 +443,7 @@
 	getReq, _ = http.NewRequest("GET", frontend.URL+"/noua", nil)
 	getReq.Header.Set("User-Agent", "")
 	getReq.Close = true
-	res, err = http.DefaultClient.Do(getReq)
+	res, err = frontendClient.Do(getReq)
 	if err != nil {
 		t.Fatalf("Get: %v", err)
 	}
@@ -493,7 +495,7 @@
 
 	req, _ := http.NewRequest("GET", frontend.URL, nil)
 	req.Close = true
-	res, err := http.DefaultClient.Do(req)
+	res, err := frontend.Client().Do(req)
 	if err != nil {
 		t.Fatalf("Get: %v", err)
 	}
@@ -540,7 +542,7 @@
 	defer frontend.Close()
 
 	postReq, _ := http.NewRequest("POST", frontend.URL, bytes.NewReader(requestBody))
-	res, err := http.DefaultClient.Do(postReq)
+	res, err := frontend.Client().Do(postReq)
 	if err != nil {
 		t.Fatalf("Do: %v", err)
 	}
@@ -573,7 +575,7 @@
 	frontend := httptest.NewServer(proxyHandler)
 	defer frontend.Close()
 
-	res, err := http.DefaultClient.Get(frontend.URL)
+	res, err := frontend.Client().Get(frontend.URL)
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/src/net/http/main_test.go b/src/net/http/main_test.go
index 438bd2e..fc0437e 100644
--- a/src/net/http/main_test.go
+++ b/src/net/http/main_test.go
@@ -151,7 +151,3 @@
 	}
 	return err
 }
-
-func closeClient(c *http.Client) {
-	c.Transport.(*http.Transport).CloseIdleConnections()
-}
diff --git a/src/net/http/npn_test.go b/src/net/http/npn_test.go
index 4c1f6b5..618bdbe 100644
--- a/src/net/http/npn_test.go
+++ b/src/net/http/npn_test.go
@@ -8,6 +8,7 @@
 	"bufio"
 	"bytes"
 	"crypto/tls"
+	"crypto/x509"
 	"fmt"
 	"io"
 	"io/ioutil"
@@ -43,10 +44,7 @@
 
 	// Normal request, without NPN.
 	{
-		tr := newTLSTransport(t, ts)
-		defer tr.CloseIdleConnections()
-		c := &Client{Transport: tr}
-
+		c := ts.Client()
 		res, err := c.Get(ts.URL)
 		if err != nil {
 			t.Fatal(err)
@@ -63,11 +61,18 @@
 	// Request to an advertised but unhandled NPN protocol.
 	// Server will hang up.
 	{
-		tr := newTLSTransport(t, ts)
-		tr.TLSClientConfig.NextProtos = []string{"unhandled-proto"}
+		certPool := x509.NewCertPool()
+		certPool.AddCert(ts.Certificate())
+		tr := &Transport{
+			TLSClientConfig: &tls.Config{
+				RootCAs:    certPool,
+				NextProtos: []string{"unhandled-proto"},
+			},
+		}
 		defer tr.CloseIdleConnections()
-		c := &Client{Transport: tr}
-
+		c := &Client{
+			Transport: tr,
+		}
 		res, err := c.Get(ts.URL)
 		if err == nil {
 			defer res.Body.Close()
@@ -80,7 +85,8 @@
 	// Request using the "tls-0.9" protocol, which we register here.
 	// It is HTTP/0.9 over TLS.
 	{
-		tlsConfig := newTLSTransport(t, ts).TLSClientConfig
+		c := ts.Client()
+		tlsConfig := c.Transport.(*Transport).TLSClientConfig
 		tlsConfig.NextProtos = []string{"tls-0.9"}
 		conn, err := tls.Dial("tcp", ts.Listener.Addr().String(), tlsConfig)
 		if err != nil {
diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go
index 8092cc1..0e6b743 100644
--- a/src/net/http/serve_test.go
+++ b/src/net/http/serve_test.go
@@ -474,9 +474,8 @@
 	defer ts.Close()
 
 	// Hit the HTTP server successfully.
-	tr := &Transport{DisableKeepAlives: true} // they interfere with this test
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = &Transport{DisableKeepAlives: true} // they interfere with this test
 	r, err := c.Get(ts.URL)
 	if err != nil {
 		t.Fatalf("http Get #1: %v", err)
@@ -548,12 +547,10 @@
 	ts.StartTLS()
 	defer ts.Close()
 
-	tr := newTLSTransport(t, ts)
-	defer tr.CloseIdleConnections()
-	if err := ExportHttp2ConfigureTransport(tr); err != nil {
+	c := ts.Client()
+	if err := ExportHttp2ConfigureTransport(c.Transport.(*Transport)); err != nil {
 		t.Fatal(err)
 	}
-	c := &Client{Transport: tr}
 
 	for i := 1; i <= 3; i++ {
 		req, err := NewRequest("GET", ts.URL, nil)
@@ -608,9 +605,8 @@
 	ts.Start()
 	defer ts.Close()
 
-	tr := &Transport{DisableKeepAlives: false}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = &Transport{DisableKeepAlives: false}
 
 	errc := make(chan error)
 	go func() {
@@ -671,8 +667,8 @@
 	ts := httptest.NewServer(handler)
 	defer ts.Close()
 
-	c := &Client{Transport: new(Transport)}
-	defer closeClient(c)
+	c := ts.Client()
+	c.Transport = new(Transport)
 
 	// Note: this relies on the assumption (which is true) that
 	// Get sends HTTP/1.1 or greater requests. Otherwise the
@@ -949,9 +945,9 @@
 	ts.Start()
 	defer ts.Close()
 
-	tr := &Transport{DisableKeepAlives: true}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr, Timeout: time.Second}
+	c := ts.Client()
+	c.Transport = &Transport{DisableKeepAlives: true}
+	c.Timeout = time.Second
 
 	fetch := func(num int, response chan<- string) {
 		resp, err := c.Get(ts.URL)
@@ -1022,9 +1018,8 @@
 	}))
 	defer ts.Close()
 
-	c := &Client{Transport: new(Transport)}
-	defer closeClient(c)
-
+	c := ts.Client()
+	c.Transport = new(Transport)
 	res, err := c.Get(ts.URL)
 	if err != nil {
 		t.Fatalf("Get error: %v", err)
@@ -1145,12 +1140,7 @@
 			t.Errorf("expected test TLS server to start with https://, got %q", ts.URL)
 			return
 		}
-		noVerifyTransport := &Transport{
-			TLSClientConfig: &tls.Config{
-				InsecureSkipVerify: true,
-			},
-		}
-		client := &Client{Transport: noVerifyTransport}
+		client := ts.Client()
 		res, err := client.Get(ts.URL)
 		if err != nil {
 			t.Error(err)
@@ -1967,8 +1957,8 @@
 	ts := httptest.NewServer(TimeoutHandler(delayHi, 20*time.Millisecond, ""))
 	defer ts.Close()
 
-	c := &Client{Transport: new(Transport)}
-	defer closeClient(c)
+	c := ts.Client()
+	c.Transport = new(Transport)
 
 	var wg sync.WaitGroup
 	gate := make(chan bool, 10)
@@ -2011,8 +2001,9 @@
 	if testing.Short() {
 		n = 10
 	}
-	c := &Client{Transport: new(Transport)}
-	defer closeClient(c)
+
+	c := ts.Client()
+	c.Transport = new(Transport)
 	for i := 0; i < n; i++ {
 		gate <- true
 		wg.Add(1)
@@ -2099,8 +2090,8 @@
 	ts := httptest.NewServer(TimeoutHandler(handler, timeout, ""))
 	defer ts.Close()
 
-	c := &Client{Transport: new(Transport)}
-	defer closeClient(c)
+	c := ts.Client()
+	c.Transport = new(Transport)
 
 	// Issue was caused by the timeout handler starting the timer when
 	// was created, not when the request. So wait for more than the timeout
@@ -2127,8 +2118,8 @@
 	ts := httptest.NewServer(TimeoutHandler(handler, timeout, ""))
 	defer ts.Close()
 
-	c := &Client{Transport: new(Transport)}
-	defer closeClient(c)
+	c := ts.Client()
+	c.Transport = new(Transport)
 
 	res, err := c.Get(ts.URL)
 	if err != nil {
@@ -2411,8 +2402,8 @@
 	ts := httptest.NewServer(StripPrefix("/foo", h))
 	defer ts.Close()
 
-	c := &Client{Transport: new(Transport)}
-	defer closeClient(c)
+	c := ts.Client()
+	c.Transport = new(Transport)
 
 	res, err := c.Get(ts.URL + "/foo/bar")
 	if err != nil {
@@ -4491,15 +4482,9 @@
 	b.ResetTimer()
 	b.SetParallelism(parallelism)
 	b.RunParallel(func(pb *testing.PB) {
-		noVerifyTransport := &Transport{
-			TLSClientConfig: &tls.Config{
-				InsecureSkipVerify: true,
-			},
-		}
-		defer noVerifyTransport.CloseIdleConnections()
-		client := &Client{Transport: noVerifyTransport}
+		c := ts.Client()
 		for pb.Next() {
-			res, err := client.Get(ts.URL)
+			res, err := c.Get(ts.URL)
 			if err != nil {
 				b.Logf("Get: %v", err)
 				continue
@@ -4934,10 +4919,8 @@
 	ts.Config.IdleTimeout = 2 * time.Second
 	ts.Start()
 	defer ts.Close()
-
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = new(Transport)
 
 	get := func() string {
 		res, err := c.Get(ts.URL)
@@ -4998,9 +4981,9 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	tr := new(Transport)
+	c := ts.Client()
+	c.Transport = tr
 
 	get := func() string { return get(t, c, ts.URL) }
 
@@ -5119,9 +5102,8 @@
 	ts.Start()
 	defer ts.Close()
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = new(Transport)
 
 	res, err := c.Get(ts.URL)
 	if err != nil {
diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go
index cb315f1..991bccf 100644
--- a/src/net/http/transport_test.go
+++ b/src/net/http/transport_test.go
@@ -132,9 +132,8 @@
 	defer ts.Close()
 
 	for _, disableKeepAlive := range []bool{false, true} {
-		tr := &Transport{DisableKeepAlives: disableKeepAlive}
-		defer tr.CloseIdleConnections()
-		c := &Client{Transport: tr}
+		c := ts.Client()
+		c.Transport = &Transport{DisableKeepAlives: disableKeepAlive}
 
 		fetch := func(n int) string {
 			res, err := c.Get(ts.URL)
@@ -170,7 +169,8 @@
 		tr := &Transport{
 			Dial: testDial,
 		}
-		c := &Client{Transport: tr}
+		c := ts.Client()
+		c.Transport = tr
 
 		fetch := func(n int) string {
 			req := new(Request)
@@ -221,7 +221,8 @@
 		tr := &Transport{
 			Dial: testDial,
 		}
-		c := &Client{Transport: tr}
+		c := ts.Client()
+		c.Transport = tr
 
 		fetch := func(n int) string {
 			req := new(Request)
@@ -276,7 +277,9 @@
 	tr := &Transport{
 		DisableKeepAlives: true,
 	}
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = tr
+
 	res, err := c.Get(ts.URL)
 	if err != nil {
 		t.Fatal(err)
@@ -293,7 +296,8 @@
 	defer ts.Close()
 
 	tr := &Transport{DisableKeepAlives: false}
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = tr
 
 	if e, g := 0, len(tr.IdleConnKeysForTesting()); e != g {
 		t.Errorf("After CloseIdleConnections expected %d idle conn cache keys; got %d", e, g)
@@ -386,8 +390,12 @@
 	}))
 	defer ts.Close()
 	maxIdleConnsPerHost := 2
-	tr := &Transport{DisableKeepAlives: false, MaxIdleConnsPerHost: maxIdleConnsPerHost}
-	c := &Client{Transport: tr}
+	tr := &Transport{
+		DisableKeepAlives:   false,
+		MaxIdleConnsPerHost: maxIdleConnsPerHost,
+	}
+	c := ts.Client()
+	c.Transport = tr
 
 	// Start 3 outstanding requests and wait for the server to get them.
 	// Their responses will hang until we write to resch, though.
@@ -451,8 +459,8 @@
 	defer ts.Close()
 
 	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = tr
 
 	doReq := func(name string) string {
 		// Do a POST instead of a GET to prevent the Transport's
@@ -498,7 +506,8 @@
 	defer ts.Close()
 
 	tr := &Transport{}
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = tr
 
 	fetch := func(n, retries int) string {
 		condFatalf := func(format string, arg ...interface{}) {
@@ -565,9 +574,8 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{DisableKeepAlives: false}
-	c := &Client{Transport: tr}
-	defer tr.CloseIdleConnections()
+	c := ts.Client()
+	c.Transport = &Transport{DisableKeepAlives: false}
 
 	// Do a bunch of traffic from different goroutines. Send to activityc
 	// after each request completes, regardless of whether it failed.
@@ -621,8 +629,8 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{DisableKeepAlives: false}
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = &Transport{DisableKeepAlives: false}
 	for i := 0; i < 2; i++ {
 		res, err := c.Head(ts.URL)
 		if err != nil {
@@ -657,9 +665,8 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{DisableKeepAlives: false}
-	c := &Client{Transport: tr}
-	defer tr.CloseIdleConnections()
+	c := ts.Client()
+	c.Transport = &Transport{DisableKeepAlives: false}
 
 	// Ensure that we wait for the readLoop to complete before
 	// calling Head again
@@ -792,10 +799,10 @@
 		gz.Close()
 	}))
 	defer ts.Close()
+	c := ts.Client()
+	c.Transport = new(Transport)
 
 	for _, chunked := range []string{"1", "0"} {
-		c := &Client{Transport: &Transport{}}
-
 		// First fetch something large, but only read some of it.
 		res, err := c.Get(ts.URL + "/?body=large&chunked=" + chunked)
 		if err != nil {
@@ -845,7 +852,6 @@
 	}
 
 	// And a HEAD request too, because they're always weird.
-	c := &Client{Transport: &Transport{}}
 	res, err := c.Head(ts.URL)
 	if err != nil {
 		t.Fatalf("Head: %v", err)
@@ -916,9 +922,10 @@
 	}
 
 	for i, v := range tests {
-		tr := &Transport{ExpectContinueTimeout: 2 * time.Second}
-		defer tr.CloseIdleConnections()
-		c := &Client{Transport: tr}
+		c := ts.Client()
+		c.Transport = &Transport{
+			ExpectContinueTimeout: 2 * time.Second,
+		}
 
 		body := bytes.NewReader(v.body)
 		req, err := NewRequest("PUT", ts.URL+v.path, body)
@@ -1016,7 +1023,8 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	c := &Client{Transport: &Transport{Proxy: ProxyURL(pu)}}
+	c := ts.Client()
+	c.Transport = &Transport{Proxy: ProxyURL(pu)}
 	if _, err := c.Head(ts.URL); err != nil {
 		t.Error(err)
 	}
@@ -1052,7 +1060,8 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	c := &Client{Transport: &Transport{Proxy: ProxyURL(pu)}}
+	c := ts.Client()
+	c.Transport = &Transport{Proxy: ProxyURL(pu)}
 	if _, err := c.Head(ts.URL); err != nil {
 		t.Error(err)
 	}
@@ -1122,9 +1131,8 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = new(Transport)
 	res, err := c.Get(ts.URL)
 	if err != nil {
 		t.Fatal(err)
@@ -1152,9 +1160,8 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = new(Transport)
 	res, err := c.Get(ts.URL)
 	if err != nil {
 		t.Fatal(err)
@@ -1197,7 +1204,8 @@
 	defer ts.Close()
 
 	tr := &Transport{}
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = tr
 
 	n0 := runtime.NumGoroutine()
 
@@ -1262,7 +1270,8 @@
 	defer ts.Close()
 
 	tr := &Transport{}
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = tr
 
 	n0 := runtime.NumGoroutine()
 	body := []byte("Hello")
@@ -1332,8 +1341,8 @@
 		}
 	}))
 	defer ts.Close()
-	tr := &Transport{}
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = new(Transport)
 	res, err := c.Get(ts.URL)
 	if err != nil {
 		t.Fatal(err)
@@ -1358,8 +1367,8 @@
 		Error(w, deniedMsg, StatusUnauthorized)
 	}))
 	defer ts.Close()
-	tr := &Transport{}
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = new(Transport)
 	res, err := c.Post(ts.URL, "application/octet-stream", neverEnding('a'))
 	if err != nil {
 		t.Errorf("Post: %v", err)
@@ -1383,8 +1392,9 @@
 	}))
 	defer ts.Close()
 
+	c := ts.Client()
+	c.Transport = new(Transport)
 	for _, closeBody := range []bool{true, false} {
-		c := &Client{Transport: &Transport{}}
 		const n = 4
 		for i := 1; i <= n; i++ {
 			res, err := c.Get(ts.URL)
@@ -1424,10 +1434,8 @@
 	SetPendingDialHooks(func() { wg.Add(1) }, wg.Done)
 	defer SetPendingDialHooks(nil, nil)
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = new(Transport)
 	reqs := make(chan string)
 	defer close(reqs)
 
@@ -1471,21 +1479,20 @@
 	ts := httptest.NewServer(mux)
 	timeout := 100 * time.Millisecond
 
-	client := &Client{
-		Transport: &Transport{
-			Dial: func(n, addr string) (net.Conn, error) {
-				conn, err := net.Dial(n, addr)
-				if err != nil {
-					return nil, err
-				}
-				conn.SetDeadline(time.Now().Add(timeout))
-				if debug {
-					conn = NewLoggingConn("client", conn)
-				}
-				return conn, nil
-			},
-			DisableKeepAlives: true,
+	c := ts.Client()
+	c.Transport = &Transport{
+		Dial: func(n, addr string) (net.Conn, error) {
+			conn, err := net.Dial(n, addr)
+			if err != nil {
+				return nil, err
+			}
+			conn.SetDeadline(time.Now().Add(timeout))
+			if debug {
+				conn = NewLoggingConn("client", conn)
+			}
+			return conn, nil
 		},
+		DisableKeepAlives: true,
 	}
 
 	getFailed := false
@@ -1497,7 +1504,7 @@
 		if debug {
 			println("run", i+1, "of", nRuns)
 		}
-		sres, err := client.Get(ts.URL + "/get")
+		sres, err := c.Get(ts.URL + "/get")
 		if err != nil {
 			if !getFailed {
 				// Make the timeout longer, once.
@@ -1537,21 +1544,20 @@
 	ts := httptest.NewServer(mux)
 	timeout := 100 * time.Millisecond
 
-	client := &Client{
-		Transport: &Transport{
-			Dial: func(n, addr string) (net.Conn, error) {
-				conn, err := net.Dial(n, addr)
-				if err != nil {
-					return nil, err
-				}
-				conn.SetDeadline(time.Now().Add(timeout))
-				if debug {
-					conn = NewLoggingConn("client", conn)
-				}
-				return conn, nil
-			},
-			DisableKeepAlives: true,
+	c := ts.Client()
+	c.Transport = &Transport{
+		Dial: func(n, addr string) (net.Conn, error) {
+			conn, err := net.Dial(n, addr)
+			if err != nil {
+				return nil, err
+			}
+			conn.SetDeadline(time.Now().Add(timeout))
+			if debug {
+				conn = NewLoggingConn("client", conn)
+			}
+			return conn, nil
 		},
+		DisableKeepAlives: true,
 	}
 
 	getFailed := false
@@ -1563,7 +1569,7 @@
 		if debug {
 			println("run", i+1, "of", nRuns)
 		}
-		sres, err := client.Get(ts.URL + "/get")
+		sres, err := c.Get(ts.URL + "/get")
 		if err != nil {
 			if !getFailed {
 				// Make the timeout longer, once.
@@ -1577,7 +1583,7 @@
 			break
 		}
 		req, _ := NewRequest("PUT", ts.URL+"/put", sres.Body)
-		_, err = client.Do(req)
+		_, err = c.Do(req)
 		if err == nil {
 			sres.Body.Close()
 			t.Errorf("Unexpected successful PUT")
@@ -1609,11 +1615,10 @@
 	ts := httptest.NewServer(mux)
 	defer ts.Close()
 
-	tr := &Transport{
+	c := ts.Client()
+	c.Transport = &Transport{
 		ResponseHeaderTimeout: 500 * time.Millisecond,
 	}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
 
 	tests := []struct {
 		path    string
@@ -1681,8 +1686,8 @@
 	defer close(unblockc)
 
 	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = tr
 
 	req, _ := NewRequest("GET", ts.URL, nil)
 	res, err := c.Do(req)
@@ -1791,8 +1796,8 @@
 	defer close(unblockc)
 
 	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = tr
 
 	req, _ := NewRequest("GET", ts.URL, nil)
 	ch := make(chan struct{})
@@ -1849,9 +1854,8 @@
 	defer ts.Close()
 	defer close(unblockc)
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = new(Transport)
 
 	req, _ := NewRequest("GET", ts.URL, nil)
 	if withCtx {
@@ -1940,8 +1944,8 @@
 	defer ts.Close()
 
 	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = tr
 
 	req, _ := NewRequest("GET", ts.URL, nil)
 	defer tr.CancelRequest(req)
@@ -2061,7 +2065,8 @@
 	defer ts.Close()
 
 	dialGate := make(chan bool, 1)
-	tr := &Transport{
+	c := ts.Client()
+	c.Transport = &Transport{
 		Dial: func(n, addr string) (net.Conn, error) {
 			if <-dialGate {
 				return net.Dial(n, addr)
@@ -2069,10 +2074,6 @@
 			return nil, errors.New("manually closed")
 		},
 		DisableKeepAlives: false,
-	}
-	defer tr.CloseIdleConnections()
-	c := &Client{
-		Transport: tr,
 	}
 
 	dialGate <- true // only allow one dial
@@ -2331,9 +2332,8 @@
 			return net.Dial(netw, ts.Listener.Addr().String())
 		},
 	}
-	defer tr.CloseIdleConnections()
-
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = tr
 
 	// First, without keep-alives.
 	for _, disableKeep := range []bool{true, false} {
@@ -2376,13 +2376,12 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	cl := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = new(Transport)
 
 	closes := 0
 
-	res, err := cl.Post(ts.URL, "text/plain", countCloseReader{&closes, strings.NewReader("hello")})
+	res, err := c.Post(ts.URL, "text/plain", countCloseReader{&closes, strings.NewReader("hello")})
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -2468,20 +2467,16 @@
 		fmt.Fprintf(w, "hello")
 	}))
 	defer ts.Close()
-	tr := &Transport{
-		TLSClientConfig: &tls.Config{
-			InsecureSkipVerify: true,
-		},
-	}
-	defer tr.CloseIdleConnections()
-	client := &Client{Transport: tr}
+
+	c := ts.Client()
+	tr := c.Transport.(*Transport)
 
 	var nSuccess = 0
 	var errs []error
 	const trials = 20
 	for i := 0; i < trials; i++ {
 		tr.CloseIdleConnections()
-		res, err := client.Get(ts.URL + "/keep-alive-then-die")
+		res, err := c.Get(ts.URL + "/keep-alive-then-die")
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -2496,7 +2491,7 @@
 
 		// Now try again and see if we successfully
 		// pick a new connection.
-		res, err = client.Get(ts.URL + "/")
+		res, err = c.Get(ts.URL + "/")
 		if err != nil {
 			errs = append(errs, err)
 			continue
@@ -2575,22 +2570,22 @@
 		go io.Copy(ioutil.Discard, conn)
 	}))
 	defer ts.Close()
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	client := &Client{Transport: tr}
+
+	c := ts.Client()
+	c.Transport = new(Transport)
 
 	const bodySize = 256 << 10
 	finalBit := make(byteFromChanReader, 1)
 	req, _ := NewRequest("POST", ts.URL, io.MultiReader(io.LimitReader(neverEnding('x'), bodySize-1), finalBit))
 	req.ContentLength = bodySize
-	res, err := client.Do(req)
+	res, err := c.Do(req)
 	if err := wantBody(res, err, "foo"); err != nil {
 		t.Errorf("POST response: %v", err)
 	}
 	donec := make(chan bool)
 	go func() {
 		defer close(donec)
-		res, err = client.Get(ts.URL)
+		res, err = c.Get(ts.URL)
 		if err := wantBody(res, err, "bar"); err != nil {
 			t.Errorf("GET response: %v", err)
 			return
@@ -2622,10 +2617,11 @@
 		conn.Close()
 	}))
 	defer ts.Close()
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	cl := &Client{Transport: tr}
-	res, err := cl.Get(ts.URL)
+
+	c := ts.Client()
+	c.Transport = new(Transport)
+
+	res, err := c.Get(ts.URL)
 	if err != nil {
 		t.Fatalf("Get: %v", err)
 	}
@@ -2686,7 +2682,8 @@
 	defer ts.Close()
 
 	var writeNumAtomic int32
-	tr := &Transport{
+	c := ts.Client()
+	c.Transport = &Transport{
 		Dial: func(network, addr string) (net.Conn, error) {
 			logf("Dial")
 			c, err := net.Dial(network, ts.Listener.Addr().String())
@@ -2707,8 +2704,6 @@
 			}, nil
 		},
 	}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
 
 	SetRoundTripRetried(func() {
 		logf("Retried.")
@@ -2801,23 +2796,19 @@
 		mu.Unlock()
 	}))
 	defer ts.Close()
-	tr := &Transport{
-		DialTLS: func(netw, addr string) (net.Conn, error) {
-			mu.Lock()
-			didDial = true
-			mu.Unlock()
-			c, err := tls.Dial(netw, addr, &tls.Config{
-				InsecureSkipVerify: true,
-			})
-			if err != nil {
-				return nil, err
-			}
-			return c, c.Handshake()
-		},
+	c := ts.Client()
+	c.Transport.(*Transport).DialTLS = func(netw, addr string) (net.Conn, error) {
+		mu.Lock()
+		didDial = true
+		mu.Unlock()
+		c, err := tls.Dial(netw, addr, c.Transport.(*Transport).TLSClientConfig)
+		if err != nil {
+			return nil, err
+		}
+		return c, c.Handshake()
 	}
-	defer tr.CloseIdleConnections()
-	client := &Client{Transport: tr}
-	res, err := client.Get(ts.URL)
+
+	res, err := c.Get(ts.URL)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -3097,6 +3088,8 @@
 	}))
 	defer ts.Close()
 
+	c := ts.Client()
+	c.Transport = new(Transport)
 	fail := 0
 	count := 100
 	bigBody := strings.Repeat("a", contentLengthLimit*2)
@@ -3105,10 +3098,7 @@
 		if err != nil {
 			t.Fatal(err)
 		}
-		tr := new(Transport)
-		defer tr.CloseIdleConnections()
-		client := &Client{Transport: tr}
-		resp, err := client.Do(req)
+		resp, err := c.Do(req)
 		if err != nil {
 			fail++
 			t.Logf("%d = %#v", i, err)
@@ -3322,9 +3312,8 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	c := ts.Client()
+	c.Transport = new(Transport)
 	for i := 0; i < 2; i++ {
 		res, err := c.Get(ts.URL)
 		if err != nil {
@@ -3354,11 +3343,10 @@
 	}))
 	defer ts.Close()
 
-	tr := &Transport{
+	c := ts.Client()
+	c.Transport = &Transport{
 		MaxResponseHeaderBytes: 512 << 10,
 	}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
 	if res, err := c.Get(ts.URL); err != nil {
 		t.Fatal(err)
 	} else {
@@ -3640,9 +3628,7 @@
 		},
 	}
 
-	tr := &Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+	c := s.Client()
 	req, err := NewRequest("GET", s.URL, nil)
 	if err != nil {
 		t.Fatal("Unable to construct test request:", err)
@@ -3670,16 +3656,17 @@
 		// No body for convenience.
 	}))
 	defer ts.Close()
+
 	tr := &Transport{
 		MaxIdleConns: 4,
 	}
-	defer tr.CloseIdleConnections()
+	c := ts.Client()
+	c.Transport = tr
 
 	ip, port, err := net.SplitHostPort(ts.Listener.Addr().String())
 	if err != nil {
 		t.Fatal(err)
 	}
-	c := &Client{Transport: tr}
 	ctx := context.WithValue(context.Background(), nettrace.LookupIPAltResolverKey{}, func(ctx context.Context, host string) ([]net.IPAddr, error) {
 		return []net.IPAddr{{IP: net.ParseIP(ip)}}, nil
 	})
@@ -3975,7 +3962,9 @@
 		c.Close()
 	}))
 	defer ts.Close()
-	tr := &Transport{
+
+	c := ts.Client()
+	c.Transport = &Transport{
 		ProxyConnectHeader: Header{
 			"User-Agent": {"foo"},
 			"Other":      {"bar"},
@@ -3984,8 +3973,7 @@
 			return url.Parse(ts.URL)
 		},
 	}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
+
 	res, err := c.Get("https://dummy.tld/") // https to force a CONNECT
 	if err == nil {
 		res.Body.Close()

To view, visit change 37771. To unsubscribe, visit settings.

Gerrit-Project: go
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
Gerrit-Change-Number: 37771
Gerrit-PatchSet: 1
Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>

Johan Brandhorst (Gerrit)

unread,
Mar 4, 2017, 1:39:01 PM3/4/17
to Brad Fitzpatrick, golang-co...@googlegroups.com

Johan Brandhorst posted comments on this change.

View Change

Patch set 1:

I've replaced most uses of http.Client together with httptest.Server with the use of (*Server).Client(). I've tried to minimise changes while achieving some consistency between tests. Some tests that simply set InsecureSkipVerify to true now use proper TLS negotiation.

    To view, visit change 37771. To unsubscribe, visit settings.

    Gerrit-Project: go
    Gerrit-Branch: master
    Gerrit-MessageType: comment
    Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
    Gerrit-Change-Number: 37771
    Gerrit-PatchSet: 1
    Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
    Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
    Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
    Gerrit-Comment-Date: Sat, 04 Mar 2017 18:38:58 +0000
    Gerrit-HasComments: No

    Johan Brandhorst (Gerrit)

    unread,
    Mar 4, 2017, 1:41:14 PM3/4/17
    to Brad Fitzpatrick, golang-co...@googlegroups.com

    Johan Brandhorst posted comments on this change.

    View Change

    Patch set 1:

    Another note: wherever in the past there was a simple &Transport used, I've now created a new &Transport for use with the client to prevent it from using http.DefaultTransport where previously it wasn't. If this is an unnecessary precaution, this change could be made simpler. Also note that only non-TLS httptest.Server's will be using the http.DefaultTransport.

      To view, visit change 37771. To unsubscribe, visit settings.

      Gerrit-Project: go
      Gerrit-Branch: master
      Gerrit-MessageType: comment
      Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
      Gerrit-Change-Number: 37771
      Gerrit-PatchSet: 1
      Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
      Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
      Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
      Gerrit-Comment-Date: Sat, 04 Mar 2017 18:41:12 +0000
      Gerrit-HasComments: No

      Johan Brandhorst (Gerrit)

      unread,
      Mar 4, 2017, 1:45:58 PM3/4/17
      to Brad Fitzpatrick, golang-co...@googlegroups.com

      Johan Brandhorst posted comments on this change.

      View Change

      Patch set 1:

      Yet another note (related to the previous one): I had considered submitting a separate CL to change the httptest.Server non-TLS client to use a simple &Transport{} explicitly instead of implicitly using http.DefaultTransport, but then I thought that it's silly to make such a change just to make it more consistent with the net/http tests.

        To view, visit change 37771. To unsubscribe, visit settings.

        Gerrit-Project: go
        Gerrit-Branch: master
        Gerrit-MessageType: comment
        Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
        Gerrit-Change-Number: 37771
        Gerrit-PatchSet: 1
        Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
        Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
        Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
        Gerrit-Comment-Date: Sat, 04 Mar 2017 18:45:55 +0000
        Gerrit-HasComments: No

        Brad Fitzpatrick (Gerrit)

        unread,
        Mar 6, 2017, 5:48:37 PM3/6/17
        to Johan Brandhorst, Brad Fitzpatrick, golang-co...@googlegroups.com

        Brad Fitzpatrick posted comments on this change.

        View Change

        Patch set 1:

        (1 comment)

        • File src/net/http/client_test.go:

          • Patch Set #1, Line 224: c.Transport = new(Transport)

            This shows that there's a problem with the httptest.Server.Client() method... it should return a Client whose Transport has its idle connections auto-closed on Server.Close.

            This line shouldn't be necessary, nor should any CloseIdleConnections call here.

            Instead of:

            func NewUnstartedServer(handler http.Handler) *Server {
                    return &Server{
                            Listener: newLocalListener(),
                            Config:   &http.Server{Handler: handler},
                            client:   &http.Client{},
                    }
            }

            You should give each Server a Client with its own Transport so you can close the idle conns.

            Then delete this line and audit the rest of the lines in this CL to make sure they're simple.

            The one on line 76 is probably not necessary either. I bet the "DisableKeepAlives: true" was just there out of laziness of not wanting to call CloseIdleConnections.

        To view, visit change 37771. To unsubscribe, visit settings.

        Gerrit-Project: go
        Gerrit-Branch: master
        Gerrit-MessageType: comment
        Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
        Gerrit-Change-Number: 37771
        Gerrit-PatchSet: 1
        Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
        Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
        Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
        Gerrit-Comment-Date: Mon, 06 Mar 2017 22:48:35 +0000
        Gerrit-HasComments: Yes

        Johan Brandhorst (Gerrit)

        unread,
        Mar 7, 2017, 4:12:29 AM3/7/17
        to Brad Fitzpatrick, golang-co...@googlegroups.com

        Johan Brandhorst posted comments on this change.

        View Change

        Patch set 1:

        (1 comment)

          • Patch Set #1, Line 224: c.Transport = new(Transport)

            This shows that there's a problem with the httptest.Server.Client() method.

          • Thanks, I noted in one of my comments that I had similar thoughts as I was implementing this, and my initial pass here was mostly intended to introduce the Server.Client() method without changing other logic. I'll go ahead and make the changes you suggested and simplify this further.

        To view, visit change 37771. To unsubscribe, visit settings.

        Gerrit-Project: go
        Gerrit-Branch: master
        Gerrit-MessageType: comment
        Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
        Gerrit-Change-Number: 37771
        Gerrit-PatchSet: 1
        Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
        Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
        Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
        Gerrit-Comment-Date: Tue, 07 Mar 2017 09:12:25 +0000
        Gerrit-HasComments: Yes

        Johan Brandhorst (Gerrit)

        unread,
        Mar 7, 2017, 5:30:03 PM3/7/17
        to Brad Fitzpatrick, golang-co...@googlegroups.com

        Johan Brandhorst uploaded patch set #2 to this change.

        View Change

        net/http: use httptest.Server Client in tests
        
        After merging https://go-review.googlesource.com/c/34639/
        ,
        it was pointed out to me that a lot of tests under net/http
        could use the new functionality to simplify and unify testing.
        
        Using the httptest.Server provided Client removes the need to
        call CloseIdleConnections() on all Transports created, as it
        is automatically called on the Transport associated with the
        client.
        
        This change also changes the transport used by the non-TLS
        httptest.Server to a new http.Transport rather than using
        http.DefaultTransport implicitly.
        
        Change-Id: I9f9d15f59d72893deead5678d314388718c91821
        ---
        M src/net/http/client_test.go
        M src/net/http/fs_test.go
        M src/net/http/httptest/server.go
        M src/net/http/httputil/reverseproxy_test.go
        M src/net/http/main_test.go
        M src/net/http/npn_test.go
        M src/net/http/serve_test.go
        M src/net/http/transport_test.go
        8 files changed, 296 insertions(+), 458 deletions(-)
        
        
        diff --git a/src/net/http/client_test.go b/src/net/http/client_test.go
        index c75456a..73f2221 100644
        --- a/src/net/http/client_test.go
        +++ b/src/net/http/client_test.go
        @@ -10,7 +10,6 @@
         	"bytes"
         	"context"
         	"crypto/tls"
        -	"crypto/x509"
         	"encoding/base64"
         	"errors"
         	"fmt"
        @@ -73,7 +72,7 @@
         	ts := httptest.NewServer(robotsTxtHandler)
         	defer ts.Close()
         
        -	c := &Client{Transport: &Transport{DisableKeepAlives: true}}
        +	c := ts.Client()
         	r, err := c.Get(ts.URL)
         	var b []byte
         	if err == nil {
        @@ -220,10 +219,7 @@
         	}))
         	defer ts.Close()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         	_, err := c.Get(ts.URL)
         	if e, g := "Get /?n=10: stopped after 10 redirects", fmt.Sprintf("%v", err); e != g {
         		t.Errorf("with default client Get, expected error %q, got %q", e, g)
        @@ -252,13 +248,10 @@
         	var checkErr error
         	var lastVia []*Request
         	var lastReq *Request
        -	c = &Client{
        -		Transport: tr,
        -		CheckRedirect: func(req *Request, via []*Request) error {
        -			lastReq = req
        -			lastVia = via
        -			return checkErr
        -		},
        +	c.CheckRedirect = func(req *Request, via []*Request) error {
        +		lastReq = req
        +		lastVia = via
        +		return checkErr
         	}
         	res, err := c.Get(ts.URL)
         	if err != nil {
        @@ -313,21 +306,16 @@
         	}))
         	defer ts.Close()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -
         	ctx, cancel := context.WithCancel(context.Background())
        -	c := &Client{
        -		Transport: tr,
        -		CheckRedirect: func(req *Request, via []*Request) error {
        -			cancel()
        -			select {
        -			case <-req.Context().Done():
        -				return nil
        -			case <-time.After(5 * time.Second):
        -				return errors.New("redirected request's context never expired after root request canceled")
        -			}
        -		},
        +	c := ts.Client()
        +	c.CheckRedirect = func(req *Request, via []*Request) error {
        +		cancel()
        +		select {
        +		case <-req.Context().Done():
        +			return nil
        +		case <-time.After(5 * time.Second):
        +			return errors.New("redirected request's context never expired after root request canceled")
        +		}
         	}
         	req, _ := NewRequest("GET", ts.URL, nil)
         	req = req.WithContext(ctx)
        @@ -461,11 +449,12 @@
         	}))
         	defer ts.Close()
         
        +	c := ts.Client()
         	for _, tt := range table {
         		content := tt.redirectBody
         		req, _ := NewRequest(method, ts.URL+tt.suffix, strings.NewReader(content))
         		req.GetBody = func() (io.ReadCloser, error) { return ioutil.NopCloser(strings.NewReader(content)), nil }
        -		res, err := DefaultClient.Do(req)
        +		res, err := c.Do(req)
         
         		if err != nil {
         			t.Fatal(err)
        @@ -519,17 +508,12 @@
         	}))
         	defer ts.Close()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -
        -	c := &Client{
        -		Transport: tr,
        -		CheckRedirect: func(req *Request, via []*Request) error {
        -			if req.Response == nil {
        -				t.Error("expected non-nil Request.Response")
        -			}
        -			return ErrUseLastResponse
        -		},
        +	c := ts.Client()
        +	c.CheckRedirect = func(req *Request, via []*Request) error {
        +		if req.Response == nil {
        +			t.Error("expected non-nil Request.Response")
        +		}
        +		return ErrUseLastResponse
         	}
         	res, err := c.Get(ts.URL)
         	if err != nil {
        @@ -558,7 +542,7 @@
         		w.WriteHeader(308)
         	}))
         	defer ts.Close()
        -	c := &Client{Transport: &Transport{DisableKeepAlives: true}}
        +	c := ts.Client()
         	res, err := c.Get(ts.URL)
         	if err != nil {
         		t.Fatal(err)
        @@ -586,7 +570,7 @@
         	if err != nil {
         		t.Fatal(err)
         	}
        -	c := &Client{Transport: &Transport{DisableKeepAlives: true}}
        +	c := ts.Client()
         	req.GetBody = nil // so it can't rewind.
         	res, err := c.Do(req)
         	if err != nil {
        @@ -678,12 +662,8 @@
         	var ts *httptest.Server
         	ts = httptest.NewServer(echoCookiesRedirectHandler)
         	defer ts.Close()
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{
        -		Transport: tr,
        -		Jar:       new(TestJar),
        -	}
        +	c := ts.Client()
        +	c.Jar = new(TestJar)
         	u, _ := url.Parse(ts.URL)
         	c.Jar.SetCookies(u, []*Cookie{expectedCookies[0]})
         	resp, err := c.Get(ts.URL)
        @@ -727,13 +707,10 @@
         	}))
         	defer ts.Close()
         	jar := new(RecordingJar)
        -	c := &Client{
        -		Jar: jar,
        -		Transport: &Transport{
        -			Dial: func(_ string, _ string) (net.Conn, error) {
        -				return net.Dial("tcp", ts.Listener.Addr().String())
        -			},
        -		},
        +	c := ts.Client()
        +	c.Jar = jar
        +	c.Transport.(*Transport).Dial = func(_ string, _ string) (net.Conn, error) {
        +		return net.Dial("tcp", ts.Listener.Addr().String())
         	}
         	_, err := c.Get("http://firsthost.fake/")
         	if err != nil {
        @@ -845,7 +822,8 @@
         		}
         		return c, err
         	}
        -	c := &Client{Transport: &Transport{Dial: dialer}}
        +	c := ts.Client()
        +	c.Transport.(*Transport).Dial = dialer
         
         	_, err := c.Get(ts.URL)
         	if err != nil {
        @@ -878,14 +856,11 @@
         	// TODO(bradfitz): add tests for skipping hostname checks too?
         	// would require a new cert for testing, and probably
         	// redundant with these tests.
        +	c := ts.Client()
         	for _, insecure := range []bool{true, false} {
        -		tr := &Transport{
        -			TLSClientConfig: &tls.Config{
        -				InsecureSkipVerify: insecure,
        -			},
        +		c.Transport.(*Transport).TLSClientConfig = &tls.Config{
        +			InsecureSkipVerify: insecure,
         		}
        -		defer tr.CloseIdleConnections()
        -		c := &Client{Transport: tr}
         		res, err := c.Get(ts.URL)
         		if (err == nil) != insecure {
         			t.Errorf("insecure=%v: got unexpected err=%v", insecure, err)
        @@ -919,22 +894,6 @@
         	}
         }
         
        -func newTLSTransport(t *testing.T, ts *httptest.Server) *Transport {
        -	certs := x509.NewCertPool()
        -	for _, c := range ts.TLS.Certificates {
        -		roots, err := x509.ParseCertificates(c.Certificate[len(c.Certificate)-1])
        -		if err != nil {
        -			t.Fatalf("error parsing server's root cert: %v", err)
        -		}
        -		for _, root := range roots {
        -			certs.AddCert(root)
        -		}
        -	}
        -	return &Transport{
        -		TLSClientConfig: &tls.Config{RootCAs: certs},
        -	}
        -}
        -
         func TestClientWithCorrectTLSServerName(t *testing.T) {
         	defer afterTest(t)
         
        @@ -946,9 +905,8 @@
         	}))
         	defer ts.Close()
         
        -	trans := newTLSTransport(t, ts)
        -	trans.TLSClientConfig.ServerName = serverName
        -	c := &Client{Transport: trans}
        +	c := ts.Client()
        +	c.Transport.(*Transport).TLSClientConfig.ServerName = serverName
         	if _, err := c.Get(ts.URL); err != nil {
         		t.Fatalf("expected successful TLS connection, got error: %v", err)
         	}
        @@ -961,9 +919,8 @@
         	errc := make(chanWriter, 10) // but only expecting 1
         	ts.Config.ErrorLog = log.New(errc, "", 0)
         
        -	trans := newTLSTransport(t, ts)
        -	trans.TLSClientConfig.ServerName = "badserver"
        -	c := &Client{Transport: trans}
        +	c := ts.Client()
        +	c.Transport.(*Transport).TLSClientConfig.ServerName = "badserver"
         	_, err := c.Get(ts.URL)
         	if err == nil {
         		t.Fatalf("expected an error")
        @@ -997,13 +954,12 @@
         	}))
         	defer ts.Close()
         
        -	tr := newTLSTransport(t, ts)
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
         	tr.TLSClientConfig.ServerName = "example.com" // one of httptest's Server cert names
         	tr.Dial = func(netw, addr string) (net.Conn, error) {
         		return net.Dial(netw, ts.Listener.Addr().String())
         	}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
         	res, err := c.Get("https://some-other-host.tld/")
         	if err != nil {
         		t.Fatal(err)
        @@ -1018,13 +974,12 @@
         	}))
         	defer ts.Close()
         
        -	tr := newTLSTransport(t, ts)
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
         	tr.TLSClientConfig.CipherSuites = []uint16{tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA}
         	tr.Dial = func(netw, addr string) (net.Conn, error) {
         		return net.Dial(netw, ts.Listener.Addr().String())
         	}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
         	res, err := c.Get("https://example.com/")
         	if err != nil {
         		t.Fatal(err)
        @@ -1119,14 +1074,12 @@
         		}
         	}))
         	defer ts.Close()
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
         	req, err := NewRequest("GET", ts.URL, nil)
         	if err != nil {
         		t.Fatal(err)
         	}
         	req.URL.User = url.User(gopher)
        +	c := ts.Client()
         	resp, err := c.Do(req)
         	if err != nil {
         		t.Fatal(err)
        @@ -1503,21 +1456,17 @@
         	defer ts2.Close()
         	ts2URL = ts2.URL
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{
        -		Transport: tr,
        -		CheckRedirect: func(r *Request, via []*Request) error {
        -			want := Header{
        -				"User-Agent": []string{ua},
        -				"X-Foo":      []string{xfoo},
        -				"Referer":    []string{ts2URL},
        -			}
        -			if !reflect.DeepEqual(r.Header, want) {
        -				t.Errorf("CheckRedirect Request.Header = %#v; want %#v", r.Header, want)
        -			}
        -			return nil
        -		},
        +	c := ts1.Client()
        +	c.CheckRedirect = func(r *Request, via []*Request) error {
        +		want := Header{
        +			"User-Agent": []string{ua},
        +			"X-Foo":      []string{xfoo},
        +			"Referer":    []string{ts2URL},
        +		}
        +		if !reflect.DeepEqual(r.Header, want) {
        +			t.Errorf("CheckRedirect Request.Header = %#v; want %#v", r.Header, want)
        +		}
        +		return nil
         	}
         
         	req, _ := NewRequest("GET", ts2.URL, nil)
        @@ -1606,13 +1555,9 @@
         	}))
         	defer ts.Close()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
         	jar, _ := cookiejar.New(nil)
        -	c := &Client{
        -		Transport: tr,
        -		Jar:       jar,
        -	}
        +	c := ts.Client()
        +	c.Jar = jar
         
         	u, _ := url.Parse(ts.URL)
         	req, _ := NewRequest("GET", ts.URL, nil)
        @@ -1730,9 +1675,7 @@
         	}))
         	defer ts.Close()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -
        +	c := ts.Client()
         	for i, tt := range tests {
         		handlerc <- func(w ResponseWriter, r *Request) {
         			w.Header().Set("Location", ts.URL)
        @@ -1745,7 +1688,6 @@
         			continue
         		}
         
        -		c := &Client{Transport: tr}
         		c.CheckRedirect = func(req *Request, via []*Request) error {
         			if got, want := req.Method, tt.wantMethod; got != want {
         				return fmt.Errorf("#%d: got next method %q; want %q", i, got, want)
        @@ -1799,9 +1741,8 @@
         		w.Header().Set("X-Body-Read", fmt.Sprintf("%v, %v", n, err))
         	}))
         	defer ts.Close()
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
         
         	// Do one initial successful request to create an idle TCP connection
         	// for the subsequent request to reuse. (The Transport only retries
        diff --git a/src/net/http/fs_test.go b/src/net/http/fs_test.go
        index 1de1cd5..e12350e 100644
        --- a/src/net/http/fs_test.go
        +++ b/src/net/http/fs_test.go
        @@ -74,6 +74,7 @@
         		ServeFile(w, r, "testdata/file")
         	}))
         	defer ts.Close()
        +	c := ts.Client()
         
         	var err error
         
        @@ -91,7 +92,7 @@
         	req.Method = "GET"
         
         	// straight GET
        -	_, body := getBody(t, "straight get", req)
        +	_, body := getBody(t, "straight get", req, c)
         	if !bytes.Equal(body, file) {
         		t.Fatalf("body mismatch: got %q, want %q", body, file)
         	}
        @@ -102,7 +103,7 @@
         		if rt.r != "" {
         			req.Header.Set("Range", rt.r)
         		}
        -		resp, body := getBody(t, fmt.Sprintf("range test %q", rt.r), req)
        +		resp, body := getBody(t, fmt.Sprintf("range test %q", rt.r), req, c)
         		if resp.StatusCode != rt.code {
         			t.Errorf("range=%q: StatusCode=%d, want %d", rt.r, resp.StatusCode, rt.code)
         		}
        @@ -704,7 +705,8 @@
         	req, _ := NewRequest("GET", ts.URL, nil)
         	req.Header.Set("If-Modified-Since", lastMod)
         
        -	res, err = DefaultClient.Do(req)
        +	c := ts.Client()
        +	res, err = c.Do(req)
         	if err != nil {
         		t.Fatal(err)
         	}
        @@ -716,7 +718,7 @@
         	// Advance the index.html file's modtime, but not the directory's.
         	indexFile.modtime = indexFile.modtime.Add(1 * time.Hour)
         
        -	res, err = DefaultClient.Do(req)
        +	res, err = c.Do(req)
         	if err != nil {
         		t.Fatal(err)
         	}
        @@ -995,7 +997,9 @@
         		for k, v := range tt.reqHeader {
         			req.Header.Set(k, v)
         		}
        -		res, err := DefaultClient.Do(req)
        +
        +		c := ts.Client()
        +		res, err := c.Do(req)
         		if err != nil {
         			t.Fatal(err)
         		}
        @@ -1050,8 +1054,9 @@
         	}
         	ts := httptest.NewServer(FileServer(fs))
         	defer ts.Close()
        +	c := ts.Client()
         	for _, code := range []int{403, 404, 500} {
        -		res, err := DefaultClient.Get(fmt.Sprintf("%s/%d", ts.URL, code))
        +		res, err := c.Get(fmt.Sprintf("%s/%d", ts.URL, code))
         		if err != nil {
         			t.Errorf("Error fetching /%d: %v", code, err)
         			continue
        @@ -1125,8 +1130,8 @@
         	}
         }
         
        -func getBody(t *testing.T, testName string, req Request) (*Response, []byte) {
        -	r, err := DefaultClient.Do(&req)
        +func getBody(t *testing.T, testName string, req Request, client *Client) (*Response, []byte) {
        +	r, err := client.Do(&req)
         	if err != nil {
         		t.Fatalf("%s: for URL %q, send error: %v", testName, req.URL.String(), err)
         	}
        diff --git a/src/net/http/httptest/server.go b/src/net/http/httptest/server.go
        index 56ad18e..b5b18c7 100644
        --- a/src/net/http/httptest/server.go
        +++ b/src/net/http/httptest/server.go
        @@ -93,7 +93,9 @@
         	return &Server{
         		Listener: newLocalListener(),
         		Config:   &http.Server{Handler: handler},
        -		client:   &http.Client{},
        +		client: &http.Client{
        +			Transport: &http.Transport{},
        +		},
         	}
         }
         
        diff --git a/src/net/http/httputil/reverseproxy_test.go b/src/net/http/httputil/reverseproxy_test.go
        index 9153508..008e4e7 100644
        --- a/src/net/http/httputil/reverseproxy_test.go
        +++ b/src/net/http/httputil/reverseproxy_test.go
        @@ -79,6 +79,7 @@
         	proxyHandler.ErrorLog = log.New(ioutil.Discard, "", 0) // quiet for tests
         	frontend := httptest.NewServer(proxyHandler)
         	defer frontend.Close()
        +	frontendClient := frontend.Client()
         
         	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
         	getReq.Host = "some-name"
        @@ -86,7 +87,7 @@
         	getReq.Header.Set("Proxy-Connection", "should be deleted")
         	getReq.Header.Set("Upgrade", "foo")
         	getReq.Close = true
        -	res, err := http.DefaultClient.Do(getReq)
        +	res, err := frontendClient.Do(getReq)
         	if err != nil {
         		t.Fatalf("Get: %v", err)
         	}
        @@ -126,7 +127,7 @@
         	// a response results in a StatusBadGateway.
         	getReq, _ = http.NewRequest("GET", frontend.URL+"/?mode=hangup", nil)
         	getReq.Close = true
        -	res, err = http.DefaultClient.Do(getReq)
        +	res, err = frontendClient.Do(getReq)
         	if err != nil {
         		t.Fatal(err)
         	}
        @@ -172,7 +173,7 @@
         	getReq.Header.Set("Connection", "Upgrade, "+fakeConnectionToken)
         	getReq.Header.Set("Upgrade", "original value")
         	getReq.Header.Set(fakeConnectionToken, "should be deleted")
        -	res, err := http.DefaultClient.Do(getReq)
        +	res, err := frontend.Client().Do(getReq)
         	if err != nil {
         		t.Fatalf("Get: %v", err)
         	}
        @@ -220,7 +221,7 @@
         	getReq.Header.Set("Connection", "close")
         	getReq.Header.Set("X-Forwarded-For", prevForwardedFor)
         	getReq.Close = true
        -	res, err := http.DefaultClient.Do(getReq)
        +	res, err := frontend.Client().Do(getReq)
         	if err != nil {
         		t.Fatalf("Get: %v", err)
         	}
        @@ -259,7 +260,7 @@
         		frontend := httptest.NewServer(NewSingleHostReverseProxy(backendURL))
         		req, _ := http.NewRequest("GET", frontend.URL+tt.reqSuffix, nil)
         		req.Close = true
        -		res, err := http.DefaultClient.Do(req)
        +		res, err := frontend.Client().Do(req)
         		if err != nil {
         			t.Fatalf("%d. Get: %v", i, err)
         		}
        @@ -295,7 +296,7 @@
         
         	req, _ := http.NewRequest("GET", frontend.URL, nil)
         	req.Close = true
        -	res, err := http.DefaultClient.Do(req)
        +	res, err := frontend.Client().Do(req)
         	if err != nil {
         		t.Fatalf("Get: %v", err)
         	}
        @@ -349,13 +350,14 @@
         
         	frontend := httptest.NewServer(proxyHandler)
         	defer frontend.Close()
        +	frontendClient := frontend.Client()
         
         	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
         	go func() {
         		<-reqInFlight
        -		http.DefaultTransport.(*http.Transport).CancelRequest(getReq)
        +		frontendClient.Transport.(*http.Transport).CancelRequest(getReq)
         	}()
        -	res, err := http.DefaultClient.Do(getReq)
        +	res, err := frontendClient.Do(getReq)
         	if res != nil {
         		t.Errorf("got response %v; want nil", res.Status)
         	}
        @@ -363,7 +365,7 @@
         		// This should be an error like:
         		// Get http://127.0.0.1:58079: read tcp 127.0.0.1:58079:
         		//    use of closed network connection
        -		t.Error("DefaultClient.Do() returned nil error; want non-nil error")
        +		t.Error("Server.Client().Do() returned nil error; want non-nil error")
         	}
         }
         
        @@ -428,11 +430,12 @@
         	proxyHandler.ErrorLog = log.New(ioutil.Discard, "", 0) // quiet for tests
         	frontend := httptest.NewServer(proxyHandler)
         	defer frontend.Close()
        +	frontendClient := frontend.Client()
         
         	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
         	getReq.Header.Set("User-Agent", explicitUA)
         	getReq.Close = true
        -	res, err := http.DefaultClient.Do(getReq)
        +	res, err := frontendClient.Do(getReq)
         	if err != nil {
         		t.Fatalf("Get: %v", err)
         	}
        @@ -441,7 +444,7 @@
         	getReq, _ = http.NewRequest("GET", frontend.URL+"/noua", nil)
         	getReq.Header.Set("User-Agent", "")
         	getReq.Close = true
        -	res, err = http.DefaultClient.Do(getReq)
        +	res, err = frontendClient.Do(getReq)
         	if err != nil {
         		t.Fatalf("Get: %v", err)
         	}
        @@ -493,7 +496,7 @@
         
         	req, _ := http.NewRequest("GET", frontend.URL, nil)
         	req.Close = true
        -	res, err := http.DefaultClient.Do(req)
        +	res, err := frontend.Client().Do(req)
         	if err != nil {
         		t.Fatalf("Get: %v", err)
         	}
        @@ -540,7 +543,7 @@
         	defer frontend.Close()
         
         	postReq, _ := http.NewRequest("POST", frontend.URL, bytes.NewReader(requestBody))
        -	res, err := http.DefaultClient.Do(postReq)
        +	res, err := frontend.Client().Do(postReq)
         	if err != nil {
         		t.Fatalf("Do: %v", err)
         	}
        @@ -573,7 +576,7 @@
         	frontend := httptest.NewServer(proxyHandler)
         	defer frontend.Close()
         
        -	res, err := http.DefaultClient.Get(frontend.URL)
        +	res, err := frontend.Client().Get(frontend.URL)
         	if err != nil {
         		t.Fatal(err)
         	}
        diff --git a/src/net/http/main_test.go b/src/net/http/main_test.go
        index 438bd2e..fc0437e 100644
        --- a/src/net/http/main_test.go
        +++ b/src/net/http/main_test.go
        @@ -151,7 +151,3 @@
         	}
         	return err
         }
        -
        -func closeClient(c *http.Client) {
        -	c.Transport.(*http.Transport).CloseIdleConnections()
        -}
        diff --git a/src/net/http/npn_test.go b/src/net/http/npn_test.go
        index 4c1f6b5..618bdbe 100644
        --- a/src/net/http/npn_test.go
        +++ b/src/net/http/npn_test.go
        @@ -8,6 +8,7 @@
         	"bufio"
         	"bytes"
         	"crypto/tls"
        +	"crypto/x509"
         	"fmt"
         	"io"
         	"io/ioutil"
        @@ -43,10 +44,7 @@
         
         	// Normal request, without NPN.
         	{
        -		tr := newTLSTransport(t, ts)
        -		defer tr.CloseIdleConnections()
        -		c := &Client{Transport: tr}
        -
        +		c := ts.Client()
         		res, err := c.Get(ts.URL)
         		if err != nil {
         			t.Fatal(err)
        @@ -63,11 +61,18 @@
         	// Request to an advertised but unhandled NPN protocol.
         	// Server will hang up.
         	{
        -		tr := newTLSTransport(t, ts)
        -		tr.TLSClientConfig.NextProtos = []string{"unhandled-proto"}
        +		certPool := x509.NewCertPool()
        +		certPool.AddCert(ts.Certificate())
        +		tr := &Transport{
        +			TLSClientConfig: &tls.Config{
        +				RootCAs:    certPool,
        +				NextProtos: []string{"unhandled-proto"},
        +			},
        +		}
         		defer tr.CloseIdleConnections()
        -		c := &Client{Transport: tr}
        -
        +		c := &Client{
        +			Transport: tr,
        +		}
         		res, err := c.Get(ts.URL)
         		if err == nil {
         			defer res.Body.Close()
        @@ -80,7 +85,8 @@
         	// Request using the "tls-0.9" protocol, which we register here.
         	// It is HTTP/0.9 over TLS.
         	{
        -		tlsConfig := newTLSTransport(t, ts).TLSClientConfig
        +		c := ts.Client()
        +		tlsConfig := c.Transport.(*Transport).TLSClientConfig
         		tlsConfig.NextProtos = []string{"tls-0.9"}
         		conn, err := tls.Dial("tcp", ts.Listener.Addr().String(), tlsConfig)
         		if err != nil {
        diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go
        index 8092cc1..5c63db0 100644
        --- a/src/net/http/serve_test.go
        +++ b/src/net/http/serve_test.go
        @@ -474,9 +474,8 @@
         	defer ts.Close()
         
         	// Hit the HTTP server successfully.
        -	tr := &Transport{DisableKeepAlives: true} // they interfere with this test
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
        +	//c.Transport = &Transport{DisableKeepAlives: true} // they interfere with this test
         	r, err := c.Get(ts.URL)
         	if err != nil {
         		t.Fatalf("http Get #1: %v", err)
        @@ -548,12 +547,10 @@
         	ts.StartTLS()
         	defer ts.Close()
         
        -	tr := newTLSTransport(t, ts)
        -	defer tr.CloseIdleConnections()
        -	if err := ExportHttp2ConfigureTransport(tr); err != nil {
        +	c := ts.Client()
        +	if err := ExportHttp2ConfigureTransport(c.Transport.(*Transport)); err != nil {
         		t.Fatal(err)
         	}
        -	c := &Client{Transport: tr}
         
         	for i := 1; i <= 3; i++ {
         		req, err := NewRequest("GET", ts.URL, nil)
        @@ -608,9 +605,7 @@
         	ts.Start()
         	defer ts.Close()
         
        -	tr := &Transport{DisableKeepAlives: false}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         
         	errc := make(chan error)
         	go func() {
        @@ -671,8 +666,7 @@
         	ts := httptest.NewServer(handler)
         	defer ts.Close()
         
        -	c := &Client{Transport: new(Transport)}
        -	defer closeClient(c)
        +	c := ts.Client()
         
         	// Note: this relies on the assumption (which is true) that
         	// Get sends HTTP/1.1 or greater requests. Otherwise the
        @@ -949,9 +943,8 @@
         	ts.Start()
         	defer ts.Close()
         
        -	tr := &Transport{DisableKeepAlives: true}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr, Timeout: time.Second}
        +	c := ts.Client()
        +	c.Timeout = time.Second
         
         	fetch := func(num int, response chan<- string) {
         		resp, err := c.Get(ts.URL)
        @@ -1022,9 +1015,7 @@
         	}))
         	defer ts.Close()
         
        -	c := &Client{Transport: new(Transport)}
        -	defer closeClient(c)
        -
        +	c := ts.Client()
         	res, err := c.Get(ts.URL)
         	if err != nil {
         		t.Fatalf("Get error: %v", err)
        @@ -1145,12 +1136,7 @@
         			t.Errorf("expected test TLS server to start with https://, got %q", ts.URL)
         			return
         		}
        -		noVerifyTransport := &Transport{
        -			TLSClientConfig: &tls.Config{
        -				InsecureSkipVerify: true,
        -			},
        -		}
        -		client := &Client{Transport: noVerifyTransport}
        +		client := ts.Client()
         		res, err := client.Get(ts.URL)
         		if err != nil {
         			t.Error(err)
        @@ -1967,8 +1953,7 @@
         	ts := httptest.NewServer(TimeoutHandler(delayHi, 20*time.Millisecond, ""))
         	defer ts.Close()
         
        -	c := &Client{Transport: new(Transport)}
        -	defer closeClient(c)
        +	c := ts.Client()
         
         	var wg sync.WaitGroup
         	gate := make(chan bool, 10)
        @@ -2011,8 +1996,8 @@
         	if testing.Short() {
         		n = 10
         	}
        -	c := &Client{Transport: new(Transport)}
        -	defer closeClient(c)
        +
        +	c := ts.Client()
         	for i := 0; i < n; i++ {
         		gate <- true
         		wg.Add(1)
        @@ -2099,8 +2084,7 @@
         	ts := httptest.NewServer(TimeoutHandler(handler, timeout, ""))
         	defer ts.Close()
         
        -	c := &Client{Transport: new(Transport)}
        -	defer closeClient(c)
        +	c := ts.Client()
         
         	// Issue was caused by the timeout handler starting the timer when
         	// was created, not when the request. So wait for more than the timeout
        @@ -2127,8 +2111,7 @@
         	ts := httptest.NewServer(TimeoutHandler(handler, timeout, ""))
         	defer ts.Close()
         
        -	c := &Client{Transport: new(Transport)}
        -	defer closeClient(c)
        +	c := ts.Client()
         
         	res, err := c.Get(ts.URL)
         	if err != nil {
        @@ -2364,9 +2347,7 @@
         	ts.Start()
         	defer ts.Close()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         	res, err := c.Get(ts.URL)
         	if err != nil {
         		t.Fatal(err)
        @@ -2411,8 +2392,7 @@
         	ts := httptest.NewServer(StripPrefix("/foo", h))
         	defer ts.Close()
         
        -	c := &Client{Transport: new(Transport)}
        -	defer closeClient(c)
        +	c := ts.Client()
         
         	res, err := c.Get(ts.URL + "/foo/bar")
         	if err != nil {
        @@ -3654,9 +3634,7 @@
         	}
         	ts.Start()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         
         	mustGet := func(url string, headers ...string) {
         		req, err := NewRequest("GET", url, nil)
        @@ -4491,15 +4469,9 @@
         	b.ResetTimer()
         	b.SetParallelism(parallelism)
         	b.RunParallel(func(pb *testing.PB) {
        -		noVerifyTransport := &Transport{
        -			TLSClientConfig: &tls.Config{
        -				InsecureSkipVerify: true,
        -			},
        -		}
        -		defer noVerifyTransport.CloseIdleConnections()
        -		client := &Client{Transport: noVerifyTransport}
        +		c := ts.Client()
         		for pb.Next() {
        -			res, err := client.Get(ts.URL)
        +			res, err := c.Get(ts.URL)
         			if err != nil {
         				b.Logf("Get: %v", err)
         				continue
        @@ -4934,10 +4906,7 @@
         	ts.Config.IdleTimeout = 2 * time.Second
         	ts.Start()
         	defer ts.Close()
        -
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         
         	get := func() string {
         		res, err := c.Get(ts.URL)
        @@ -4998,9 +4967,8 @@
         	}))
         	defer ts.Close()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
         
         	get := func() string { return get(t, c, ts.URL) }
         
        @@ -5119,9 +5087,7 @@
         	ts.Start()
         	defer ts.Close()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         
         	res, err := c.Get(ts.URL)
         	if err != nil {
        diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go
        index cb315f1..3a1ce57 100644
        --- a/src/net/http/transport_test.go
        +++ b/src/net/http/transport_test.go
        @@ -131,11 +131,9 @@
         	ts := httptest.NewServer(hostPortHandler)
         	defer ts.Close()
         
        +	c := ts.Client()
         	for _, disableKeepAlive := range []bool{false, true} {
        -		tr := &Transport{DisableKeepAlives: disableKeepAlive}
        -		defer tr.CloseIdleConnections()
        -		c := &Client{Transport: tr}
        -
        +		c.Transport.(*Transport).DisableKeepAlives = disableKeepAlive
         		fetch := func(n int) string {
         			res, err := c.Get(ts.URL)
         			if err != nil {
        @@ -166,12 +164,11 @@
         
         	connSet, testDial := makeTestDial(t)
         
        -	for _, connectionClose := range []bool{false, true} {
        -		tr := &Transport{
        -			Dial: testDial,
        -		}
        -		c := &Client{Transport: tr}
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
        +	tr.Dial = testDial
         
        +	for _, connectionClose := range []bool{false, true} {
         		fetch := func(n int) string {
         			req := new(Request)
         			var err error
        @@ -217,12 +214,10 @@
         
         	connSet, testDial := makeTestDial(t)
         
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
        +	tr.Dial = testDial
         	for _, connectionClose := range []bool{false, true} {
        -		tr := &Transport{
        -			Dial: testDial,
        -		}
        -		c := &Client{Transport: tr}
        -
         		fetch := func(n int) string {
         			req := new(Request)
         			var err error
        @@ -273,10 +268,9 @@
         	ts := httptest.NewServer(hostPortHandler)
         	defer ts.Close()
         
        -	tr := &Transport{
        -		DisableKeepAlives: true,
        -	}
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
        +	c.Transport.(*Transport).DisableKeepAlives = true
        +
         	res, err := c.Get(ts.URL)
         	if err != nil {
         		t.Fatal(err)
        @@ -291,9 +285,8 @@
         	defer afterTest(t)
         	ts := httptest.NewServer(hostPortHandler)
         	defer ts.Close()
        -
        -	tr := &Transport{DisableKeepAlives: false}
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
         
         	if e, g := 0, len(tr.IdleConnKeysForTesting()); e != g {
         		t.Errorf("After CloseIdleConnections expected %d idle conn cache keys; got %d", e, g)
        @@ -385,9 +378,11 @@
         		}
         	}))
         	defer ts.Close()
        +
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
         	maxIdleConnsPerHost := 2
        -	tr := &Transport{DisableKeepAlives: false, MaxIdleConnsPerHost: maxIdleConnsPerHost}
        -	c := &Client{Transport: tr}
        +	tr.MaxIdleConnsPerHost = maxIdleConnsPerHost
         
         	// Start 3 outstanding requests and wait for the server to get them.
         	// Their responses will hang until we write to resch, though.
        @@ -450,9 +445,8 @@
         	}))
         	defer ts.Close()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
         
         	doReq := func(name string) string {
         		// Do a POST instead of a GET to prevent the Transport's
        @@ -496,9 +490,7 @@
         	defer afterTest(t)
         	ts := httptest.NewServer(hostPortHandler)
         	defer ts.Close()
        -
        -	tr := &Transport{}
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         
         	fetch := func(n, retries int) string {
         		condFatalf := func(format string, arg ...interface{}) {
        @@ -564,10 +556,7 @@
         		conn.Close()
         	}))
         	defer ts.Close()
        -
        -	tr := &Transport{DisableKeepAlives: false}
        -	c := &Client{Transport: tr}
        -	defer tr.CloseIdleConnections()
        +	c := ts.Client()
         
         	// Do a bunch of traffic from different goroutines. Send to activityc
         	// after each request completes, regardless of whether it failed.
        @@ -620,9 +609,8 @@
         		w.WriteHeader(200)
         	}))
         	defer ts.Close()
        +	c := ts.Client()
         
        -	tr := &Transport{DisableKeepAlives: false}
        -	c := &Client{Transport: tr}
         	for i := 0; i < 2; i++ {
         		res, err := c.Head(ts.URL)
         		if err != nil {
        @@ -656,10 +644,7 @@
         		w.WriteHeader(200)
         	}))
         	defer ts.Close()
        -
        -	tr := &Transport{DisableKeepAlives: false}
        -	c := &Client{Transport: tr}
        -	defer tr.CloseIdleConnections()
        +	c := ts.Client()
         
         	// Ensure that we wait for the readLoop to complete before
         	// calling Head again
        @@ -720,6 +705,7 @@
         		}
         	}))
         	defer ts.Close()
        +	tr := ts.Client().Transport.(*Transport)
         
         	for i, test := range roundTripTests {
         		// Test basic request (no accept-encoding)
        @@ -727,7 +713,7 @@
         		if test.accept != "" {
         			req.Header.Set("Accept-Encoding", test.accept)
         		}
        -		res, err := DefaultTransport.RoundTrip(req)
        +		res, err := tr.RoundTrip(req)
         		var body []byte
         		if test.compressed {
         			var r *gzip.Reader
        @@ -792,10 +778,9 @@
         		gz.Close()
         	}))
         	defer ts.Close()
        +	c := ts.Client()
         
         	for _, chunked := range []string{"1", "0"} {
        -		c := &Client{Transport: &Transport{}}
        -
         		// First fetch something large, but only read some of it.
         		res, err := c.Get(ts.URL + "/?body=large&chunked=" + chunked)
         		if err != nil {
        @@ -845,7 +830,6 @@
         	}
         
         	// And a HEAD request too, because they're always weird.
        -	c := &Client{Transport: &Transport{}}
         	res, err := c.Head(ts.URL)
         	if err != nil {
         		t.Fatalf("Head: %v", err)
        @@ -915,11 +899,13 @@
         		{path: "/timeout", body: []byte("hello"), sent: 5, status: 200},   // Timeout exceeded and entire body is sent.
         	}
         
        +	c := ts.Client()
         	for i, v := range tests {
        -		tr := &Transport{ExpectContinueTimeout: 2 * time.Second}
        +		tr := &Transport{
        +			ExpectContinueTimeout: 2 * time.Second,
        +		}
         		defer tr.CloseIdleConnections()
        -		c := &Client{Transport: tr}
        -
        +		c.Transport = tr
         		body := bytes.NewReader(v.body)
         		req, err := NewRequest("PUT", ts.URL+v.path, body)
         		if err != nil {
        @@ -1016,7 +1002,8 @@
         	if err != nil {
         		t.Fatal(err)
         	}
        -	c := &Client{Transport: &Transport{Proxy: ProxyURL(pu)}}
        +	c := ts.Client()
        +	c.Transport.(*Transport).Proxy = ProxyURL(pu)
         	if _, err := c.Head(ts.URL); err != nil {
         		t.Error(err)
         	}
        @@ -1052,7 +1039,8 @@
         	if err != nil {
         		t.Fatal(err)
         	}
        -	c := &Client{Transport: &Transport{Proxy: ProxyURL(pu)}}
        +	c := ts.Client()
        +	c.Transport.(*Transport).Proxy = ProxyURL(pu)
         	if _, err := c.Head(ts.URL); err != nil {
         		t.Error(err)
         	}
        @@ -1122,9 +1110,7 @@
         	}))
         	defer ts.Close()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         	res, err := c.Get(ts.URL)
         	if err != nil {
         		t.Fatal(err)
        @@ -1152,9 +1138,7 @@
         	}))
         	defer ts.Close()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         	res, err := c.Get(ts.URL)
         	if err != nil {
         		t.Fatal(err)
        @@ -1195,9 +1179,7 @@
         		w.WriteHeader(204)
         	}))
         	defer ts.Close()
        -
        -	tr := &Transport{}
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         
         	n0 := runtime.NumGoroutine()
         
        @@ -1239,7 +1221,6 @@
         		<-didReqCh
         	}
         
        -	tr.CloseIdleConnections()
         	nfinal := waitNumGoroutine(n0 + 5)
         
         	growth := nfinal - n0
        @@ -1260,9 +1241,7 @@
         	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
         	}))
         	defer ts.Close()
        -
        -	tr := &Transport{}
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         
         	n0 := runtime.NumGoroutine()
         	body := []byte("Hello")
        @@ -1278,7 +1257,6 @@
         		}
         	}
         	nhigh := runtime.NumGoroutine()
        -	tr.CloseIdleConnections()
         	nfinal := waitNumGoroutine(n0 + 5)
         
         	growth := nfinal - n0
        @@ -1294,8 +1272,7 @@
         // This used to crash; https://golang.org/issue/3266
         func TestTransportIdleConnCrash(t *testing.T) {
         	defer afterTest(t)
        -	tr := &Transport{}
        -	c := &Client{Transport: tr}
        +	var tr *Transport
         
         	unblockCh := make(chan bool, 1)
         	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
        @@ -1303,6 +1280,8 @@
         		tr.CloseIdleConnections()
         	}))
         	defer ts.Close()
        +	c := ts.Client()
        +	tr = c.Transport.(*Transport)
         
         	didreq := make(chan bool)
         	go func() {
        @@ -1332,8 +1311,7 @@
         		}
         	}))
         	defer ts.Close()
        -	tr := &Transport{}
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         	res, err := c.Get(ts.URL)
         	if err != nil {
         		t.Fatal(err)
        @@ -1358,8 +1336,7 @@
         		Error(w, deniedMsg, StatusUnauthorized)
         	}))
         	defer ts.Close()
        -	tr := &Transport{}
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         	res, err := c.Post(ts.URL, "application/octet-stream", neverEnding('a'))
         	if err != nil {
         		t.Errorf("Post: %v", err)
        @@ -1383,8 +1360,8 @@
         	}))
         	defer ts.Close()
         
        +	c := ts.Client()
         	for _, closeBody := range []bool{true, false} {
        -		c := &Client{Transport: &Transport{}}
         		const n = 4
         		for i := 1; i <= n; i++ {
         			res, err := c.Get(ts.URL)
        @@ -1424,10 +1401,7 @@
         	SetPendingDialHooks(func() { wg.Add(1) }, wg.Done)
         	defer SetPendingDialHooks(nil, nil)
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         	reqs := make(chan string)
         	defer close(reqs)
         
        @@ -1469,23 +1443,20 @@
         		io.Copy(w, neverEnding('a'))
         	})
         	ts := httptest.NewServer(mux)
        +	defer ts.Close()
         	timeout := 100 * time.Millisecond
         
        -	client := &Client{
        -		Transport: &Transport{
        -			Dial: func(n, addr string) (net.Conn, error) {
        -				conn, err := net.Dial(n, addr)
        -				if err != nil {
        -					return nil, err
        -				}
        -				conn.SetDeadline(time.Now().Add(timeout))
        -				if debug {
        -					conn = NewLoggingConn("client", conn)
        -				}
        -				return conn, nil
        -			},
        -			DisableKeepAlives: true,
        -		},
        +	c := ts.Client()
        +	c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
        +		conn, err := net.Dial(n, addr)
        +		if err != nil {
        +			return nil, err
        +		}
        +		conn.SetDeadline(time.Now().Add(timeout))
        +		if debug {
        +			conn = NewLoggingConn("client", conn)
        +		}
        +		return conn, nil
         	}
         
         	getFailed := false
        @@ -1497,7 +1468,7 @@
         		if debug {
         			println("run", i+1, "of", nRuns)
         		}
        -		sres, err := client.Get(ts.URL + "/get")
        +		sres, err := c.Get(ts.URL + "/get")
         		if err != nil {
         			if !getFailed {
         				// Make the timeout longer, once.
        @@ -1519,7 +1490,6 @@
         	if debug {
         		println("tests complete; waiting for handlers to finish")
         	}
        -	ts.Close()
         }
         
         func TestIssue4191_InfiniteGetToPutTimeout(t *testing.T) {
        @@ -1537,21 +1507,17 @@
         	ts := httptest.NewServer(mux)
         	timeout := 100 * time.Millisecond
         
        -	client := &Client{
        -		Transport: &Transport{
        -			Dial: func(n, addr string) (net.Conn, error) {
        -				conn, err := net.Dial(n, addr)
        -				if err != nil {
        -					return nil, err
        -				}
        -				conn.SetDeadline(time.Now().Add(timeout))
        -				if debug {
        -					conn = NewLoggingConn("client", conn)
        -				}
        -				return conn, nil
        -			},
        -			DisableKeepAlives: true,
        -		},
        +	c := ts.Client()
        +	c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
        +		conn, err := net.Dial(n, addr)
        +		if err != nil {
        +			return nil, err
        +		}
        +		conn.SetDeadline(time.Now().Add(timeout))
        +		if debug {
        +			conn = NewLoggingConn("client", conn)
        +		}
        +		return conn, nil
         	}
         
         	getFailed := false
        @@ -1563,7 +1529,7 @@
         		if debug {
         			println("run", i+1, "of", nRuns)
         		}
        -		sres, err := client.Get(ts.URL + "/get")
        +		sres, err := c.Get(ts.URL + "/get")
         		if err != nil {
         			if !getFailed {
         				// Make the timeout longer, once.
        @@ -1577,7 +1543,7 @@
         			break
         		}
         		req, _ := NewRequest("PUT", ts.URL+"/put", sres.Body)
        -		_, err = client.Do(req)
        +		_, err = c.Do(req)
         		if err == nil {
         			sres.Body.Close()
         			t.Errorf("Unexpected successful PUT")
        @@ -1609,11 +1575,8 @@
         	ts := httptest.NewServer(mux)
         	defer ts.Close()
         
        -	tr := &Transport{
        -		ResponseHeaderTimeout: 500 * time.Millisecond,
        -	}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
        +	c.Transport.(*Transport).ResponseHeaderTimeout = 500 * time.Millisecond
         
         	tests := []struct {
         		path    string
        @@ -1680,9 +1643,8 @@
         	defer ts.Close()
         	defer close(unblockc)
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
         
         	req, _ := NewRequest("GET", ts.URL, nil)
         	res, err := c.Do(req)
        @@ -1790,9 +1752,8 @@
         	defer ts.Close()
         	defer close(unblockc)
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
         
         	req, _ := NewRequest("GET", ts.URL, nil)
         	ch := make(chan struct{})
        @@ -1849,9 +1810,7 @@
         	defer ts.Close()
         	defer close(unblockc)
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
         
         	req, _ := NewRequest("GET", ts.URL, nil)
         	if withCtx {
        @@ -1939,9 +1898,8 @@
         	}))
         	defer ts.Close()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
         
         	req, _ := NewRequest("GET", ts.URL, nil)
         	defer tr.CancelRequest(req)
        @@ -2061,18 +2019,12 @@
         	defer ts.Close()
         
         	dialGate := make(chan bool, 1)
        -	tr := &Transport{
        -		Dial: func(n, addr string) (net.Conn, error) {
        -			if <-dialGate {
        -				return net.Dial(n, addr)
        -			}
        -			return nil, errors.New("manually closed")
        -		},
        -		DisableKeepAlives: false,
        -	}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{
        -		Transport: tr,
        +	c := ts.Client()
        +	c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
        +		if <-dialGate {
        +			return net.Dial(n, addr)
        +		}
        +		return nil, errors.New("manually closed")
         	}
         
         	dialGate <- true // only allow one dial
        @@ -2326,14 +2278,11 @@
         	SetReadLoopBeforeNextReadHook(func() { didRead <- true })
         	defer SetReadLoopBeforeNextReadHook(nil)
         
        -	tr := &Transport{
        -		Dial: func(netw, addr string) (net.Conn, error) {
        -			return net.Dial(netw, ts.Listener.Addr().String())
        -		},
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
        +	tr.Dial = func(netw, addr string) (net.Conn, error) {
        +		return net.Dial(netw, ts.Listener.Addr().String())
         	}
        -	defer tr.CloseIdleConnections()
        -
        -	c := &Client{Transport: tr}
         
         	// First, without keep-alives.
         	for _, disableKeep := range []bool{true, false} {
        @@ -2376,13 +2325,11 @@
         	}))
         	defer ts.Close()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	cl := &Client{Transport: tr}
        +	c := ts.Client()
         
         	closes := 0
         
        -	res, err := cl.Post(ts.URL, "text/plain", countCloseReader{&closes, strings.NewReader("hello")})
        +	res, err := c.Post(ts.URL, "text/plain", countCloseReader{&closes, strings.NewReader("hello")})
         	if err != nil {
         		t.Fatal(err)
         	}
        @@ -2468,20 +2415,16 @@
         		fmt.Fprintf(w, "hello")
         	}))
         	defer ts.Close()
        -	tr := &Transport{
        -		TLSClientConfig: &tls.Config{
        -			InsecureSkipVerify: true,
        -		},
        -	}
        -	defer tr.CloseIdleConnections()
        -	client := &Client{Transport: tr}
        +
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
         
         	var nSuccess = 0
         	var errs []error
         	const trials = 20
         	for i := 0; i < trials; i++ {
         		tr.CloseIdleConnections()
        -		res, err := client.Get(ts.URL + "/keep-alive-then-die")
        +		res, err := c.Get(ts.URL + "/keep-alive-then-die")
         		if err != nil {
         			t.Fatal(err)
         		}
        @@ -2496,7 +2439,7 @@
         
         		// Now try again and see if we successfully
         		// pick a new connection.
        -		res, err = client.Get(ts.URL + "/")
        +		res, err = c.Get(ts.URL + "/")
         		if err != nil {
         			errs = append(errs, err)
         			continue
        @@ -2575,22 +2518,20 @@
         		go io.Copy(ioutil.Discard, conn)
         	}))
         	defer ts.Close()
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	client := &Client{Transport: tr}
        +	c := ts.Client()
         
         	const bodySize = 256 << 10
         	finalBit := make(byteFromChanReader, 1)
         	req, _ := NewRequest("POST", ts.URL, io.MultiReader(io.LimitReader(neverEnding('x'), bodySize-1), finalBit))
         	req.ContentLength = bodySize
        -	res, err := client.Do(req)
        +	res, err := c.Do(req)
         	if err := wantBody(res, err, "foo"); err != nil {
         		t.Errorf("POST response: %v", err)
         	}
         	donec := make(chan bool)
         	go func() {
         		defer close(donec)
        -		res, err = client.Get(ts.URL)
        +		res, err = c.Get(ts.URL)
         		if err := wantBody(res, err, "bar"); err != nil {
         			t.Errorf("GET response: %v", err)
         			return
        @@ -2622,10 +2563,9 @@
         		conn.Close()
         	}))
         	defer ts.Close()
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	cl := &Client{Transport: tr}
        -	res, err := cl.Get(ts.URL)
        +	c := ts.Client()
        +
        +	res, err := c.Get(ts.URL)
         	if err != nil {
         		t.Fatalf("Get: %v", err)
         	}
        @@ -2686,29 +2626,26 @@
         	defer ts.Close()
         
         	var writeNumAtomic int32
        -	tr := &Transport{
        -		Dial: func(network, addr string) (net.Conn, error) {
        -			logf("Dial")
        -			c, err := net.Dial(network, ts.Listener.Addr().String())
        -			if err != nil {
        -				logf("Dial error: %v", err)
        -				return nil, err
        -			}
        -			return &writerFuncConn{
        -				Conn: c,
        -				write: func(p []byte) (n int, err error) {
        -					if atomic.AddInt32(&writeNumAtomic, 1) == 2 {
        -						logf("intentional write failure")
        -						return 0, errors.New("second write fails")
        -					}
        -					logf("Write(%q)", p)
        -					return c.Write(p)
        -				},
        -			}, nil
        -		},
        +	c := ts.Client()
        +	c.Transport.(*Transport).Dial = func(network, addr string) (net.Conn, error) {
        +		logf("Dial")
        +		c, err := net.Dial(network, ts.Listener.Addr().String())
        +		if err != nil {
        +			logf("Dial error: %v", err)
        +			return nil, err
        +		}
        +		return &writerFuncConn{
        +			Conn: c,
        +			write: func(p []byte) (n int, err error) {
        +				if atomic.AddInt32(&writeNumAtomic, 1) == 2 {
        +					logf("intentional write failure")
        +					return 0, errors.New("second write fails")
        +				}
        +				logf("Write(%q)", p)
        +				return c.Write(p)
        +			},
        +		}, nil
         	}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
         
         	SetRoundTripRetried(func() {
         		logf("Retried.")
        @@ -2752,6 +2689,7 @@
         		readBody <- err
         	}))
         	defer ts.Close()
        +	c := ts.Client()
         	fakeErr := errors.New("fake error")
         	didClose := make(chan bool, 1)
         	req, _ := NewRequest("POST", ts.URL, struct {
        @@ -2767,7 +2705,7 @@
         			return nil
         		}),
         	})
        -	res, err := DefaultClient.Do(req)
        +	res, err := c.Do(req)
         	if res != nil {
         		defer res.Body.Close()
         	}
        @@ -2801,23 +2739,19 @@
         		mu.Unlock()
         	}))
         	defer ts.Close()
        -	tr := &Transport{
        -		DialTLS: func(netw, addr string) (net.Conn, error) {
        -			mu.Lock()
        -			didDial = true
        -			mu.Unlock()
        -			c, err := tls.Dial(netw, addr, &tls.Config{
        -				InsecureSkipVerify: true,
        -			})
        -			if err != nil {
        -				return nil, err
        -			}
        -			return c, c.Handshake()
        -		},
        +	c := ts.Client()
        +	c.Transport.(*Transport).DialTLS = func(netw, addr string) (net.Conn, error) {
        +		mu.Lock()
        +		didDial = true
        +		mu.Unlock()
        +		c, err := tls.Dial(netw, addr, c.Transport.(*Transport).TLSClientConfig)
        +		if err != nil {
        +			return nil, err
        +		}
        +		return c, c.Handshake()
         	}
        -	defer tr.CloseIdleConnections()
        -	client := &Client{Transport: tr}
        -	res, err := client.Get(ts.URL)
        +
        +	res, err := c.Get(ts.URL)
         	if err != nil {
         		t.Fatal(err)
         	}
        @@ -2899,10 +2833,11 @@
         		reqc <- r
         	}))
         	defer ts.Close()
        +	c := ts.Client()
         
         	req, _ := NewRequest("GET", ts.URL, nil)
         	req.Header.Set("Range", "bytes=7-11")
        -	res, err := DefaultClient.Do(req)
        +	res, err := c.Do(req)
         	if err != nil {
         		t.Fatal(err)
         	}
        @@ -2931,9 +2866,7 @@
         		w.Write(b[:])
         	}))
         	defer ts.Close()
        -
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        +	tr := ts.Client().Transport.(*Transport)
         
         	req, err := NewRequest("GET", ts.URL, nil)
         	if err != nil {
        @@ -2967,9 +2900,7 @@
         
         	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
         	defer ts.Close()
        -
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        +	tr := ts.Client().Transport.(*Transport)
         
         	req, err := NewRequest("GET", ts.URL, nil)
         	if err != nil {
        @@ -3096,6 +3027,7 @@
         		w.WriteHeader(StatusOK)
         	}))
         	defer ts.Close()
        +	c := ts.Client()
         
         	fail := 0
         	count := 100
        @@ -3105,10 +3037,7 @@
         		if err != nil {
         			t.Fatal(err)
         		}
        -		tr := new(Transport)
        -		defer tr.CloseIdleConnections()
        -		client := &Client{Transport: tr}
        -		resp, err := client.Do(req)
        +		resp, err := c.Do(req)
         		if err != nil {
         			fail++
         			t.Logf("%d = %#v", i, err)
        @@ -3321,10 +3250,8 @@
         		w.Write(rgz) // arbitrary gzip response
         	}))
         	defer ts.Close()
        +	c := ts.Client()
         
        -	tr := &Transport{}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
         	for i := 0; i < 2; i++ {
         		res, err := c.Get(ts.URL)
         		if err != nil {
        @@ -3353,12 +3280,9 @@
         		}
         	}))
         	defer ts.Close()
        +	c := ts.Client()
        +	c.Transport.(*Transport).MaxResponseHeaderBytes = 512 << 10
         
        -	tr := &Transport{
        -		MaxResponseHeaderBytes: 512 << 10,
        -	}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
         	if res, err := c.Get(ts.URL); err != nil {
         		t.Fatal(err)
         	} else {
        @@ -3619,8 +3543,8 @@
         // connections. The http2 test is done in TestTransportEventTrace_h2
         func TestTLSHandshakeTrace(t *testing.T) {
         	defer afterTest(t)
        -	s := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
        -	defer s.Close()
        +	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
        +	defer ts.Close()
         
         	var mu sync.Mutex
         	var start, done bool
        @@ -3640,10 +3564,8 @@
         		},
         	}
         
        -	tr := &Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        -	req, err := NewRequest("GET", s.URL, nil)
        +	c := ts.Client()
        +	req, err := NewRequest("GET", ts.URL, nil)
         	if err != nil {
         		t.Fatal("Unable to construct test request:", err)
         	}
        @@ -3670,16 +3592,14 @@
         		// No body for convenience.
         	}))
         	defer ts.Close()
        -	tr := &Transport{
        -		MaxIdleConns: 4,
        -	}
        -	defer tr.CloseIdleConnections()
        +	c := ts.Client()
        +	tr := c.Transport.(*Transport)
        +	tr.MaxIdleConns = 4
         
         	ip, port, err := net.SplitHostPort(ts.Listener.Addr().String())
         	if err != nil {
         		t.Fatal(err)
         	}
        -	c := &Client{Transport: tr}
         	ctx := context.WithValue(context.Background(), nettrace.LookupIPAltResolverKey{}, func(ctx context.Context, host string) ([]net.IPAddr, error) {
         		return []net.IPAddr{{IP: net.ParseIP(ip)}}, nil
         	})
        @@ -3975,17 +3895,16 @@
         		c.Close()
         	}))
         	defer ts.Close()
        -	tr := &Transport{
        -		ProxyConnectHeader: Header{
        -			"User-Agent": {"foo"},
        -			"Other":      {"bar"},
        -		},
        -		Proxy: func(r *Request) (*url.URL, error) {
        -			return url.Parse(ts.URL)
        -		},
        +
        +	c := ts.Client()
        +	c.Transport.(*Transport).Proxy = func(r *Request) (*url.URL, error) {
        +		return url.Parse(ts.URL)
         	}
        -	defer tr.CloseIdleConnections()
        -	c := &Client{Transport: tr}
        +	c.Transport.(*Transport).ProxyConnectHeader = Header{
        +		"User-Agent": {"foo"},
        +		"Other":      {"bar"},
        +	}
        +
         	res, err := c.Get("https://dummy.tld/") // https to force a CONNECT
         	if err == nil {
         		res.Body.Close()
        

        To view, visit change 37771. To unsubscribe, visit settings.

        Gerrit-Project: go
        Gerrit-Branch: master
        Gerrit-MessageType: newpatchset
        Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
        Gerrit-Change-Number: 37771
        Gerrit-PatchSet: 2

        Brad Fitzpatrick (Gerrit)

        unread,
        Mar 7, 2017, 5:48:29 PM3/7/17
        to Johan Brandhorst, Brad Fitzpatrick, golang-co...@googlegroups.com

        Brad Fitzpatrick posted comments on this change.

        View Change

        Patch set 2:Run-TryBot +1

        (2 comments)

        To view, visit change 37771. To unsubscribe, visit settings.

        Gerrit-Project: go
        Gerrit-Branch: master
        Gerrit-MessageType: comment
        Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
        Gerrit-Change-Number: 37771
        Gerrit-PatchSet: 2
        Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
        Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
        Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
        Gerrit-Comment-Date: Tue, 07 Mar 2017 22:48:26 +0000
        Gerrit-HasComments: Yes

        Gobot Gobot (Gerrit)

        unread,
        Mar 7, 2017, 5:49:22 PM3/7/17
        to Johan Brandhorst, Brad Fitzpatrick, golang-co...@googlegroups.com

        Gobot Gobot posted comments on this change.

        View Change

        Patch set 2:

        TryBots beginning. Status page: http://farmer.golang.org/try?commit=058329eb

          To view, visit change 37771. To unsubscribe, visit settings.

          Gerrit-Project: go
          Gerrit-Branch: master
          Gerrit-MessageType: comment
          Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
          Gerrit-Change-Number: 37771
          Gerrit-PatchSet: 2
          Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
          Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
          Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
          Gerrit-CC: Gobot Gobot <go...@golang.org>
          Gerrit-Comment-Date: Tue, 07 Mar 2017 22:49:17 +0000
          Gerrit-HasComments: No

          Gobot Gobot (Gerrit)

          unread,
          Mar 7, 2017, 5:51:08 PM3/7/17
          to Johan Brandhorst, Brad Fitzpatrick, golang-co...@googlegroups.com

          Gobot Gobot posted comments on this change.

          View Change

          Patch set 2:

          Build is still in progress... This change failed on darwin-amd64-10_11: See https://storage.googleapis.com/go-build-log/058329eb/darwin-amd64-10_11_a717d679.log

          Consult https://build.golang.org/ to see whether it's a new failure. Other builds still in progress; subsequent failure notices suppressed until final report.

            To view, visit change 37771. To unsubscribe, visit settings.

            Gerrit-Project: go
            Gerrit-Branch: master
            Gerrit-MessageType: comment
            Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
            Gerrit-Change-Number: 37771
            Gerrit-PatchSet: 2
            Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
            Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
            Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
            Gerrit-CC: Gobot Gobot <go...@golang.org>
            Gerrit-Comment-Date: Tue, 07 Mar 2017 22:51:06 +0000
            Gerrit-HasComments: No

            Gobot Gobot (Gerrit)

            unread,
            Mar 7, 2017, 5:56:57 PM3/7/17
            to Johan Brandhorst, Brad Fitzpatrick, golang-co...@googlegroups.com

            Gobot Gobot posted comments on this change.

            View Change

            Patch set 2:TryBot-Result -1

            6 of 17 TryBots failed: Failed on darwin-amd64-10_11: https://storage.googleapis.com/go-build-log/058329eb/darwin-amd64-10_11_a717d679.log Failed on linux-amd64: https://storage.googleapis.com/go-build-log/058329eb/linux-amd64_3c938490.log Failed on linux-386: https://storage.googleapis.com/go-build-log/058329eb/linux-386_52808b6d.log Failed on windows-386-gce: https://storage.googleapis.com/go-build-log/058329eb/windows-386-gce_546febb9.log Failed on windows-amd64-gce: https://storage.googleapis.com/go-build-log/058329eb/windows-amd64-gce_26d4740d.log Failed on linux-amd64-race: https://storage.googleapis.com/go-build-log/058329eb/linux-amd64-race_3a90cc83.log

            Consult https://build.golang.org/ to see whether they are new failures.

              To view, visit change 37771. To unsubscribe, visit settings.

              Gerrit-Project: go
              Gerrit-Branch: master
              Gerrit-MessageType: comment
              Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
              Gerrit-Change-Number: 37771
              Gerrit-PatchSet: 2
              Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
              Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
              Gerrit-Reviewer: Gobot Gobot <go...@golang.org>
              Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
              Gerrit-Comment-Date: Tue, 07 Mar 2017 22:56:55 +0000
              Gerrit-HasComments: No

              Brad Fitzpatrick (Gerrit)

              unread,
              Mar 7, 2017, 8:33:54 PM3/7/17
              to Johan Brandhorst, Brad Fitzpatrick, Gobot Gobot, golang-co...@googlegroups.com

              Brad Fitzpatrick posted comments on this change.

              View Change

              Patch set 2:

              Please fix the failure. Looks like you have a Transport not shutting down its idle connections.

                To view, visit change 37771. To unsubscribe, visit settings.

                Gerrit-Project: go
                Gerrit-Branch: master
                Gerrit-MessageType: comment
                Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                Gerrit-Change-Number: 37771
                Gerrit-PatchSet: 2
                Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
                Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
                Gerrit-Reviewer: Gobot Gobot <go...@golang.org>
                Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
                Gerrit-Comment-Date: Wed, 08 Mar 2017 01:33:52 +0000
                Gerrit-HasComments: No

                Johan Brandhorst (Gerrit)

                unread,
                Mar 8, 2017, 4:11:02 AM3/8/17
                to Brad Fitzpatrick, Gobot Gobot, golang-co...@googlegroups.com

                Johan Brandhorst posted comments on this change.

                View Change

                Patch set 2:

                Patch Set 2:

                Please fix the failure. Looks like you have a Transport not shutting down its idle connections.

                Ok!

                (2 comments)

                  • Oops, indeed.

                  • Patch Set #2, Line 551: .Transport.(*Transport)

                    probably should add a test to httptest package to verify that the concrete

                  • Will do.

                To view, visit change 37771. To unsubscribe, visit settings.

                Gerrit-Project: go
                Gerrit-Branch: master
                Gerrit-MessageType: comment
                Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                Gerrit-Change-Number: 37771
                Gerrit-PatchSet: 2
                Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
                Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
                Gerrit-Reviewer: Gobot Gobot <go...@golang.org>
                Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
                Gerrit-Comment-Date: Wed, 08 Mar 2017 09:10:58 +0000
                Gerrit-HasComments: Yes

                Johan Brandhorst (Gerrit)

                unread,
                Mar 8, 2017, 4:41:27 AM3/8/17
                to Gobot Gobot, Brad Fitzpatrick, golang-co...@googlegroups.com

                Johan Brandhorst uploaded patch set #3 to this change.

                View Change

                net/http: use httptest.Server Client in tests
                
                After merging https://go-review.googlesource.com/c/34639/
                ,
                it was pointed out to me that a lot of tests under net/http
                could use the new functionality to simplify and unify testing.
                
                Using the httptest.Server provided Client removes the need to
                call CloseIdleConnections() on all Transports created, as it
                is automatically called on the Transport associated with the
                client when Server.Close() is called.
                
                Change the transport used by the non-TLS
                httptest.Server to a new *http.Transport rather than using
                http.DefaultTransport implicitly. The TLS version already
                used its own *http.Transport. This change is to prevent
                concurrency problems with using DefaultTransport implicitly
                across several httptest.Server's.
                
                Add tests to ensure the httptest.Server.Client().Transport
                RoundTripper interface is implemented by a *http.Transport,
                as is now assumed across large parts of net/http tests.
                
                Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                ---
                M src/net/http/client_test.go
                M src/net/http/fs_test.go
                M src/net/http/httptest/server.go
                M src/net/http/httptest/server_test.go
                M src/net/http/httputil/reverseproxy_test.go
                M src/net/http/main_test.go
                M src/net/http/npn_test.go
                M src/net/http/serve_test.go
                M src/net/http/transport_test.go
                9 files changed, 321 insertions(+), 456 deletions(-)
                
                
                diff --git a/src/net/http/client_test.go b/src/net/http/client_test.go
                index c75456a..73f2221 100644
                --- a/src/net/http/client_test.go
                +++ b/src/net/http/client_test.go
                @@ -10,7 +10,6 @@
                 	"bytes"
                 	"context"
                 	"crypto/tls"
                -	"crypto/x509"
                 	"encoding/base64"
                 	"errors"
                 	"fmt"
                @@ -73,7 +72,7 @@
                 	ts := httptest.NewServer(robotsTxtHandler)
                 	defer ts.Close()
                 
                -	c := &Client{Transport: &Transport{DisableKeepAlives: true}}
                +	c := ts.Client()
                 	r, err := c.Get(ts.URL)
                 	var b []byte
                 	if err == nil {
                @@ -220,10 +219,7 @@
                 	}))
                 	defer ts.Close()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 	_, err := c.Get(ts.URL)
                 	if e, g := "Get /?n=10: stopped after 10 redirects", fmt.Sprintf("%v", err); e != g {
                 		t.Errorf("with default client Get, expected error %q, got %q", e, g)
                @@ -252,13 +248,10 @@
                 	var checkErr error
                 	var lastVia []*Request
                 	var lastReq *Request
                -	c = &Client{
                -		Transport: tr,
                -		CheckRedirect: func(req *Request, via []*Request) error {
                -			lastReq = req
                -			lastVia = via
                -			return checkErr
                -		},
                +	c.CheckRedirect = func(req *Request, via []*Request) error {
                +		lastReq = req
                +		lastVia = via
                +		return checkErr
                 	}
                 	res, err := c.Get(ts.URL)
                 	if err != nil {
                @@ -313,21 +306,16 @@
                 	}))
                 	defer ts.Close()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -
                 	ctx, cancel := context.WithCancel(context.Background())
                -	c := &Client{
                -		Transport: tr,
                -		CheckRedirect: func(req *Request, via []*Request) error {
                -			cancel()
                -			select {
                -			case <-req.Context().Done():
                -				return nil
                -			case <-time.After(5 * time.Second):
                -				return errors.New("redirected request's context never expired after root request canceled")
                -			}
                -		},
                +	c := ts.Client()
                +	c.CheckRedirect = func(req *Request, via []*Request) error {
                +		cancel()
                +		select {
                +		case <-req.Context().Done():
                +			return nil
                +		case <-time.After(5 * time.Second):
                +			return errors.New("redirected request's context never expired after root request canceled")
                +		}
                 	}
                 	req, _ := NewRequest("GET", ts.URL, nil)
                 	req = req.WithContext(ctx)
                @@ -461,11 +449,12 @@
                 	}))
                 	defer ts.Close()
                 
                +	c := ts.Client()
                 	for _, tt := range table {
                 		content := tt.redirectBody
                 		req, _ := NewRequest(method, ts.URL+tt.suffix, strings.NewReader(content))
                 		req.GetBody = func() (io.ReadCloser, error) { return ioutil.NopCloser(strings.NewReader(content)), nil }
                -		res, err := DefaultClient.Do(req)
                +		res, err := c.Do(req)
                 
                 		if err != nil {
                 			t.Fatal(err)
                @@ -519,17 +508,12 @@
                 	}))
                 	defer ts.Close()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -
                -	c := &Client{
                -		Transport: tr,
                -		CheckRedirect: func(req *Request, via []*Request) error {
                -			if req.Response == nil {
                -				t.Error("expected non-nil Request.Response")
                -			}
                -			return ErrUseLastResponse
                -		},
                +	c := ts.Client()
                +	c.CheckRedirect = func(req *Request, via []*Request) error {
                +		if req.Response == nil {
                +			t.Error("expected non-nil Request.Response")
                +		}
                +		return ErrUseLastResponse
                 	}
                 	res, err := c.Get(ts.URL)
                 	if err != nil {
                @@ -558,7 +542,7 @@
                 		w.WriteHeader(308)
                 	}))
                 	defer ts.Close()
                -	c := &Client{Transport: &Transport{DisableKeepAlives: true}}
                +	c := ts.Client()
                 	res, err := c.Get(ts.URL)
                 	if err != nil {
                 		t.Fatal(err)
                @@ -586,7 +570,7 @@
                 	if err != nil {
                 		t.Fatal(err)
                 	}
                -	c := &Client{Transport: &Transport{DisableKeepAlives: true}}
                +	c := ts.Client()
                 	req.GetBody = nil // so it can't rewind.
                 	res, err := c.Do(req)
                 	if err != nil {
                @@ -678,12 +662,8 @@
                 	var ts *httptest.Server
                 	ts = httptest.NewServer(echoCookiesRedirectHandler)
                 	defer ts.Close()
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{
                -		Transport: tr,
                -		Jar:       new(TestJar),
                -	}
                +	c := ts.Client()
                +	c.Jar = new(TestJar)
                 	u, _ := url.Parse(ts.URL)
                 	c.Jar.SetCookies(u, []*Cookie{expectedCookies[0]})
                 	resp, err := c.Get(ts.URL)
                @@ -727,13 +707,10 @@
                 	}))
                 	defer ts.Close()
                 	jar := new(RecordingJar)
                -	c := &Client{
                -		Jar: jar,
                -		Transport: &Transport{
                -			Dial: func(_ string, _ string) (net.Conn, error) {
                -				return net.Dial("tcp", ts.Listener.Addr().String())
                -			},
                -		},
                +	c := ts.Client()
                +	c.Jar = jar
                +	c.Transport.(*Transport).Dial = func(_ string, _ string) (net.Conn, error) {
                +		return net.Dial("tcp", ts.Listener.Addr().String())
                 	}
                 	_, err := c.Get("http://firsthost.fake/")
                 	if err != nil {
                @@ -845,7 +822,8 @@
                 		}
                 		return c, err
                 	}
                -	c := &Client{Transport: &Transport{Dial: dialer}}
                +	c := ts.Client()
                +	c.Transport.(*Transport).Dial = dialer
                 
                 	_, err := c.Get(ts.URL)
                 	if err != nil {
                @@ -878,14 +856,11 @@
                 	// TODO(bradfitz): add tests for skipping hostname checks too?
                 	// would require a new cert for testing, and probably
                 	// redundant with these tests.
                +	c := ts.Client()
                 	for _, insecure := range []bool{true, false} {
                -		tr := &Transport{
                -			TLSClientConfig: &tls.Config{
                -				InsecureSkipVerify: insecure,
                -			},
                +		c.Transport.(*Transport).TLSClientConfig = &tls.Config{
                +			InsecureSkipVerify: insecure,
                 		}
                -		defer tr.CloseIdleConnections()
                -		c := &Client{Transport: tr}
                 		res, err := c.Get(ts.URL)
                 		if (err == nil) != insecure {
                 			t.Errorf("insecure=%v: got unexpected err=%v", insecure, err)
                @@ -919,22 +894,6 @@
                 	}
                 }
                 
                -func newTLSTransport(t *testing.T, ts *httptest.Server) *Transport {
                -	certs := x509.NewCertPool()
                -	for _, c := range ts.TLS.Certificates {
                -		roots, err := x509.ParseCertificates(c.Certificate[len(c.Certificate)-1])
                -		if err != nil {
                -			t.Fatalf("error parsing server's root cert: %v", err)
                -		}
                -		for _, root := range roots {
                -			certs.AddCert(root)
                -		}
                -	}
                -	return &Transport{
                -		TLSClientConfig: &tls.Config{RootCAs: certs},
                -	}
                -}
                -
                 func TestClientWithCorrectTLSServerName(t *testing.T) {
                 	defer afterTest(t)
                 
                @@ -946,9 +905,8 @@
                 	}))
                 	defer ts.Close()
                 
                -	trans := newTLSTransport(t, ts)
                -	trans.TLSClientConfig.ServerName = serverName
                -	c := &Client{Transport: trans}
                +	c := ts.Client()
                +	c.Transport.(*Transport).TLSClientConfig.ServerName = serverName
                 	if _, err := c.Get(ts.URL); err != nil {
                 		t.Fatalf("expected successful TLS connection, got error: %v", err)
                 	}
                @@ -961,9 +919,8 @@
                 	errc := make(chanWriter, 10) // but only expecting 1
                 	ts.Config.ErrorLog = log.New(errc, "", 0)
                 
                -	trans := newTLSTransport(t, ts)
                -	trans.TLSClientConfig.ServerName = "badserver"
                -	c := &Client{Transport: trans}
                +	c := ts.Client()
                +	c.Transport.(*Transport).TLSClientConfig.ServerName = "badserver"
                 	_, err := c.Get(ts.URL)
                 	if err == nil {
                 		t.Fatalf("expected an error")
                @@ -997,13 +954,12 @@
                 	}))
                 	defer ts.Close()
                 
                -	tr := newTLSTransport(t, ts)
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                 	tr.TLSClientConfig.ServerName = "example.com" // one of httptest's Server cert names
                 	tr.Dial = func(netw, addr string) (net.Conn, error) {
                 		return net.Dial(netw, ts.Listener.Addr().String())
                 	}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                 	res, err := c.Get("https://some-other-host.tld/")
                 	if err != nil {
                 		t.Fatal(err)
                @@ -1018,13 +974,12 @@
                 	}))
                 	defer ts.Close()
                 
                -	tr := newTLSTransport(t, ts)
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                 	tr.TLSClientConfig.CipherSuites = []uint16{tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA}
                 	tr.Dial = func(netw, addr string) (net.Conn, error) {
                 		return net.Dial(netw, ts.Listener.Addr().String())
                 	}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                 	res, err := c.Get("https://example.com/")
                 	if err != nil {
                 		t.Fatal(err)
                @@ -1119,14 +1074,12 @@
                 		}
                 	}))
                 	defer ts.Close()
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                 	req, err := NewRequest("GET", ts.URL, nil)
                 	if err != nil {
                 		t.Fatal(err)
                 	}
                 	req.URL.User = url.User(gopher)
                +	c := ts.Client()
                 	resp, err := c.Do(req)
                 	if err != nil {
                 		t.Fatal(err)
                @@ -1503,21 +1456,17 @@
                 	defer ts2.Close()
                 	ts2URL = ts2.URL
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{
                -		Transport: tr,
                -		CheckRedirect: func(r *Request, via []*Request) error {
                -			want := Header{
                -				"User-Agent": []string{ua},
                -				"X-Foo":      []string{xfoo},
                -				"Referer":    []string{ts2URL},
                -			}
                -			if !reflect.DeepEqual(r.Header, want) {
                -				t.Errorf("CheckRedirect Request.Header = %#v; want %#v", r.Header, want)
                -			}
                -			return nil
                -		},
                +	c := ts1.Client()
                +	c.CheckRedirect = func(r *Request, via []*Request) error {
                +		want := Header{
                +			"User-Agent": []string{ua},
                +			"X-Foo":      []string{xfoo},
                +			"Referer":    []string{ts2URL},
                +		}
                +		if !reflect.DeepEqual(r.Header, want) {
                +			t.Errorf("CheckRedirect Request.Header = %#v; want %#v", r.Header, want)
                +		}
                +		return nil
                 	}
                 
                 	req, _ := NewRequest("GET", ts2.URL, nil)
                @@ -1606,13 +1555,9 @@
                 	}))
                 	defer ts.Close()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                 	jar, _ := cookiejar.New(nil)
                -	c := &Client{
                -		Transport: tr,
                -		Jar:       jar,
                -	}
                +	c := ts.Client()
                +	c.Jar = jar
                 
                 	u, _ := url.Parse(ts.URL)
                 	req, _ := NewRequest("GET", ts.URL, nil)
                @@ -1730,9 +1675,7 @@
                 	}))
                 	defer ts.Close()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -
                +	c := ts.Client()
                 	for i, tt := range tests {
                 		handlerc <- func(w ResponseWriter, r *Request) {
                 			w.Header().Set("Location", ts.URL)
                @@ -1745,7 +1688,6 @@
                 			continue
                 		}
                 
                -		c := &Client{Transport: tr}
                 		c.CheckRedirect = func(req *Request, via []*Request) error {
                 			if got, want := req.Method, tt.wantMethod; got != want {
                 				return fmt.Errorf("#%d: got next method %q; want %q", i, got, want)
                @@ -1799,9 +1741,8 @@
                 		w.Header().Set("X-Body-Read", fmt.Sprintf("%v, %v", n, err))
                 	}))
                 	defer ts.Close()
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                 
                 	// Do one initial successful request to create an idle TCP connection
                 	// for the subsequent request to reuse. (The Transport only retries
                diff --git a/src/net/http/fs_test.go b/src/net/http/fs_test.go
                index 1de1cd5..e12350e 100644
                --- a/src/net/http/fs_test.go
                +++ b/src/net/http/fs_test.go
                @@ -74,6 +74,7 @@
                 		ServeFile(w, r, "testdata/file")
                 	}))
                 	defer ts.Close()
                +	c := ts.Client()
                 
                 	var err error
                 
                @@ -91,7 +92,7 @@
                 	req.Method = "GET"
                 
                 	// straight GET
                -	_, body := getBody(t, "straight get", req)
                +	_, body := getBody(t, "straight get", req, c)
                 	if !bytes.Equal(body, file) {
                 		t.Fatalf("body mismatch: got %q, want %q", body, file)
                 	}
                @@ -102,7 +103,7 @@
                 		if rt.r != "" {
                 			req.Header.Set("Range", rt.r)
                 		}
                -		resp, body := getBody(t, fmt.Sprintf("range test %q", rt.r), req)
                +		resp, body := getBody(t, fmt.Sprintf("range test %q", rt.r), req, c)
                 		if resp.StatusCode != rt.code {
                 			t.Errorf("range=%q: StatusCode=%d, want %d", rt.r, resp.StatusCode, rt.code)
                 		}
                @@ -704,7 +705,8 @@
                 	req, _ := NewRequest("GET", ts.URL, nil)
                 	req.Header.Set("If-Modified-Since", lastMod)
                 
                -	res, err = DefaultClient.Do(req)
                +	c := ts.Client()
                +	res, err = c.Do(req)
                 	if err != nil {
                 		t.Fatal(err)
                 	}
                @@ -716,7 +718,7 @@
                 	// Advance the index.html file's modtime, but not the directory's.
                 	indexFile.modtime = indexFile.modtime.Add(1 * time.Hour)
                 
                -	res, err = DefaultClient.Do(req)
                +	res, err = c.Do(req)
                 	if err != nil {
                 		t.Fatal(err)
                 	}
                @@ -995,7 +997,9 @@
                 		for k, v := range tt.reqHeader {
                 			req.Header.Set(k, v)
                 		}
                -		res, err := DefaultClient.Do(req)
                +
                +		c := ts.Client()
                +		res, err := c.Do(req)
                 		if err != nil {
                 			t.Fatal(err)
                 		}
                @@ -1050,8 +1054,9 @@
                 	}
                 	ts := httptest.NewServer(FileServer(fs))
                 	defer ts.Close()
                +	c := ts.Client()
                 	for _, code := range []int{403, 404, 500} {
                -		res, err := DefaultClient.Get(fmt.Sprintf("%s/%d", ts.URL, code))
                +		res, err := c.Get(fmt.Sprintf("%s/%d", ts.URL, code))
                 		if err != nil {
                 			t.Errorf("Error fetching /%d: %v", code, err)
                 			continue
                @@ -1125,8 +1130,8 @@
                 	}
                 }
                 
                -func getBody(t *testing.T, testName string, req Request) (*Response, []byte) {
                -	r, err := DefaultClient.Do(&req)
                +func getBody(t *testing.T, testName string, req Request, client *Client) (*Response, []byte) {
                +	r, err := client.Do(&req)
                 	if err != nil {
                 		t.Fatalf("%s: for URL %q, send error: %v", testName, req.URL.String(), err)
                 	}
                diff --git a/src/net/http/httptest/server.go b/src/net/http/httptest/server.go
                index 56ad18e..b5b18c7 100644
                --- a/src/net/http/httptest/server.go
                +++ b/src/net/http/httptest/server.go
                @@ -93,7 +93,9 @@
                 	return &Server{
                 		Listener: newLocalListener(),
                 		Config:   &http.Server{Handler: handler},
                -		client:   &http.Client{},
                +		client: &http.Client{
                +			Transport: &http.Transport{},
                +		},
                 	}
                 }
                 
                diff --git a/src/net/http/httptest/server_test.go b/src/net/http/httptest/server_test.go
                index 7d80fa1..62846de 100644
                --- a/src/net/http/httptest/server_test.go
                +++ b/src/net/http/httptest/server_test.go
                @@ -121,3 +121,27 @@
                 		t.Errorf("got %q, want hello", string(got))
                 	}
                 }
                +
                +// Tests that the Server.Client.Transport interface is implemented
                +// by a *http.Transport.
                +func TestServerClientTransportType(t *testing.T) {
                +	ts := NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                +	}))
                +	defer ts.Close()
                +	client := ts.Client()
                +	if _, ok := client.Transport.(*http.Transport); !ok {
                +		t.Errorf("got %T, want *http.Transport", client.Transport)
                +	}
                +}
                +
                +// Tests that the TLS Server.Client.Transport interface is implemented
                +// by a *http.Transport.
                +func TestTLSServerClientTransportType(t *testing.T) {
                +	ts := NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                +	}))
                +	defer ts.Close()
                +	client := ts.Client()
                +	if _, ok := client.Transport.(*http.Transport); !ok {
                +		t.Errorf("got %T, want *http.Transport", client.Transport)
                +	}
                +}
                diff --git a/src/net/http/httputil/reverseproxy_test.go b/src/net/http/httputil/reverseproxy_test.go
                index 9153508..008e4e7 100644
                --- a/src/net/http/httputil/reverseproxy_test.go
                +++ b/src/net/http/httputil/reverseproxy_test.go
                @@ -79,6 +79,7 @@
                 	proxyHandler.ErrorLog = log.New(ioutil.Discard, "", 0) // quiet for tests
                 	frontend := httptest.NewServer(proxyHandler)
                 	defer frontend.Close()
                +	frontendClient := frontend.Client()
                 
                 	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
                 	getReq.Host = "some-name"
                @@ -86,7 +87,7 @@
                 	getReq.Header.Set("Proxy-Connection", "should be deleted")
                 	getReq.Header.Set("Upgrade", "foo")
                 	getReq.Close = true
                -	res, err := http.DefaultClient.Do(getReq)
                +	res, err := frontendClient.Do(getReq)
                 	if err != nil {
                 		t.Fatalf("Get: %v", err)
                 	}
                @@ -126,7 +127,7 @@
                 	// a response results in a StatusBadGateway.
                 	getReq, _ = http.NewRequest("GET", frontend.URL+"/?mode=hangup", nil)
                 	getReq.Close = true
                -	res, err = http.DefaultClient.Do(getReq)
                +	res, err = frontendClient.Do(getReq)
                 	if err != nil {
                 		t.Fatal(err)
                 	}
                @@ -172,7 +173,7 @@
                 	getReq.Header.Set("Connection", "Upgrade, "+fakeConnectionToken)
                 	getReq.Header.Set("Upgrade", "original value")
                 	getReq.Header.Set(fakeConnectionToken, "should be deleted")
                -	res, err := http.DefaultClient.Do(getReq)
                +	res, err := frontend.Client().Do(getReq)
                 	if err != nil {
                 		t.Fatalf("Get: %v", err)
                 	}
                @@ -220,7 +221,7 @@
                 	getReq.Header.Set("Connection", "close")
                 	getReq.Header.Set("X-Forwarded-For", prevForwardedFor)
                 	getReq.Close = true
                -	res, err := http.DefaultClient.Do(getReq)
                +	res, err := frontend.Client().Do(getReq)
                 	if err != nil {
                 		t.Fatalf("Get: %v", err)
                 	}
                @@ -259,7 +260,7 @@
                 		frontend := httptest.NewServer(NewSingleHostReverseProxy(backendURL))
                 		req, _ := http.NewRequest("GET", frontend.URL+tt.reqSuffix, nil)
                 		req.Close = true
                -		res, err := http.DefaultClient.Do(req)
                +		res, err := frontend.Client().Do(req)
                 		if err != nil {
                 			t.Fatalf("%d. Get: %v", i, err)
                 		}
                @@ -295,7 +296,7 @@
                 
                 	req, _ := http.NewRequest("GET", frontend.URL, nil)
                 	req.Close = true
                -	res, err := http.DefaultClient.Do(req)
                +	res, err := frontend.Client().Do(req)
                 	if err != nil {
                 		t.Fatalf("Get: %v", err)
                 	}
                @@ -349,13 +350,14 @@
                 
                 	frontend := httptest.NewServer(proxyHandler)
                 	defer frontend.Close()
                +	frontendClient := frontend.Client()
                 
                 	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
                 	go func() {
                 		<-reqInFlight
                -		http.DefaultTransport.(*http.Transport).CancelRequest(getReq)
                +		frontendClient.Transport.(*http.Transport).CancelRequest(getReq)
                 	}()
                -	res, err := http.DefaultClient.Do(getReq)
                +	res, err := frontendClient.Do(getReq)
                 	if res != nil {
                 		t.Errorf("got response %v; want nil", res.Status)
                 	}
                @@ -363,7 +365,7 @@
                 		// This should be an error like:
                 		// Get http://127.0.0.1:58079: read tcp 127.0.0.1:58079:
                 		//    use of closed network connection
                -		t.Error("DefaultClient.Do() returned nil error; want non-nil error")
                +		t.Error("Server.Client().Do() returned nil error; want non-nil error")
                 	}
                 }
                 
                @@ -428,11 +430,12 @@
                 	proxyHandler.ErrorLog = log.New(ioutil.Discard, "", 0) // quiet for tests
                 	frontend := httptest.NewServer(proxyHandler)
                 	defer frontend.Close()
                +	frontendClient := frontend.Client()
                 
                 	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
                 	getReq.Header.Set("User-Agent", explicitUA)
                 	getReq.Close = true
                -	res, err := http.DefaultClient.Do(getReq)
                +	res, err := frontendClient.Do(getReq)
                 	if err != nil {
                 		t.Fatalf("Get: %v", err)
                 	}
                @@ -441,7 +444,7 @@
                 	getReq, _ = http.NewRequest("GET", frontend.URL+"/noua", nil)
                 	getReq.Header.Set("User-Agent", "")
                 	getReq.Close = true
                -	res, err = http.DefaultClient.Do(getReq)
                +	res, err = frontendClient.Do(getReq)
                 	if err != nil {
                 		t.Fatalf("Get: %v", err)
                 	}
                @@ -493,7 +496,7 @@
                 
                 	req, _ := http.NewRequest("GET", frontend.URL, nil)
                 	req.Close = true
                -	res, err := http.DefaultClient.Do(req)
                +	res, err := frontend.Client().Do(req)
                 	if err != nil {
                 		t.Fatalf("Get: %v", err)
                 	}
                @@ -540,7 +543,7 @@
                 	defer frontend.Close()
                 
                 	postReq, _ := http.NewRequest("POST", frontend.URL, bytes.NewReader(requestBody))
                -	res, err := http.DefaultClient.Do(postReq)
                +	res, err := frontend.Client().Do(postReq)
                 	if err != nil {
                 		t.Fatalf("Do: %v", err)
                 	}
                @@ -573,7 +576,7 @@
                 	frontend := httptest.NewServer(proxyHandler)
                 	defer frontend.Close()
                 
                -	res, err := http.DefaultClient.Get(frontend.URL)
                +	res, err := frontend.Client().Get(frontend.URL)
                 	if err != nil {
                 		t.Fatal(err)
                 	}
                diff --git a/src/net/http/main_test.go b/src/net/http/main_test.go
                index 438bd2e..fc0437e 100644
                --- a/src/net/http/main_test.go
                +++ b/src/net/http/main_test.go
                @@ -151,7 +151,3 @@
                 	}
                 	return err
                 }
                -
                -func closeClient(c *http.Client) {
                -	c.Transport.(*http.Transport).CloseIdleConnections()
                -}
                diff --git a/src/net/http/npn_test.go b/src/net/http/npn_test.go
                index 4c1f6b5..618bdbe 100644
                --- a/src/net/http/npn_test.go
                +++ b/src/net/http/npn_test.go
                @@ -8,6 +8,7 @@
                 	"bufio"
                 	"bytes"
                 	"crypto/tls"
                +	"crypto/x509"
                 	"fmt"
                 	"io"
                 	"io/ioutil"
                @@ -43,10 +44,7 @@
                 
                 	// Normal request, without NPN.
                 	{
                -		tr := newTLSTransport(t, ts)
                -		defer tr.CloseIdleConnections()
                -		c := &Client{Transport: tr}
                -
                +		c := ts.Client()
                 		res, err := c.Get(ts.URL)
                 		if err != nil {
                 			t.Fatal(err)
                @@ -63,11 +61,18 @@
                 	// Request to an advertised but unhandled NPN protocol.
                 	// Server will hang up.
                 	{
                -		tr := newTLSTransport(t, ts)
                -		tr.TLSClientConfig.NextProtos = []string{"unhandled-proto"}
                +		certPool := x509.NewCertPool()
                +		certPool.AddCert(ts.Certificate())
                +		tr := &Transport{
                +			TLSClientConfig: &tls.Config{
                +				RootCAs:    certPool,
                +				NextProtos: []string{"unhandled-proto"},
                +			},
                +		}
                 		defer tr.CloseIdleConnections()
                -		c := &Client{Transport: tr}
                -
                +		c := &Client{
                +			Transport: tr,
                +		}
                 		res, err := c.Get(ts.URL)
                 		if err == nil {
                 			defer res.Body.Close()
                @@ -80,7 +85,8 @@
                 	// Request using the "tls-0.9" protocol, which we register here.
                 	// It is HTTP/0.9 over TLS.
                 	{
                -		tlsConfig := newTLSTransport(t, ts).TLSClientConfig
                +		c := ts.Client()
                +		tlsConfig := c.Transport.(*Transport).TLSClientConfig
                 		tlsConfig.NextProtos = []string{"tls-0.9"}
                 		conn, err := tls.Dial("tcp", ts.Listener.Addr().String(), tlsConfig)
                 		if err != nil {
                diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go
                index 8092cc1..d301d15 100644
                --- a/src/net/http/serve_test.go
                +++ b/src/net/http/serve_test.go
                @@ -474,9 +474,7 @@
                 	defer ts.Close()
                 
                 	// Hit the HTTP server successfully.
                -	tr := &Transport{DisableKeepAlives: true} // they interfere with this test
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 	r, err := c.Get(ts.URL)
                 	if err != nil {
                 		t.Fatalf("http Get #1: %v", err)
                @@ -548,12 +546,10 @@
                 	ts.StartTLS()
                 	defer ts.Close()
                 
                -	tr := newTLSTransport(t, ts)
                -	defer tr.CloseIdleConnections()
                -	if err := ExportHttp2ConfigureTransport(tr); err != nil {
                +	c := ts.Client()
                +	if err := ExportHttp2ConfigureTransport(c.Transport.(*Transport)); err != nil {
                 		t.Fatal(err)
                 	}
                -	c := &Client{Transport: tr}
                 
                 	for i := 1; i <= 3; i++ {
                 		req, err := NewRequest("GET", ts.URL, nil)
                @@ -608,9 +604,7 @@
                 	ts.Start()
                 	defer ts.Close()
                 
                -	tr := &Transport{DisableKeepAlives: false}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 
                 	errc := make(chan error)
                 	go func() {
                @@ -671,8 +665,7 @@
                 	ts := httptest.NewServer(handler)
                 	defer ts.Close()
                 
                -	c := &Client{Transport: new(Transport)}
                -	defer closeClient(c)
                +	c := ts.Client()
                 
                 	// Note: this relies on the assumption (which is true) that
                 	// Get sends HTTP/1.1 or greater requests. Otherwise the
                @@ -949,9 +942,8 @@
                 	ts.Start()
                 	defer ts.Close()
                 
                -	tr := &Transport{DisableKeepAlives: true}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr, Timeout: time.Second}
                +	c := ts.Client()
                +	c.Timeout = time.Second
                 
                 	fetch := func(num int, response chan<- string) {
                 		resp, err := c.Get(ts.URL)
                @@ -1022,9 +1014,7 @@
                 	}))
                 	defer ts.Close()
                 
                -	c := &Client{Transport: new(Transport)}
                -	defer closeClient(c)
                -
                +	c := ts.Client()
                 	res, err := c.Get(ts.URL)
                 	if err != nil {
                 		t.Fatalf("Get error: %v", err)
                @@ -1145,12 +1135,7 @@
                 			t.Errorf("expected test TLS server to start with https://, got %q", ts.URL)
                 			return
                 		}
                -		noVerifyTransport := &Transport{
                -			TLSClientConfig: &tls.Config{
                -				InsecureSkipVerify: true,
                -			},
                -		}
                -		client := &Client{Transport: noVerifyTransport}
                +		client := ts.Client()
                 		res, err := client.Get(ts.URL)
                 		if err != nil {
                 			t.Error(err)
                @@ -1967,8 +1952,7 @@
                 	ts := httptest.NewServer(TimeoutHandler(delayHi, 20*time.Millisecond, ""))
                 	defer ts.Close()
                 
                -	c := &Client{Transport: new(Transport)}
                -	defer closeClient(c)
                +	c := ts.Client()
                 
                 	var wg sync.WaitGroup
                 	gate := make(chan bool, 10)
                @@ -2011,8 +1995,8 @@
                 	if testing.Short() {
                 		n = 10
                 	}
                -	c := &Client{Transport: new(Transport)}
                -	defer closeClient(c)
                +
                +	c := ts.Client()
                 	for i := 0; i < n; i++ {
                 		gate <- true
                 		wg.Add(1)
                @@ -2099,8 +2083,7 @@
                 	ts := httptest.NewServer(TimeoutHandler(handler, timeout, ""))
                 	defer ts.Close()
                 
                -	c := &Client{Transport: new(Transport)}
                -	defer closeClient(c)
                +	c := ts.Client()
                 
                 	// Issue was caused by the timeout handler starting the timer when
                 	// was created, not when the request. So wait for more than the timeout
                @@ -2127,8 +2110,7 @@
                 	ts := httptest.NewServer(TimeoutHandler(handler, timeout, ""))
                 	defer ts.Close()
                 
                -	c := &Client{Transport: new(Transport)}
                -	defer closeClient(c)
                +	c := ts.Client()
                 
                 	res, err := c.Get(ts.URL)
                 	if err != nil {
                @@ -2364,9 +2346,7 @@
                 	ts.Start()
                 	defer ts.Close()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 	res, err := c.Get(ts.URL)
                 	if err != nil {
                 		t.Fatal(err)
                @@ -2411,8 +2391,7 @@
                 	ts := httptest.NewServer(StripPrefix("/foo", h))
                 	defer ts.Close()
                 
                -	c := &Client{Transport: new(Transport)}
                -	defer closeClient(c)
                +	c := ts.Client()
                 
                 	res, err := c.Get(ts.URL + "/foo/bar")
                 	if err != nil {
                @@ -3654,9 +3633,7 @@
                 	}
                 	ts.Start()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 
                 	mustGet := func(url string, headers ...string) {
                 		req, err := NewRequest("GET", url, nil)
                @@ -4491,15 +4468,9 @@
                 	b.ResetTimer()
                 	b.SetParallelism(parallelism)
                 	b.RunParallel(func(pb *testing.PB) {
                -		noVerifyTransport := &Transport{
                -			TLSClientConfig: &tls.Config{
                -				InsecureSkipVerify: true,
                -			},
                -		}
                -		defer noVerifyTransport.CloseIdleConnections()
                -		client := &Client{Transport: noVerifyTransport}
                +		c := ts.Client()
                 		for pb.Next() {
                -			res, err := client.Get(ts.URL)
                +			res, err := c.Get(ts.URL)
                 			if err != nil {
                 				b.Logf("Get: %v", err)
                 				continue
                @@ -4934,10 +4905,7 @@
                 	ts.Config.IdleTimeout = 2 * time.Second
                 	ts.Start()
                 	defer ts.Close()
                -
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 
                 	get := func() string {
                 		res, err := c.Get(ts.URL)
                @@ -4998,9 +4966,8 @@
                 	}))
                 	defer ts.Close()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                 
                 	get := func() string { return get(t, c, ts.URL) }
                 
                @@ -5119,9 +5086,7 @@
                 	ts.Start()
                 	defer ts.Close()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 
                 	res, err := c.Get(ts.URL)
                 	if err != nil {
                diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go
                index cb315f1..09bfef4 100644
                --- a/src/net/http/transport_test.go
                +++ b/src/net/http/transport_test.go
                @@ -131,11 +131,9 @@
                 	ts := httptest.NewServer(hostPortHandler)
                 	defer ts.Close()
                 
                +	c := ts.Client()
                 	for _, disableKeepAlive := range []bool{false, true} {
                -		tr := &Transport{DisableKeepAlives: disableKeepAlive}
                -		defer tr.CloseIdleConnections()
                -		c := &Client{Transport: tr}
                -
                +		c.Transport.(*Transport).DisableKeepAlives = disableKeepAlive
                 		fetch := func(n int) string {
                 			res, err := c.Get(ts.URL)
                 			if err != nil {
                @@ -166,12 +164,11 @@
                 
                 	connSet, testDial := makeTestDial(t)
                 
                -	for _, connectionClose := range []bool{false, true} {
                -		tr := &Transport{
                -			Dial: testDial,
                -		}
                -		c := &Client{Transport: tr}
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                +	tr.Dial = testDial
                 
                +	for _, connectionClose := range []bool{false, true} {
                 		fetch := func(n int) string {
                 			req := new(Request)
                 			var err error
                @@ -217,12 +214,10 @@
                 
                 	connSet, testDial := makeTestDial(t)
                 
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                +	tr.Dial = testDial
                 	for _, connectionClose := range []bool{false, true} {
                -		tr := &Transport{
                -			Dial: testDial,
                -		}
                -		c := &Client{Transport: tr}
                -
                 		fetch := func(n int) string {
                 			req := new(Request)
                 			var err error
                @@ -273,10 +268,9 @@
                 	ts := httptest.NewServer(hostPortHandler)
                 	defer ts.Close()
                 
                -	tr := &Transport{
                -		DisableKeepAlives: true,
                -	}
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                +	c.Transport.(*Transport).DisableKeepAlives = true
                +
                 	res, err := c.Get(ts.URL)
                 	if err != nil {
                 		t.Fatal(err)
                @@ -291,9 +285,8 @@
                 	defer afterTest(t)
                 	ts := httptest.NewServer(hostPortHandler)
                 	defer ts.Close()
                -
                -	tr := &Transport{DisableKeepAlives: false}
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                 
                 	if e, g := 0, len(tr.IdleConnKeysForTesting()); e != g {
                 		t.Errorf("After CloseIdleConnections expected %d idle conn cache keys; got %d", e, g)
                @@ -385,9 +378,11 @@
                 		}
                 	}))
                 	defer ts.Close()
                +
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                 	maxIdleConnsPerHost := 2
                -	tr := &Transport{DisableKeepAlives: false, MaxIdleConnsPerHost: maxIdleConnsPerHost}
                -	c := &Client{Transport: tr}
                +	tr.MaxIdleConnsPerHost = maxIdleConnsPerHost
                 
                 	// Start 3 outstanding requests and wait for the server to get them.
                 	// Their responses will hang until we write to resch, though.
                @@ -450,9 +445,8 @@
                 	}))
                 	defer ts.Close()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                 
                 	doReq := func(name string) string {
                 		// Do a POST instead of a GET to prevent the Transport's
                @@ -496,9 +490,7 @@
                 	defer afterTest(t)
                 	ts := httptest.NewServer(hostPortHandler)
                 	defer ts.Close()
                -
                -	tr := &Transport{}
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 
                 	fetch := func(n, retries int) string {
                 		condFatalf := func(format string, arg ...interface{}) {
                @@ -564,10 +556,7 @@
                 		conn.Close()
                 	}))
                 	defer ts.Close()
                -
                -	tr := &Transport{DisableKeepAlives: false}
                -	c := &Client{Transport: tr}
                -	defer tr.CloseIdleConnections()
                +	c := ts.Client()
                 
                 	// Do a bunch of traffic from different goroutines. Send to activityc
                 	// after each request completes, regardless of whether it failed.
                @@ -620,9 +609,8 @@
                 		w.WriteHeader(200)
                 	}))
                 	defer ts.Close()
                +	c := ts.Client()
                 
                -	tr := &Transport{DisableKeepAlives: false}
                -	c := &Client{Transport: tr}
                 	for i := 0; i < 2; i++ {
                 		res, err := c.Head(ts.URL)
                 		if err != nil {
                @@ -656,10 +644,7 @@
                 		w.WriteHeader(200)
                 	}))
                 	defer ts.Close()
                -
                -	tr := &Transport{DisableKeepAlives: false}
                -	c := &Client{Transport: tr}
                -	defer tr.CloseIdleConnections()
                +	c := ts.Client()
                 
                 	// Ensure that we wait for the readLoop to complete before
                 	// calling Head again
                @@ -720,6 +705,7 @@
                 		}
                 	}))
                 	defer ts.Close()
                +	tr := ts.Client().Transport.(*Transport)
                 
                 	for i, test := range roundTripTests {
                 		// Test basic request (no accept-encoding)
                @@ -727,7 +713,7 @@
                 		if test.accept != "" {
                 			req.Header.Set("Accept-Encoding", test.accept)
                 		}
                -		res, err := DefaultTransport.RoundTrip(req)
                +		res, err := tr.RoundTrip(req)
                 		var body []byte
                 		if test.compressed {
                 			var r *gzip.Reader
                @@ -792,10 +778,9 @@
                 		gz.Close()
                 	}))
                 	defer ts.Close()
                +	c := ts.Client()
                 
                 	for _, chunked := range []string{"1", "0"} {
                -		c := &Client{Transport: &Transport{}}
                -
                 		// First fetch something large, but only read some of it.
                 		res, err := c.Get(ts.URL + "/?body=large&chunked=" + chunked)
                 		if err != nil {
                @@ -845,7 +830,6 @@
                 	}
                 
                 	// And a HEAD request too, because they're always weird.
                -	c := &Client{Transport: &Transport{}}
                 	res, err := c.Head(ts.URL)
                 	if err != nil {
                 		t.Fatalf("Head: %v", err)
                @@ -915,11 +899,13 @@
                 		{path: "/timeout", body: []byte("hello"), sent: 5, status: 200},   // Timeout exceeded and entire body is sent.
                 	}
                 
                +	c := ts.Client()
                 	for i, v := range tests {
                -		tr := &Transport{ExpectContinueTimeout: 2 * time.Second}
                +		tr := &Transport{
                +			ExpectContinueTimeout: 2 * time.Second,
                +		}
                 		defer tr.CloseIdleConnections()
                -		c := &Client{Transport: tr}
                -
                +		c.Transport = tr
                 		body := bytes.NewReader(v.body)
                 		req, err := NewRequest("PUT", ts.URL+v.path, body)
                 		if err != nil {
                @@ -1016,7 +1002,8 @@
                 	if err != nil {
                 		t.Fatal(err)
                 	}
                -	c := &Client{Transport: &Transport{Proxy: ProxyURL(pu)}}
                +	c := ts.Client()
                +	c.Transport.(*Transport).Proxy = ProxyURL(pu)
                 	if _, err := c.Head(ts.URL); err != nil {
                 		t.Error(err)
                 	}
                @@ -1052,7 +1039,8 @@
                 	if err != nil {
                 		t.Fatal(err)
                 	}
                -	c := &Client{Transport: &Transport{Proxy: ProxyURL(pu)}}
                +	c := ts.Client()
                +	c.Transport.(*Transport).Proxy = ProxyURL(pu)
                 	if _, err := c.Head(ts.URL); err != nil {
                 		t.Error(err)
                 	}
                @@ -1122,9 +1110,7 @@
                 	}))
                 	defer ts.Close()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 	res, err := c.Get(ts.URL)
                 	if err != nil {
                 		t.Fatal(err)
                @@ -1152,9 +1138,7 @@
                 	}))
                 	defer ts.Close()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 	res, err := c.Get(ts.URL)
                 	if err != nil {
                 		t.Fatal(err)
                @@ -1195,9 +1179,8 @@
                 		w.WriteHeader(204)
                 	}))
                 	defer ts.Close()
                -
                -	tr := &Transport{}
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                 
                 	n0 := runtime.NumGoroutine()
                 
                @@ -1260,9 +1243,8 @@
                 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
                 	}))
                 	defer ts.Close()
                -
                -	tr := &Transport{}
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                 
                 	n0 := runtime.NumGoroutine()
                 	body := []byte("Hello")
                @@ -1294,8 +1276,7 @@
                 // This used to crash; https://golang.org/issue/3266
                 func TestTransportIdleConnCrash(t *testing.T) {
                 	defer afterTest(t)
                -	tr := &Transport{}
                -	c := &Client{Transport: tr}
                +	var tr *Transport
                 
                 	unblockCh := make(chan bool, 1)
                 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
                @@ -1303,6 +1284,8 @@
                 		tr.CloseIdleConnections()
                 	}))
                 	defer ts.Close()
                +	c := ts.Client()
                +	tr = c.Transport.(*Transport)
                 
                 	didreq := make(chan bool)
                 	go func() {
                @@ -1332,8 +1315,7 @@
                 		}
                 	}))
                 	defer ts.Close()
                -	tr := &Transport{}
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 	res, err := c.Get(ts.URL)
                 	if err != nil {
                 		t.Fatal(err)
                @@ -1358,8 +1340,7 @@
                 		Error(w, deniedMsg, StatusUnauthorized)
                 	}))
                 	defer ts.Close()
                -	tr := &Transport{}
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 	res, err := c.Post(ts.URL, "application/octet-stream", neverEnding('a'))
                 	if err != nil {
                 		t.Errorf("Post: %v", err)
                @@ -1383,8 +1364,8 @@
                 	}))
                 	defer ts.Close()
                 
                +	c := ts.Client()
                 	for _, closeBody := range []bool{true, false} {
                -		c := &Client{Transport: &Transport{}}
                 		const n = 4
                 		for i := 1; i <= n; i++ {
                 			res, err := c.Get(ts.URL)
                @@ -1424,10 +1405,7 @@
                 	SetPendingDialHooks(func() { wg.Add(1) }, wg.Done)
                 	defer SetPendingDialHooks(nil, nil)
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 	reqs := make(chan string)
                 	defer close(reqs)
                 
                @@ -1469,23 +1447,20 @@
                 		io.Copy(w, neverEnding('a'))
                 	})
                 	ts := httptest.NewServer(mux)
                +	defer ts.Close()
                 	timeout := 100 * time.Millisecond
                 
                -	client := &Client{
                -		Transport: &Transport{
                -			Dial: func(n, addr string) (net.Conn, error) {
                -				conn, err := net.Dial(n, addr)
                -				if err != nil {
                -					return nil, err
                -				}
                -				conn.SetDeadline(time.Now().Add(timeout))
                -				if debug {
                -					conn = NewLoggingConn("client", conn)
                -				}
                -				return conn, nil
                -			},
                -			DisableKeepAlives: true,
                -		},
                +	c := ts.Client()
                +	c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
                +		conn, err := net.Dial(n, addr)
                +		if err != nil {
                +			return nil, err
                +		}
                +		conn.SetDeadline(time.Now().Add(timeout))
                +		if debug {
                +			conn = NewLoggingConn("client", conn)
                +		}
                +		return conn, nil
                 	}
                 
                 	getFailed := false
                @@ -1497,7 +1472,7 @@
                 		if debug {
                 			println("run", i+1, "of", nRuns)
                 		}
                -		sres, err := client.Get(ts.URL + "/get")
                +		sres, err := c.Get(ts.URL + "/get")
                 		if err != nil {
                 			if !getFailed {
                 				// Make the timeout longer, once.
                @@ -1519,7 +1494,6 @@
                 	if debug {
                 		println("tests complete; waiting for handlers to finish")
                 	}
                -	ts.Close()
                 }
                 
                 func TestIssue4191_InfiniteGetToPutTimeout(t *testing.T) {
                @@ -1537,21 +1511,17 @@
                 	ts := httptest.NewServer(mux)
                 	timeout := 100 * time.Millisecond
                 
                -	client := &Client{
                -		Transport: &Transport{
                -			Dial: func(n, addr string) (net.Conn, error) {
                -				conn, err := net.Dial(n, addr)
                -				if err != nil {
                -					return nil, err
                -				}
                -				conn.SetDeadline(time.Now().Add(timeout))
                -				if debug {
                -					conn = NewLoggingConn("client", conn)
                -				}
                -				return conn, nil
                -			},
                -			DisableKeepAlives: true,
                -		},
                +	c := ts.Client()
                +	c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
                +		conn, err := net.Dial(n, addr)
                +		if err != nil {
                +			return nil, err
                +		}
                +		conn.SetDeadline(time.Now().Add(timeout))
                +		if debug {
                +			conn = NewLoggingConn("client", conn)
                +		}
                +		return conn, nil
                 	}
                 
                 	getFailed := false
                @@ -1563,7 +1533,7 @@
                 		if debug {
                 			println("run", i+1, "of", nRuns)
                 		}
                -		sres, err := client.Get(ts.URL + "/get")
                +		sres, err := c.Get(ts.URL + "/get")
                 		if err != nil {
                 			if !getFailed {
                 				// Make the timeout longer, once.
                @@ -1577,7 +1547,7 @@
                 			break
                 		}
                 		req, _ := NewRequest("PUT", ts.URL+"/put", sres.Body)
                -		_, err = client.Do(req)
                +		_, err = c.Do(req)
                 		if err == nil {
                 			sres.Body.Close()
                 			t.Errorf("Unexpected successful PUT")
                @@ -1609,11 +1579,8 @@
                 	ts := httptest.NewServer(mux)
                 	defer ts.Close()
                 
                -	tr := &Transport{
                -		ResponseHeaderTimeout: 500 * time.Millisecond,
                -	}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                +	c.Transport.(*Transport).ResponseHeaderTimeout = 500 * time.Millisecond
                 
                 	tests := []struct {
                 		path    string
                @@ -1680,9 +1647,8 @@
                 	defer ts.Close()
                 	defer close(unblockc)
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                 
                 	req, _ := NewRequest("GET", ts.URL, nil)
                 	res, err := c.Do(req)
                @@ -1790,9 +1756,8 @@
                 	defer ts.Close()
                 	defer close(unblockc)
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                 
                 	req, _ := NewRequest("GET", ts.URL, nil)
                 	ch := make(chan struct{})
                @@ -1849,9 +1814,7 @@
                 	defer ts.Close()
                 	defer close(unblockc)
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                 
                 	req, _ := NewRequest("GET", ts.URL, nil)
                 	if withCtx {
                @@ -1939,9 +1902,8 @@
                 	}))
                 	defer ts.Close()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                 
                 	req, _ := NewRequest("GET", ts.URL, nil)
                 	defer tr.CancelRequest(req)
                @@ -2061,18 +2023,12 @@
                 	defer ts.Close()
                 
                 	dialGate := make(chan bool, 1)
                -	tr := &Transport{
                -		Dial: func(n, addr string) (net.Conn, error) {
                -			if <-dialGate {
                -				return net.Dial(n, addr)
                -			}
                -			return nil, errors.New("manually closed")
                -		},
                -		DisableKeepAlives: false,
                -	}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{
                -		Transport: tr,
                +	c := ts.Client()
                +	c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
                +		if <-dialGate {
                +			return net.Dial(n, addr)
                +		}
                +		return nil, errors.New("manually closed")
                 	}
                 
                 	dialGate <- true // only allow one dial
                @@ -2326,14 +2282,11 @@
                 	SetReadLoopBeforeNextReadHook(func() { didRead <- true })
                 	defer SetReadLoopBeforeNextReadHook(nil)
                 
                -	tr := &Transport{
                -		Dial: func(netw, addr string) (net.Conn, error) {
                -			return net.Dial(netw, ts.Listener.Addr().String())
                -		},
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                +	tr.Dial = func(netw, addr string) (net.Conn, error) {
                +		return net.Dial(netw, ts.Listener.Addr().String())
                 	}
                -	defer tr.CloseIdleConnections()
                -
                -	c := &Client{Transport: tr}
                 
                 	// First, without keep-alives.
                 	for _, disableKeep := range []bool{true, false} {
                @@ -2376,13 +2329,11 @@
                 	}))
                 	defer ts.Close()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	cl := &Client{Transport: tr}
                +	c := ts.Client()
                 
                 	closes := 0
                 
                -	res, err := cl.Post(ts.URL, "text/plain", countCloseReader{&closes, strings.NewReader("hello")})
                +	res, err := c.Post(ts.URL, "text/plain", countCloseReader{&closes, strings.NewReader("hello")})
                 	if err != nil {
                 		t.Fatal(err)
                 	}
                @@ -2468,20 +2419,16 @@
                 		fmt.Fprintf(w, "hello")
                 	}))
                 	defer ts.Close()
                -	tr := &Transport{
                -		TLSClientConfig: &tls.Config{
                -			InsecureSkipVerify: true,
                -		},
                -	}
                -	defer tr.CloseIdleConnections()
                -	client := &Client{Transport: tr}
                +
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                 
                 	var nSuccess = 0
                 	var errs []error
                 	const trials = 20
                 	for i := 0; i < trials; i++ {
                 		tr.CloseIdleConnections()
                -		res, err := client.Get(ts.URL + "/keep-alive-then-die")
                +		res, err := c.Get(ts.URL + "/keep-alive-then-die")
                 		if err != nil {
                 			t.Fatal(err)
                 		}
                @@ -2496,7 +2443,7 @@
                 
                 		// Now try again and see if we successfully
                 		// pick a new connection.
                -		res, err = client.Get(ts.URL + "/")
                +		res, err = c.Get(ts.URL + "/")
                 		if err != nil {
                 			errs = append(errs, err)
                 			continue
                @@ -2575,22 +2522,20 @@
                 		go io.Copy(ioutil.Discard, conn)
                 	}))
                 	defer ts.Close()
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	client := &Client{Transport: tr}
                +	c := ts.Client()
                 
                 	const bodySize = 256 << 10
                 	finalBit := make(byteFromChanReader, 1)
                 	req, _ := NewRequest("POST", ts.URL, io.MultiReader(io.LimitReader(neverEnding('x'), bodySize-1), finalBit))
                 	req.ContentLength = bodySize
                -	res, err := client.Do(req)
                +	res, err := c.Do(req)
                 	if err := wantBody(res, err, "foo"); err != nil {
                 		t.Errorf("POST response: %v", err)
                 	}
                 	donec := make(chan bool)
                 	go func() {
                 		defer close(donec)
                -		res, err = client.Get(ts.URL)
                +		res, err = c.Get(ts.URL)
                 		if err := wantBody(res, err, "bar"); err != nil {
                 			t.Errorf("GET response: %v", err)
                 			return
                @@ -2622,10 +2567,9 @@
                 		conn.Close()
                 	}))
                 	defer ts.Close()
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	cl := &Client{Transport: tr}
                -	res, err := cl.Get(ts.URL)
                +	c := ts.Client()
                +
                +	res, err := c.Get(ts.URL)
                 	if err != nil {
                 		t.Fatalf("Get: %v", err)
                 	}
                @@ -2686,29 +2630,26 @@
                 	defer ts.Close()
                 
                 	var writeNumAtomic int32
                -	tr := &Transport{
                -		Dial: func(network, addr string) (net.Conn, error) {
                -			logf("Dial")
                -			c, err := net.Dial(network, ts.Listener.Addr().String())
                -			if err != nil {
                -				logf("Dial error: %v", err)
                -				return nil, err
                -			}
                -			return &writerFuncConn{
                -				Conn: c,
                -				write: func(p []byte) (n int, err error) {
                -					if atomic.AddInt32(&writeNumAtomic, 1) == 2 {
                -						logf("intentional write failure")
                -						return 0, errors.New("second write fails")
                -					}
                -					logf("Write(%q)", p)
                -					return c.Write(p)
                -				},
                -			}, nil
                -		},
                +	c := ts.Client()
                +	c.Transport.(*Transport).Dial = func(network, addr string) (net.Conn, error) {
                +		logf("Dial")
                +		c, err := net.Dial(network, ts.Listener.Addr().String())
                +		if err != nil {
                +			logf("Dial error: %v", err)
                +			return nil, err
                +		}
                +		return &writerFuncConn{
                +			Conn: c,
                +			write: func(p []byte) (n int, err error) {
                +				if atomic.AddInt32(&writeNumAtomic, 1) == 2 {
                +					logf("intentional write failure")
                +					return 0, errors.New("second write fails")
                +				}
                +				logf("Write(%q)", p)
                +				return c.Write(p)
                +			},
                +		}, nil
                 	}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                 
                 	SetRoundTripRetried(func() {
                 		logf("Retried.")
                @@ -2752,6 +2693,7 @@
                 		readBody <- err
                 	}))
                 	defer ts.Close()
                +	c := ts.Client()
                 	fakeErr := errors.New("fake error")
                 	didClose := make(chan bool, 1)
                 	req, _ := NewRequest("POST", ts.URL, struct {
                @@ -2767,7 +2709,7 @@
                 			return nil
                 		}),
                 	})
                -	res, err := DefaultClient.Do(req)
                +	res, err := c.Do(req)
                 	if res != nil {
                 		defer res.Body.Close()
                 	}
                @@ -2801,23 +2743,19 @@
                 		mu.Unlock()
                 	}))
                 	defer ts.Close()
                -	tr := &Transport{
                -		DialTLS: func(netw, addr string) (net.Conn, error) {
                -			mu.Lock()
                -			didDial = true
                -			mu.Unlock()
                -			c, err := tls.Dial(netw, addr, &tls.Config{
                -				InsecureSkipVerify: true,
                -			})
                -			if err != nil {
                -				return nil, err
                -			}
                -			return c, c.Handshake()
                -		},
                +	c := ts.Client()
                +	c.Transport.(*Transport).DialTLS = func(netw, addr string) (net.Conn, error) {
                +		mu.Lock()
                +		didDial = true
                +		mu.Unlock()
                +		c, err := tls.Dial(netw, addr, c.Transport.(*Transport).TLSClientConfig)
                +		if err != nil {
                +			return nil, err
                +		}
                +		return c, c.Handshake()
                 	}
                -	defer tr.CloseIdleConnections()
                -	client := &Client{Transport: tr}
                -	res, err := client.Get(ts.URL)
                +
                +	res, err := c.Get(ts.URL)
                 	if err != nil {
                 		t.Fatal(err)
                 	}
                @@ -2899,10 +2837,11 @@
                 		reqc <- r
                 	}))
                 	defer ts.Close()
                +	c := ts.Client()
                 
                 	req, _ := NewRequest("GET", ts.URL, nil)
                 	req.Header.Set("Range", "bytes=7-11")
                -	res, err := DefaultClient.Do(req)
                +	res, err := c.Do(req)
                 	if err != nil {
                 		t.Fatal(err)
                 	}
                @@ -2931,9 +2870,7 @@
                 		w.Write(b[:])
                 	}))
                 	defer ts.Close()
                -
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                +	tr := ts.Client().Transport.(*Transport)
                 
                 	req, err := NewRequest("GET", ts.URL, nil)
                 	if err != nil {
                @@ -2967,9 +2904,7 @@
                 
                 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
                 	defer ts.Close()
                -
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                +	tr := ts.Client().Transport.(*Transport)
                 
                 	req, err := NewRequest("GET", ts.URL, nil)
                 	if err != nil {
                @@ -3096,6 +3031,7 @@
                 		w.WriteHeader(StatusOK)
                 	}))
                 	defer ts.Close()
                +	c := ts.Client()
                 
                 	fail := 0
                 	count := 100
                @@ -3105,10 +3041,7 @@
                 		if err != nil {
                 			t.Fatal(err)
                 		}
                -		tr := new(Transport)
                -		defer tr.CloseIdleConnections()
                -		client := &Client{Transport: tr}
                -		resp, err := client.Do(req)
                +		resp, err := c.Do(req)
                 		if err != nil {
                 			fail++
                 			t.Logf("%d = %#v", i, err)
                @@ -3321,10 +3254,8 @@
                 		w.Write(rgz) // arbitrary gzip response
                 	}))
                 	defer ts.Close()
                +	c := ts.Client()
                 
                -	tr := &Transport{}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                 	for i := 0; i < 2; i++ {
                 		res, err := c.Get(ts.URL)
                 		if err != nil {
                @@ -3353,12 +3284,9 @@
                 		}
                 	}))
                 	defer ts.Close()
                +	c := ts.Client()
                +	c.Transport.(*Transport).MaxResponseHeaderBytes = 512 << 10
                 
                -	tr := &Transport{
                -		MaxResponseHeaderBytes: 512 << 10,
                -	}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                 	if res, err := c.Get(ts.URL); err != nil {
                 		t.Fatal(err)
                 	} else {
                @@ -3619,8 +3547,8 @@
                 // connections. The http2 test is done in TestTransportEventTrace_h2
                 func TestTLSHandshakeTrace(t *testing.T) {
                 	defer afterTest(t)
                -	s := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
                -	defer s.Close()
                +	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
                +	defer ts.Close()
                 
                 	var mu sync.Mutex
                 	var start, done bool
                @@ -3640,10 +3568,8 @@
                 		},
                 	}
                 
                -	tr := &Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                -	req, err := NewRequest("GET", s.URL, nil)
                +	c := ts.Client()
                +	req, err := NewRequest("GET", ts.URL, nil)
                 	if err != nil {
                 		t.Fatal("Unable to construct test request:", err)
                 	}
                @@ -3670,16 +3596,14 @@
                 		// No body for convenience.
                 	}))
                 	defer ts.Close()
                -	tr := &Transport{
                -		MaxIdleConns: 4,
                -	}
                -	defer tr.CloseIdleConnections()
                +	c := ts.Client()
                +	tr := c.Transport.(*Transport)
                +	tr.MaxIdleConns = 4
                 
                 	ip, port, err := net.SplitHostPort(ts.Listener.Addr().String())
                 	if err != nil {
                 		t.Fatal(err)
                 	}
                -	c := &Client{Transport: tr}
                 	ctx := context.WithValue(context.Background(), nettrace.LookupIPAltResolverKey{}, func(ctx context.Context, host string) ([]net.IPAddr, error) {
                 		return []net.IPAddr{{IP: net.ParseIP(ip)}}, nil
                 	})
                @@ -3975,17 +3899,16 @@
                 		c.Close()
                 	}))
                 	defer ts.Close()
                -	tr := &Transport{
                -		ProxyConnectHeader: Header{
                -			"User-Agent": {"foo"},
                -			"Other":      {"bar"},
                -		},
                -		Proxy: func(r *Request) (*url.URL, error) {
                -			return url.Parse(ts.URL)
                -		},
                +
                +	c := ts.Client()
                +	c.Transport.(*Transport).Proxy = func(r *Request) (*url.URL, error) {
                +		return url.Parse(ts.URL)
                 	}
                -	defer tr.CloseIdleConnections()
                -	c := &Client{Transport: tr}
                +	c.Transport.(*Transport).ProxyConnectHeader = Header{
                +		"User-Agent": {"foo"},
                +		"Other":      {"bar"},
                +	}
                +
                 	res, err := c.Get("https://dummy.tld/") // https to force a CONNECT
                 	if err == nil {
                 		res.Body.Close()
                

                To view, visit change 37771. To unsubscribe, visit settings.

                Gerrit-Project: go
                Gerrit-Branch: master
                Gerrit-MessageType: newpatchset
                Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                Gerrit-Change-Number: 37771
                Gerrit-PatchSet: 3

                Johan Brandhorst (Gerrit)

                unread,
                Mar 8, 2017, 4:42:27 AM3/8/17
                to Brad Fitzpatrick, Gobot Gobot, golang-co...@googlegroups.com

                Johan Brandhorst posted comments on this change.

                View Change

                Patch set 3:

                Patch Set 2:

                (2 comments)

                Patch Set 2:

                Please fix the failure. Looks like you have a Transport not shutting down its idle connections.

                Ok!

                I've added back explicit *Transport.CloseIdleConnection calls in the places where goroutines are measured, as I think is it what was causing the failure.

                  To view, visit change 37771. To unsubscribe, visit settings.

                  Gerrit-Project: go
                  Gerrit-Branch: master
                  Gerrit-MessageType: comment
                  Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                  Gerrit-Change-Number: 37771
                  Gerrit-PatchSet: 3
                  Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
                  Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
                  Gerrit-Reviewer: Gobot Gobot <go...@golang.org>
                  Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
                  Gerrit-Comment-Date: Wed, 08 Mar 2017 09:42:24 +0000
                  Gerrit-HasComments: No

                  Brad Fitzpatrick (Gerrit)

                  unread,
                  Mar 8, 2017, 10:21:35 AM3/8/17
                  to Johan Brandhorst, Brad Fitzpatrick, Gobot Gobot, golang-co...@googlegroups.com

                  Brad Fitzpatrick posted comments on this change.

                  View Change

                  Patch set 3:Run-TryBot +1

                    To view, visit change 37771. To unsubscribe, visit settings.

                    Gerrit-Project: go
                    Gerrit-Branch: master
                    Gerrit-MessageType: comment
                    Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                    Gerrit-Change-Number: 37771
                    Gerrit-PatchSet: 3
                    Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
                    Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
                    Gerrit-Reviewer: Gobot Gobot <go...@golang.org>
                    Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
                    Gerrit-Comment-Date: Wed, 08 Mar 2017 15:21:33 +0000
                    Gerrit-HasComments: No

                    Gobot Gobot (Gerrit)

                    unread,
                    Mar 8, 2017, 10:22:19 AM3/8/17
                    to Johan Brandhorst, Brad Fitzpatrick, golang-co...@googlegroups.com

                    Gobot Gobot posted comments on this change.

                    View Change

                    Patch set 3:

                    TryBots beginning. Status page: http://farmer.golang.org/try?commit=dbcdd62f

                      To view, visit change 37771. To unsubscribe, visit settings.

                      Gerrit-Project: go
                      Gerrit-Branch: master
                      Gerrit-MessageType: comment
                      Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                      Gerrit-Change-Number: 37771
                      Gerrit-PatchSet: 3
                      Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
                      Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
                      Gerrit-Reviewer: Gobot Gobot <go...@golang.org>
                      Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
                      Gerrit-Comment-Date: Wed, 08 Mar 2017 15:22:17 +0000
                      Gerrit-HasComments: No

                      Gobot Gobot (Gerrit)

                      unread,
                      Mar 8, 2017, 10:25:09 AM3/8/17
                      to Johan Brandhorst, Brad Fitzpatrick, golang-co...@googlegroups.com

                      Gobot Gobot posted comments on this change.

                      View Change

                      Patch set 3:

                      Build is still in progress... This change failed on openbsd-amd64-60: See https://storage.googleapis.com/go-build-log/dbcdd62f/openbsd-amd64-60_97787251.log

                      Consult https://build.golang.org/ to see whether it's a new failure. Other builds still in progress; subsequent failure notices suppressed until final report.

                        To view, visit change 37771. To unsubscribe, visit settings.

                        Gerrit-Project: go
                        Gerrit-Branch: master
                        Gerrit-MessageType: comment
                        Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                        Gerrit-Change-Number: 37771
                        Gerrit-PatchSet: 3
                        Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
                        Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
                        Gerrit-Reviewer: Gobot Gobot <go...@golang.org>
                        Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
                        Gerrit-Comment-Date: Wed, 08 Mar 2017 15:25:07 +0000
                        Gerrit-HasComments: No

                        Gobot Gobot (Gerrit)

                        unread,
                        Mar 8, 2017, 10:30:00 AM3/8/17
                        to Johan Brandhorst, Brad Fitzpatrick, golang-co...@googlegroups.com

                        Gobot Gobot posted comments on this change.

                        View Change

                        Patch set 3:TryBot-Result -1

                        1 of 17 TryBots failed: Failed on openbsd-amd64-60: https://storage.googleapis.com/go-build-log/dbcdd62f/openbsd-amd64-60_97787251.log

                        Consult https://build.golang.org/ to see whether they are new failures.

                          To view, visit change 37771. To unsubscribe, visit settings.

                          Gerrit-Project: go
                          Gerrit-Branch: master
                          Gerrit-MessageType: comment
                          Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                          Gerrit-Change-Number: 37771
                          Gerrit-PatchSet: 3
                          Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
                          Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
                          Gerrit-Reviewer: Gobot Gobot <go...@golang.org>
                          Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
                          Gerrit-Comment-Date: Wed, 08 Mar 2017 15:29:58 +0000
                          Gerrit-HasComments: No

                          Johan Brandhorst (Gerrit)

                          unread,
                          Mar 8, 2017, 10:35:41 AM3/8/17
                          to Gobot Gobot, Brad Fitzpatrick, golang-co...@googlegroups.com

                          Johan Brandhorst posted comments on this change.

                          View Change

                          Patch set 3:

                          Patch Set 3: TryBot-Result-1

                          1 of 17 TryBots failed: Failed on openbsd-amd64-60: https://storage.googleapis.com/go-build-log/dbcdd62f/openbsd-amd64-60_97787251.log

                          Consult https://build.golang.org/ to see whether they are new failures.

                          This couldn't possibly be caused by my change could it?

                            To view, visit change 37771. To unsubscribe, visit settings.

                            Gerrit-Project: go
                            Gerrit-Branch: master
                            Gerrit-MessageType: comment
                            Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                            Gerrit-Change-Number: 37771
                            Gerrit-PatchSet: 3
                            Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
                            Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
                            Gerrit-Reviewer: Gobot Gobot <go...@golang.org>
                            Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
                            Gerrit-Comment-Date: Wed, 08 Mar 2017 15:35:38 +0000
                            Gerrit-HasComments: No

                            Brad Fitzpatrick (Gerrit)

                            unread,
                            Mar 8, 2017, 10:46:26 AM3/8/17
                            to Johan Brandhorst, Brad Fitzpatrick, Gobot Gobot, golang-co...@googlegroups.com

                            Brad Fitzpatrick posted comments on this change.

                            View Change

                            Patch set 3:

                            Filed https://github.com/golang/go/issues/19459 for the context flake.

                              To view, visit change 37771. To unsubscribe, visit settings.

                              Gerrit-Project: go
                              Gerrit-Branch: master
                              Gerrit-MessageType: comment
                              Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                              Gerrit-Change-Number: 37771
                              Gerrit-PatchSet: 3
                              Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
                              Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
                              Gerrit-Reviewer: Gobot Gobot <go...@golang.org>
                              Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
                              Gerrit-Comment-Date: Wed, 08 Mar 2017 15:46:24 +0000
                              Gerrit-HasComments: No

                              Brad Fitzpatrick (Gerrit)

                              unread,
                              Mar 8, 2017, 10:51:04 AM3/8/17
                              to Johan Brandhorst, Brad Fitzpatrick, Gobot Gobot, golang-co...@googlegroups.com

                              Brad Fitzpatrick removed a vote from this change.

                              View Change

                              Removed TryBot-Result-1 by Gobot Gobot <go...@golang.org>

                              To view, visit change 37771. To unsubscribe, visit settings.

                              Gerrit-Project: go
                              Gerrit-Branch: master
                              Gerrit-MessageType: deleteVote
                              Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                              Gerrit-Change-Number: 37771

                              Brad Fitzpatrick (Gerrit)

                              unread,
                              Mar 8, 2017, 10:51:50 AM3/8/17
                              to Johan Brandhorst, Brad Fitzpatrick, Gobot Gobot, golang-co...@googlegroups.com

                              Brad Fitzpatrick posted comments on this change.

                              View Change

                              Patch set 3:Code-Review +2

                              This is great, thanks again!

                                To view, visit change 37771. To unsubscribe, visit settings.

                                Gerrit-Project: go
                                Gerrit-Branch: master
                                Gerrit-MessageType: comment
                                Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                                Gerrit-Change-Number: 37771
                                Gerrit-PatchSet: 3
                                Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
                                Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
                                Gerrit-Reviewer: Gobot Gobot <go...@golang.org>
                                Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
                                Gerrit-Comment-Date: Wed, 08 Mar 2017 15:51:44 +0000
                                Gerrit-HasComments: No

                                Brad Fitzpatrick (Gerrit)

                                unread,
                                Mar 8, 2017, 10:51:51 AM3/8/17
                                to Brad Fitzpatrick, Johan Brandhorst, golang-...@googlegroups.com, Gobot Gobot, golang-co...@googlegroups.com

                                Brad Fitzpatrick merged this change.

                                View Change

                                Approvals: Brad Fitzpatrick: Looks good to me, approved; Run TryBots
                                net/http: use httptest.Server Client in tests
                                
                                After merging https://go-review.googlesource.com/c/34639/
                                ,
                                it was pointed out to me that a lot of tests under net/http
                                could use the new functionality to simplify and unify testing.
                                
                                Using the httptest.Server provided Client removes the need to
                                call CloseIdleConnections() on all Transports created, as it
                                is automatically called on the Transport associated with the
                                client when Server.Close() is called.
                                
                                Change the transport used by the non-TLS
                                httptest.Server to a new *http.Transport rather than using
                                http.DefaultTransport implicitly. The TLS version already
                                used its own *http.Transport. This change is to prevent
                                concurrency problems with using DefaultTransport implicitly
                                across several httptest.Server's.
                                
                                Add tests to ensure the httptest.Server.Client().Transport
                                RoundTripper interface is implemented by a *http.Transport,
                                as is now assumed across large parts of net/http tests.
                                
                                Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                                Reviewed-on: https://go-review.googlesource.com/37771
                                Run-TryBot: Brad Fitzpatrick <brad...@golang.org>
                                Reviewed-by: Brad Fitzpatrick <brad...@golang.org>
                                ---
                                M src/net/http/client_test.go
                                M src/net/http/fs_test.go
                                M src/net/http/httptest/server.go
                                M src/net/http/httptest/server_test.go
                                M src/net/http/httputil/reverseproxy_test.go
                                M src/net/http/main_test.go
                                M src/net/http/npn_test.go
                                M src/net/http/serve_test.go
                                M src/net/http/transport_test.go
                                9 files changed, 321 insertions(+), 456 deletions(-)
                                
                                
                                diff --git a/src/net/http/client_test.go b/src/net/http/client_test.go
                                index c75456a..73f2221 100644
                                --- a/src/net/http/client_test.go
                                +++ b/src/net/http/client_test.go
                                @@ -10,7 +10,6 @@
                                 	"bytes"
                                 	"context"
                                 	"crypto/tls"
                                -	"crypto/x509"
                                 	"encoding/base64"
                                 	"errors"
                                 	"fmt"
                                @@ -73,7 +72,7 @@
                                 	ts := httptest.NewServer(robotsTxtHandler)
                                 	defer ts.Close()
                                 
                                -	c := &Client{Transport: &Transport{DisableKeepAlives: true}}
                                +	c := ts.Client()
                                 	r, err := c.Get(ts.URL)
                                 	var b []byte
                                 	if err == nil {
                                @@ -220,10 +219,7 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 	_, err := c.Get(ts.URL)
                                 	if e, g := "Get /?n=10: stopped after 10 redirects", fmt.Sprintf("%v", err); e != g {
                                 		t.Errorf("with default client Get, expected error %q, got %q", e, g)
                                @@ -252,13 +248,10 @@
                                 	var checkErr error
                                 	var lastVia []*Request
                                 	var lastReq *Request
                                -	c = &Client{
                                -		Transport: tr,
                                -		CheckRedirect: func(req *Request, via []*Request) error {
                                -			lastReq = req
                                -			lastVia = via
                                -			return checkErr
                                -		},
                                +	c.CheckRedirect = func(req *Request, via []*Request) error {
                                +		lastReq = req
                                +		lastVia = via
                                +		return checkErr
                                 	}
                                 	res, err := c.Get(ts.URL)
                                 	if err != nil {
                                @@ -313,21 +306,16 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -
                                 	ctx, cancel := context.WithCancel(context.Background())
                                -	c := &Client{
                                -		Transport: tr,
                                -		CheckRedirect: func(req *Request, via []*Request) error {
                                -			cancel()
                                -			select {
                                -			case <-req.Context().Done():
                                -				return nil
                                -			case <-time.After(5 * time.Second):
                                -				return errors.New("redirected request's context never expired after root request canceled")
                                -			}
                                -		},
                                +	c := ts.Client()
                                +	c.CheckRedirect = func(req *Request, via []*Request) error {
                                +		cancel()
                                +		select {
                                +		case <-req.Context().Done():
                                +			return nil
                                +		case <-time.After(5 * time.Second):
                                +			return errors.New("redirected request's context never expired after root request canceled")
                                +		}
                                 	}
                                 	req, _ := NewRequest("GET", ts.URL, nil)
                                 	req = req.WithContext(ctx)
                                @@ -461,11 +449,12 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                +	c := ts.Client()
                                 	for _, tt := range table {
                                 		content := tt.redirectBody
                                 		req, _ := NewRequest(method, ts.URL+tt.suffix, strings.NewReader(content))
                                 		req.GetBody = func() (io.ReadCloser, error) { return ioutil.NopCloser(strings.NewReader(content)), nil }
                                -		res, err := DefaultClient.Do(req)
                                +		res, err := c.Do(req)
                                 
                                 		if err != nil {
                                 			t.Fatal(err)
                                @@ -519,17 +508,12 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -
                                -	c := &Client{
                                -		Transport: tr,
                                -		CheckRedirect: func(req *Request, via []*Request) error {
                                -			if req.Response == nil {
                                -				t.Error("expected non-nil Request.Response")
                                -			}
                                -			return ErrUseLastResponse
                                -		},
                                +	c := ts.Client()
                                +	c.CheckRedirect = func(req *Request, via []*Request) error {
                                +		if req.Response == nil {
                                +			t.Error("expected non-nil Request.Response")
                                +		}
                                +		return ErrUseLastResponse
                                 	}
                                 	res, err := c.Get(ts.URL)
                                 	if err != nil {
                                @@ -558,7 +542,7 @@
                                 		w.WriteHeader(308)
                                 	}))
                                 	defer ts.Close()
                                -	c := &Client{Transport: &Transport{DisableKeepAlives: true}}
                                +	c := ts.Client()
                                 	res, err := c.Get(ts.URL)
                                 	if err != nil {
                                 		t.Fatal(err)
                                @@ -586,7 +570,7 @@
                                 	if err != nil {
                                 		t.Fatal(err)
                                 	}
                                -	c := &Client{Transport: &Transport{DisableKeepAlives: true}}
                                +	c := ts.Client()
                                 	req.GetBody = nil // so it can't rewind.
                                 	res, err := c.Do(req)
                                 	if err != nil {
                                @@ -678,12 +662,8 @@
                                 	var ts *httptest.Server
                                 	ts = httptest.NewServer(echoCookiesRedirectHandler)
                                 	defer ts.Close()
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{
                                -		Transport: tr,
                                -		Jar:       new(TestJar),
                                -	}
                                +	c := ts.Client()
                                +	c.Jar = new(TestJar)
                                 	u, _ := url.Parse(ts.URL)
                                 	c.Jar.SetCookies(u, []*Cookie{expectedCookies[0]})
                                 	resp, err := c.Get(ts.URL)
                                @@ -727,13 +707,10 @@
                                 	}))
                                 	defer ts.Close()
                                 	jar := new(RecordingJar)
                                -	c := &Client{
                                -		Jar: jar,
                                -		Transport: &Transport{
                                -			Dial: func(_ string, _ string) (net.Conn, error) {
                                -				return net.Dial("tcp", ts.Listener.Addr().String())
                                -			},
                                -		},
                                +	c := ts.Client()
                                +	c.Jar = jar
                                +	c.Transport.(*Transport).Dial = func(_ string, _ string) (net.Conn, error) {
                                +		return net.Dial("tcp", ts.Listener.Addr().String())
                                 	}
                                 	_, err := c.Get("http://firsthost.fake/")
                                 	if err != nil {
                                @@ -845,7 +822,8 @@
                                 		}
                                 		return c, err
                                 	}
                                -	c := &Client{Transport: &Transport{Dial: dialer}}
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).Dial = dialer
                                 
                                 	_, err := c.Get(ts.URL)
                                 	if err != nil {
                                @@ -878,14 +856,11 @@
                                 	// TODO(bradfitz): add tests for skipping hostname checks too?
                                 	// would require a new cert for testing, and probably
                                 	// redundant with these tests.
                                +	c := ts.Client()
                                 	for _, insecure := range []bool{true, false} {
                                -		tr := &Transport{
                                -			TLSClientConfig: &tls.Config{
                                -				InsecureSkipVerify: insecure,
                                -			},
                                +		c.Transport.(*Transport).TLSClientConfig = &tls.Config{
                                +			InsecureSkipVerify: insecure,
                                 		}
                                -		defer tr.CloseIdleConnections()
                                -		c := &Client{Transport: tr}
                                 		res, err := c.Get(ts.URL)
                                 		if (err == nil) != insecure {
                                 			t.Errorf("insecure=%v: got unexpected err=%v", insecure, err)
                                @@ -919,22 +894,6 @@
                                 	}
                                 }
                                 
                                -func newTLSTransport(t *testing.T, ts *httptest.Server) *Transport {
                                -	certs := x509.NewCertPool()
                                -	for _, c := range ts.TLS.Certificates {
                                -		roots, err := x509.ParseCertificates(c.Certificate[len(c.Certificate)-1])
                                -		if err != nil {
                                -			t.Fatalf("error parsing server's root cert: %v", err)
                                -		}
                                -		for _, root := range roots {
                                -			certs.AddCert(root)
                                -		}
                                -	}
                                -	return &Transport{
                                -		TLSClientConfig: &tls.Config{RootCAs: certs},
                                -	}
                                -}
                                -
                                 func TestClientWithCorrectTLSServerName(t *testing.T) {
                                 	defer afterTest(t)
                                 
                                @@ -946,9 +905,8 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	trans := newTLSTransport(t, ts)
                                -	trans.TLSClientConfig.ServerName = serverName
                                -	c := &Client{Transport: trans}
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).TLSClientConfig.ServerName = serverName
                                 	if _, err := c.Get(ts.URL); err != nil {
                                 		t.Fatalf("expected successful TLS connection, got error: %v", err)
                                 	}
                                @@ -961,9 +919,8 @@
                                 	errc := make(chanWriter, 10) // but only expecting 1
                                 	ts.Config.ErrorLog = log.New(errc, "", 0)
                                 
                                -	trans := newTLSTransport(t, ts)
                                -	trans.TLSClientConfig.ServerName = "badserver"
                                -	c := &Client{Transport: trans}
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).TLSClientConfig.ServerName = "badserver"
                                 	_, err := c.Get(ts.URL)
                                 	if err == nil {
                                 		t.Fatalf("expected an error")
                                @@ -997,13 +954,12 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	tr := newTLSTransport(t, ts)
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                 	tr.TLSClientConfig.ServerName = "example.com" // one of httptest's Server cert names
                                 	tr.Dial = func(netw, addr string) (net.Conn, error) {
                                 		return net.Dial(netw, ts.Listener.Addr().String())
                                 	}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                 	res, err := c.Get("https://some-other-host.tld/")
                                 	if err != nil {
                                 		t.Fatal(err)
                                @@ -1018,13 +974,12 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	tr := newTLSTransport(t, ts)
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                 	tr.TLSClientConfig.CipherSuites = []uint16{tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA}
                                 	tr.Dial = func(netw, addr string) (net.Conn, error) {
                                 		return net.Dial(netw, ts.Listener.Addr().String())
                                 	}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                 	res, err := c.Get("https://example.com/")
                                 	if err != nil {
                                 		t.Fatal(err)
                                @@ -1119,14 +1074,12 @@
                                 		}
                                 	}))
                                 	defer ts.Close()
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                 	req, err := NewRequest("GET", ts.URL, nil)
                                 	if err != nil {
                                 		t.Fatal(err)
                                 	}
                                 	req.URL.User = url.User(gopher)
                                +	c := ts.Client()
                                 	resp, err := c.Do(req)
                                 	if err != nil {
                                 		t.Fatal(err)
                                @@ -1503,21 +1456,17 @@
                                 	defer ts2.Close()
                                 	ts2URL = ts2.URL
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{
                                -		Transport: tr,
                                -		CheckRedirect: func(r *Request, via []*Request) error {
                                -			want := Header{
                                -				"User-Agent": []string{ua},
                                -				"X-Foo":      []string{xfoo},
                                -				"Referer":    []string{ts2URL},
                                -			}
                                -			if !reflect.DeepEqual(r.Header, want) {
                                -				t.Errorf("CheckRedirect Request.Header = %#v; want %#v", r.Header, want)
                                -			}
                                -			return nil
                                -		},
                                +	c := ts1.Client()
                                +	c.CheckRedirect = func(r *Request, via []*Request) error {
                                +		want := Header{
                                +			"User-Agent": []string{ua},
                                +			"X-Foo":      []string{xfoo},
                                +			"Referer":    []string{ts2URL},
                                +		}
                                +		if !reflect.DeepEqual(r.Header, want) {
                                +			t.Errorf("CheckRedirect Request.Header = %#v; want %#v", r.Header, want)
                                +		}
                                +		return nil
                                 	}
                                 
                                 	req, _ := NewRequest("GET", ts2.URL, nil)
                                @@ -1606,13 +1555,9 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                 	jar, _ := cookiejar.New(nil)
                                -	c := &Client{
                                -		Transport: tr,
                                -		Jar:       jar,
                                -	}
                                +	c := ts.Client()
                                +	c.Jar = jar
                                 
                                 	u, _ := url.Parse(ts.URL)
                                 	req, _ := NewRequest("GET", ts.URL, nil)
                                @@ -1730,9 +1675,7 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -
                                +	c := ts.Client()
                                 	for i, tt := range tests {
                                 		handlerc <- func(w ResponseWriter, r *Request) {
                                 			w.Header().Set("Location", ts.URL)
                                @@ -1745,7 +1688,6 @@
                                 			continue
                                 		}
                                 
                                -		c := &Client{Transport: tr}
                                 		c.CheckRedirect = func(req *Request, via []*Request) error {
                                 			if got, want := req.Method, tt.wantMethod; got != want {
                                 				return fmt.Errorf("#%d: got next method %q; want %q", i, got, want)
                                @@ -1799,9 +1741,8 @@
                                 		w.Header().Set("X-Body-Read", fmt.Sprintf("%v, %v", n, err))
                                 	}))
                                 	defer ts.Close()
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                 
                                 	// Do one initial successful request to create an idle TCP connection
                                 	// for the subsequent request to reuse. (The Transport only retries
                                diff --git a/src/net/http/fs_test.go b/src/net/http/fs_test.go
                                index 1de1cd5..e12350e 100644
                                --- a/src/net/http/fs_test.go
                                +++ b/src/net/http/fs_test.go
                                @@ -74,6 +74,7 @@
                                 		ServeFile(w, r, "testdata/file")
                                 	}))
                                 	defer ts.Close()
                                +	c := ts.Client()
                                 
                                 	var err error
                                 
                                @@ -91,7 +92,7 @@
                                 	req.Method = "GET"
                                 
                                 	// straight GET
                                -	_, body := getBody(t, "straight get", req)
                                +	_, body := getBody(t, "straight get", req, c)
                                 	if !bytes.Equal(body, file) {
                                 		t.Fatalf("body mismatch: got %q, want %q", body, file)
                                 	}
                                @@ -102,7 +103,7 @@
                                 		if rt.r != "" {
                                 			req.Header.Set("Range", rt.r)
                                 		}
                                -		resp, body := getBody(t, fmt.Sprintf("range test %q", rt.r), req)
                                +		resp, body := getBody(t, fmt.Sprintf("range test %q", rt.r), req, c)
                                 		if resp.StatusCode != rt.code {
                                 			t.Errorf("range=%q: StatusCode=%d, want %d", rt.r, resp.StatusCode, rt.code)
                                 		}
                                @@ -704,7 +705,8 @@
                                 	req, _ := NewRequest("GET", ts.URL, nil)
                                 	req.Header.Set("If-Modified-Since", lastMod)
                                 
                                -	res, err = DefaultClient.Do(req)
                                +	c := ts.Client()
                                +	res, err = c.Do(req)
                                 	if err != nil {
                                 		t.Fatal(err)
                                 	}
                                @@ -716,7 +718,7 @@
                                 	// Advance the index.html file's modtime, but not the directory's.
                                 	indexFile.modtime = indexFile.modtime.Add(1 * time.Hour)
                                 
                                -	res, err = DefaultClient.Do(req)
                                +	res, err = c.Do(req)
                                 	if err != nil {
                                 		t.Fatal(err)
                                 	}
                                @@ -995,7 +997,9 @@
                                 		for k, v := range tt.reqHeader {
                                 			req.Header.Set(k, v)
                                 		}
                                -		res, err := DefaultClient.Do(req)
                                +
                                +		c := ts.Client()
                                +		res, err := c.Do(req)
                                 		if err != nil {
                                 			t.Fatal(err)
                                 		}
                                @@ -1050,8 +1054,9 @@
                                 	}
                                 	ts := httptest.NewServer(FileServer(fs))
                                 	defer ts.Close()
                                +	c := ts.Client()
                                 	for _, code := range []int{403, 404, 500} {
                                -		res, err := DefaultClient.Get(fmt.Sprintf("%s/%d", ts.URL, code))
                                +		res, err := c.Get(fmt.Sprintf("%s/%d", ts.URL, code))
                                 		if err != nil {
                                 			t.Errorf("Error fetching /%d: %v", code, err)
                                 			continue
                                @@ -1125,8 +1130,8 @@
                                 	}
                                 }
                                 
                                -func getBody(t *testing.T, testName string, req Request) (*Response, []byte) {
                                -	r, err := DefaultClient.Do(&req)
                                +func getBody(t *testing.T, testName string, req Request, client *Client) (*Response, []byte) {
                                +	r, err := client.Do(&req)
                                 	if err != nil {
                                 		t.Fatalf("%s: for URL %q, send error: %v", testName, req.URL.String(), err)
                                 	}
                                diff --git a/src/net/http/httptest/server.go b/src/net/http/httptest/server.go
                                index 56ad18e..b5b18c7 100644
                                --- a/src/net/http/httptest/server.go
                                +++ b/src/net/http/httptest/server.go
                                @@ -93,7 +93,9 @@
                                 	return &Server{
                                 		Listener: newLocalListener(),
                                 		Config:   &http.Server{Handler: handler},
                                -		client:   &http.Client{},
                                +		client: &http.Client{
                                +			Transport: &http.Transport{},
                                +		},
                                 	}
                                 }
                                 
                                diff --git a/src/net/http/httptest/server_test.go b/src/net/http/httptest/server_test.go
                                index 7d80fa1..62846de 100644
                                --- a/src/net/http/httptest/server_test.go
                                +++ b/src/net/http/httptest/server_test.go
                                @@ -121,3 +121,27 @@
                                 		t.Errorf("got %q, want hello", string(got))
                                 	}
                                 }
                                +
                                +// Tests that the Server.Client.Transport interface is implemented
                                +// by a *http.Transport.
                                +func TestServerClientTransportType(t *testing.T) {
                                +	ts := NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                                +	}))
                                +	defer ts.Close()
                                +	client := ts.Client()
                                +	if _, ok := client.Transport.(*http.Transport); !ok {
                                +		t.Errorf("got %T, want *http.Transport", client.Transport)
                                +	}
                                +}
                                +
                                +// Tests that the TLS Server.Client.Transport interface is implemented
                                +// by a *http.Transport.
                                +func TestTLSServerClientTransportType(t *testing.T) {
                                +	ts := NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                                +	}))
                                +	defer ts.Close()
                                +	client := ts.Client()
                                +	if _, ok := client.Transport.(*http.Transport); !ok {
                                +		t.Errorf("got %T, want *http.Transport", client.Transport)
                                +	}
                                +}
                                diff --git a/src/net/http/httputil/reverseproxy_test.go b/src/net/http/httputil/reverseproxy_test.go
                                index 9153508..008e4e7 100644
                                --- a/src/net/http/httputil/reverseproxy_test.go
                                +++ b/src/net/http/httputil/reverseproxy_test.go
                                @@ -79,6 +79,7 @@
                                 	proxyHandler.ErrorLog = log.New(ioutil.Discard, "", 0) // quiet for tests
                                 	frontend := httptest.NewServer(proxyHandler)
                                 	defer frontend.Close()
                                +	frontendClient := frontend.Client()
                                 
                                 	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
                                 	getReq.Host = "some-name"
                                @@ -86,7 +87,7 @@
                                 	getReq.Header.Set("Proxy-Connection", "should be deleted")
                                 	getReq.Header.Set("Upgrade", "foo")
                                 	getReq.Close = true
                                -	res, err := http.DefaultClient.Do(getReq)
                                +	res, err := frontendClient.Do(getReq)
                                 	if err != nil {
                                 		t.Fatalf("Get: %v", err)
                                 	}
                                @@ -126,7 +127,7 @@
                                 	// a response results in a StatusBadGateway.
                                 	getReq, _ = http.NewRequest("GET", frontend.URL+"/?mode=hangup", nil)
                                 	getReq.Close = true
                                -	res, err = http.DefaultClient.Do(getReq)
                                +	res, err = frontendClient.Do(getReq)
                                 	if err != nil {
                                 		t.Fatal(err)
                                 	}
                                @@ -172,7 +173,7 @@
                                 	getReq.Header.Set("Connection", "Upgrade, "+fakeConnectionToken)
                                 	getReq.Header.Set("Upgrade", "original value")
                                 	getReq.Header.Set(fakeConnectionToken, "should be deleted")
                                -	res, err := http.DefaultClient.Do(getReq)
                                +	res, err := frontend.Client().Do(getReq)
                                 	if err != nil {
                                 		t.Fatalf("Get: %v", err)
                                 	}
                                @@ -220,7 +221,7 @@
                                 	getReq.Header.Set("Connection", "close")
                                 	getReq.Header.Set("X-Forwarded-For", prevForwardedFor)
                                 	getReq.Close = true
                                -	res, err := http.DefaultClient.Do(getReq)
                                +	res, err := frontend.Client().Do(getReq)
                                 	if err != nil {
                                 		t.Fatalf("Get: %v", err)
                                 	}
                                @@ -259,7 +260,7 @@
                                 		frontend := httptest.NewServer(NewSingleHostReverseProxy(backendURL))
                                 		req, _ := http.NewRequest("GET", frontend.URL+tt.reqSuffix, nil)
                                 		req.Close = true
                                -		res, err := http.DefaultClient.Do(req)
                                +		res, err := frontend.Client().Do(req)
                                 		if err != nil {
                                 			t.Fatalf("%d. Get: %v", i, err)
                                 		}
                                @@ -295,7 +296,7 @@
                                 
                                 	req, _ := http.NewRequest("GET", frontend.URL, nil)
                                 	req.Close = true
                                -	res, err := http.DefaultClient.Do(req)
                                +	res, err := frontend.Client().Do(req)
                                 	if err != nil {
                                 		t.Fatalf("Get: %v", err)
                                 	}
                                @@ -349,13 +350,14 @@
                                 
                                 	frontend := httptest.NewServer(proxyHandler)
                                 	defer frontend.Close()
                                +	frontendClient := frontend.Client()
                                 
                                 	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
                                 	go func() {
                                 		<-reqInFlight
                                -		http.DefaultTransport.(*http.Transport).CancelRequest(getReq)
                                +		frontendClient.Transport.(*http.Transport).CancelRequest(getReq)
                                 	}()
                                -	res, err := http.DefaultClient.Do(getReq)
                                +	res, err := frontendClient.Do(getReq)
                                 	if res != nil {
                                 		t.Errorf("got response %v; want nil", res.Status)
                                 	}
                                @@ -363,7 +365,7 @@
                                 		// This should be an error like:
                                 		// Get http://127.0.0.1:58079: read tcp 127.0.0.1:58079:
                                 		//    use of closed network connection
                                -		t.Error("DefaultClient.Do() returned nil error; want non-nil error")
                                +		t.Error("Server.Client().Do() returned nil error; want non-nil error")
                                 	}
                                 }
                                 
                                @@ -428,11 +430,12 @@
                                 	proxyHandler.ErrorLog = log.New(ioutil.Discard, "", 0) // quiet for tests
                                 	frontend := httptest.NewServer(proxyHandler)
                                 	defer frontend.Close()
                                +	frontendClient := frontend.Client()
                                 
                                 	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
                                 	getReq.Header.Set("User-Agent", explicitUA)
                                 	getReq.Close = true
                                -	res, err := http.DefaultClient.Do(getReq)
                                +	res, err := frontendClient.Do(getReq)
                                 	if err != nil {
                                 		t.Fatalf("Get: %v", err)
                                 	}
                                @@ -441,7 +444,7 @@
                                 	getReq, _ = http.NewRequest("GET", frontend.URL+"/noua", nil)
                                 	getReq.Header.Set("User-Agent", "")
                                 	getReq.Close = true
                                -	res, err = http.DefaultClient.Do(getReq)
                                +	res, err = frontendClient.Do(getReq)
                                 	if err != nil {
                                 		t.Fatalf("Get: %v", err)
                                 	}
                                @@ -493,7 +496,7 @@
                                 
                                 	req, _ := http.NewRequest("GET", frontend.URL, nil)
                                 	req.Close = true
                                -	res, err := http.DefaultClient.Do(req)
                                +	res, err := frontend.Client().Do(req)
                                 	if err != nil {
                                 		t.Fatalf("Get: %v", err)
                                 	}
                                @@ -540,7 +543,7 @@
                                 	defer frontend.Close()
                                 
                                 	postReq, _ := http.NewRequest("POST", frontend.URL, bytes.NewReader(requestBody))
                                -	res, err := http.DefaultClient.Do(postReq)
                                +	res, err := frontend.Client().Do(postReq)
                                 	if err != nil {
                                 		t.Fatalf("Do: %v", err)
                                 	}
                                @@ -573,7 +576,7 @@
                                 	frontend := httptest.NewServer(proxyHandler)
                                 	defer frontend.Close()
                                 
                                -	res, err := http.DefaultClient.Get(frontend.URL)
                                +	res, err := frontend.Client().Get(frontend.URL)
                                 	if err != nil {
                                 		t.Fatal(err)
                                 	}
                                diff --git a/src/net/http/main_test.go b/src/net/http/main_test.go
                                index 438bd2e..fc0437e 100644
                                --- a/src/net/http/main_test.go
                                +++ b/src/net/http/main_test.go
                                @@ -151,7 +151,3 @@
                                 	}
                                 	return err
                                 }
                                -
                                -func closeClient(c *http.Client) {
                                -	c.Transport.(*http.Transport).CloseIdleConnections()
                                -}
                                diff --git a/src/net/http/npn_test.go b/src/net/http/npn_test.go
                                index 4c1f6b5..618bdbe 100644
                                --- a/src/net/http/npn_test.go
                                +++ b/src/net/http/npn_test.go
                                @@ -8,6 +8,7 @@
                                 	"bufio"
                                 	"bytes"
                                 	"crypto/tls"
                                +	"crypto/x509"
                                 	"fmt"
                                 	"io"
                                 	"io/ioutil"
                                @@ -43,10 +44,7 @@
                                 
                                 	// Normal request, without NPN.
                                 	{
                                -		tr := newTLSTransport(t, ts)
                                -		defer tr.CloseIdleConnections()
                                -		c := &Client{Transport: tr}
                                -
                                +		c := ts.Client()
                                 		res, err := c.Get(ts.URL)
                                 		if err != nil {
                                 			t.Fatal(err)
                                @@ -63,11 +61,18 @@
                                 	// Request to an advertised but unhandled NPN protocol.
                                 	// Server will hang up.
                                 	{
                                -		tr := newTLSTransport(t, ts)
                                -		tr.TLSClientConfig.NextProtos = []string{"unhandled-proto"}
                                +		certPool := x509.NewCertPool()
                                +		certPool.AddCert(ts.Certificate())
                                +		tr := &Transport{
                                +			TLSClientConfig: &tls.Config{
                                +				RootCAs:    certPool,
                                +				NextProtos: []string{"unhandled-proto"},
                                +			},
                                +		}
                                 		defer tr.CloseIdleConnections()
                                -		c := &Client{Transport: tr}
                                -
                                +		c := &Client{
                                +			Transport: tr,
                                +		}
                                 		res, err := c.Get(ts.URL)
                                 		if err == nil {
                                 			defer res.Body.Close()
                                @@ -80,7 +85,8 @@
                                 	// Request using the "tls-0.9" protocol, which we register here.
                                 	// It is HTTP/0.9 over TLS.
                                 	{
                                -		tlsConfig := newTLSTransport(t, ts).TLSClientConfig
                                +		c := ts.Client()
                                +		tlsConfig := c.Transport.(*Transport).TLSClientConfig
                                 		tlsConfig.NextProtos = []string{"tls-0.9"}
                                 		conn, err := tls.Dial("tcp", ts.Listener.Addr().String(), tlsConfig)
                                 		if err != nil {
                                diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go
                                index 8092cc1..d301d15 100644
                                --- a/src/net/http/serve_test.go
                                +++ b/src/net/http/serve_test.go
                                @@ -474,9 +474,7 @@
                                 	defer ts.Close()
                                 
                                 	// Hit the HTTP server successfully.
                                -	tr := &Transport{DisableKeepAlives: true} // they interfere with this test
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 	r, err := c.Get(ts.URL)
                                 	if err != nil {
                                 		t.Fatalf("http Get #1: %v", err)
                                @@ -548,12 +546,10 @@
                                 	ts.StartTLS()
                                 	defer ts.Close()
                                 
                                -	tr := newTLSTransport(t, ts)
                                -	defer tr.CloseIdleConnections()
                                -	if err := ExportHttp2ConfigureTransport(tr); err != nil {
                                +	c := ts.Client()
                                +	if err := ExportHttp2ConfigureTransport(c.Transport.(*Transport)); err != nil {
                                 		t.Fatal(err)
                                 	}
                                -	c := &Client{Transport: tr}
                                 
                                 	for i := 1; i <= 3; i++ {
                                 		req, err := NewRequest("GET", ts.URL, nil)
                                @@ -608,9 +604,7 @@
                                 	ts.Start()
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{DisableKeepAlives: false}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 
                                 	errc := make(chan error)
                                 	go func() {
                                @@ -671,8 +665,7 @@
                                 	ts := httptest.NewServer(handler)
                                 	defer ts.Close()
                                 
                                -	c := &Client{Transport: new(Transport)}
                                -	defer closeClient(c)
                                +	c := ts.Client()
                                 
                                 	// Note: this relies on the assumption (which is true) that
                                 	// Get sends HTTP/1.1 or greater requests. Otherwise the
                                @@ -949,9 +942,8 @@
                                 	ts.Start()
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{DisableKeepAlives: true}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr, Timeout: time.Second}
                                +	c := ts.Client()
                                +	c.Timeout = time.Second
                                 
                                 	fetch := func(num int, response chan<- string) {
                                 		resp, err := c.Get(ts.URL)
                                @@ -1022,9 +1014,7 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	c := &Client{Transport: new(Transport)}
                                -	defer closeClient(c)
                                -
                                +	c := ts.Client()
                                 	res, err := c.Get(ts.URL)
                                 	if err != nil {
                                 		t.Fatalf("Get error: %v", err)
                                @@ -1145,12 +1135,7 @@
                                 			t.Errorf("expected test TLS server to start with https://, got %q", ts.URL)
                                 			return
                                 		}
                                -		noVerifyTransport := &Transport{
                                -			TLSClientConfig: &tls.Config{
                                -				InsecureSkipVerify: true,
                                -			},
                                -		}
                                -		client := &Client{Transport: noVerifyTransport}
                                +		client := ts.Client()
                                 		res, err := client.Get(ts.URL)
                                 		if err != nil {
                                 			t.Error(err)
                                @@ -1967,8 +1952,7 @@
                                 	ts := httptest.NewServer(TimeoutHandler(delayHi, 20*time.Millisecond, ""))
                                 	defer ts.Close()
                                 
                                -	c := &Client{Transport: new(Transport)}
                                -	defer closeClient(c)
                                +	c := ts.Client()
                                 
                                 	var wg sync.WaitGroup
                                 	gate := make(chan bool, 10)
                                @@ -2011,8 +1995,8 @@
                                 	if testing.Short() {
                                 		n = 10
                                 	}
                                -	c := &Client{Transport: new(Transport)}
                                -	defer closeClient(c)
                                +
                                +	c := ts.Client()
                                 	for i := 0; i < n; i++ {
                                 		gate <- true
                                 		wg.Add(1)
                                @@ -2099,8 +2083,7 @@
                                 	ts := httptest.NewServer(TimeoutHandler(handler, timeout, ""))
                                 	defer ts.Close()
                                 
                                -	c := &Client{Transport: new(Transport)}
                                -	defer closeClient(c)
                                +	c := ts.Client()
                                 
                                 	// Issue was caused by the timeout handler starting the timer when
                                 	// was created, not when the request. So wait for more than the timeout
                                @@ -2127,8 +2110,7 @@
                                 	ts := httptest.NewServer(TimeoutHandler(handler, timeout, ""))
                                 	defer ts.Close()
                                 
                                -	c := &Client{Transport: new(Transport)}
                                -	defer closeClient(c)
                                +	c := ts.Client()
                                 
                                 	res, err := c.Get(ts.URL)
                                 	if err != nil {
                                @@ -2364,9 +2346,7 @@
                                 	ts.Start()
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 	res, err := c.Get(ts.URL)
                                 	if err != nil {
                                 		t.Fatal(err)
                                @@ -2411,8 +2391,7 @@
                                 	ts := httptest.NewServer(StripPrefix("/foo", h))
                                 	defer ts.Close()
                                 
                                -	c := &Client{Transport: new(Transport)}
                                -	defer closeClient(c)
                                +	c := ts.Client()
                                 
                                 	res, err := c.Get(ts.URL + "/foo/bar")
                                 	if err != nil {
                                @@ -3654,9 +3633,7 @@
                                 	}
                                 	ts.Start()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 
                                 	mustGet := func(url string, headers ...string) {
                                 		req, err := NewRequest("GET", url, nil)
                                @@ -4491,15 +4468,9 @@
                                 	b.ResetTimer()
                                 	b.SetParallelism(parallelism)
                                 	b.RunParallel(func(pb *testing.PB) {
                                -		noVerifyTransport := &Transport{
                                -			TLSClientConfig: &tls.Config{
                                -				InsecureSkipVerify: true,
                                -			},
                                -		}
                                -		defer noVerifyTransport.CloseIdleConnections()
                                -		client := &Client{Transport: noVerifyTransport}
                                +		c := ts.Client()
                                 		for pb.Next() {
                                -			res, err := client.Get(ts.URL)
                                +			res, err := c.Get(ts.URL)
                                 			if err != nil {
                                 				b.Logf("Get: %v", err)
                                 				continue
                                @@ -4934,10 +4905,7 @@
                                 	ts.Config.IdleTimeout = 2 * time.Second
                                 	ts.Start()
                                 	defer ts.Close()
                                -
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 
                                 	get := func() string {
                                 		res, err := c.Get(ts.URL)
                                @@ -4998,9 +4966,8 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                 
                                 	get := func() string { return get(t, c, ts.URL) }
                                 
                                @@ -5119,9 +5086,7 @@
                                 	ts.Start()
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 
                                 	res, err := c.Get(ts.URL)
                                 	if err != nil {
                                diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go
                                index cb315f1..09bfef4 100644
                                --- a/src/net/http/transport_test.go
                                +++ b/src/net/http/transport_test.go
                                @@ -131,11 +131,9 @@
                                 	ts := httptest.NewServer(hostPortHandler)
                                 	defer ts.Close()
                                 
                                +	c := ts.Client()
                                 	for _, disableKeepAlive := range []bool{false, true} {
                                -		tr := &Transport{DisableKeepAlives: disableKeepAlive}
                                -		defer tr.CloseIdleConnections()
                                -		c := &Client{Transport: tr}
                                -
                                +		c.Transport.(*Transport).DisableKeepAlives = disableKeepAlive
                                 		fetch := func(n int) string {
                                 			res, err := c.Get(ts.URL)
                                 			if err != nil {
                                @@ -166,12 +164,11 @@
                                 
                                 	connSet, testDial := makeTestDial(t)
                                 
                                -	for _, connectionClose := range []bool{false, true} {
                                -		tr := &Transport{
                                -			Dial: testDial,
                                -		}
                                -		c := &Client{Transport: tr}
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                +	tr.Dial = testDial
                                 
                                +	for _, connectionClose := range []bool{false, true} {
                                 		fetch := func(n int) string {
                                 			req := new(Request)
                                 			var err error
                                @@ -217,12 +214,10 @@
                                 
                                 	connSet, testDial := makeTestDial(t)
                                 
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                +	tr.Dial = testDial
                                 	for _, connectionClose := range []bool{false, true} {
                                -		tr := &Transport{
                                -			Dial: testDial,
                                -		}
                                -		c := &Client{Transport: tr}
                                -
                                 		fetch := func(n int) string {
                                 			req := new(Request)
                                 			var err error
                                @@ -273,10 +268,9 @@
                                 	ts := httptest.NewServer(hostPortHandler)
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{
                                -		DisableKeepAlives: true,
                                -	}
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).DisableKeepAlives = true
                                +
                                 	res, err := c.Get(ts.URL)
                                 	if err != nil {
                                 		t.Fatal(err)
                                @@ -291,9 +285,8 @@
                                 	defer afterTest(t)
                                 	ts := httptest.NewServer(hostPortHandler)
                                 	defer ts.Close()
                                -
                                -	tr := &Transport{DisableKeepAlives: false}
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                 
                                 	if e, g := 0, len(tr.IdleConnKeysForTesting()); e != g {
                                 		t.Errorf("After CloseIdleConnections expected %d idle conn cache keys; got %d", e, g)
                                @@ -385,9 +378,11 @@
                                 		}
                                 	}))
                                 	defer ts.Close()
                                +
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                 	maxIdleConnsPerHost := 2
                                -	tr := &Transport{DisableKeepAlives: false, MaxIdleConnsPerHost: maxIdleConnsPerHost}
                                -	c := &Client{Transport: tr}
                                +	tr.MaxIdleConnsPerHost = maxIdleConnsPerHost
                                 
                                 	// Start 3 outstanding requests and wait for the server to get them.
                                 	// Their responses will hang until we write to resch, though.
                                @@ -450,9 +445,8 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                 
                                 	doReq := func(name string) string {
                                 		// Do a POST instead of a GET to prevent the Transport's
                                @@ -496,9 +490,7 @@
                                 	defer afterTest(t)
                                 	ts := httptest.NewServer(hostPortHandler)
                                 	defer ts.Close()
                                -
                                -	tr := &Transport{}
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 
                                 	fetch := func(n, retries int) string {
                                 		condFatalf := func(format string, arg ...interface{}) {
                                @@ -564,10 +556,7 @@
                                 		conn.Close()
                                 	}))
                                 	defer ts.Close()
                                -
                                -	tr := &Transport{DisableKeepAlives: false}
                                -	c := &Client{Transport: tr}
                                -	defer tr.CloseIdleConnections()
                                +	c := ts.Client()
                                 
                                 	// Do a bunch of traffic from different goroutines. Send to activityc
                                 	// after each request completes, regardless of whether it failed.
                                @@ -620,9 +609,8 @@
                                 		w.WriteHeader(200)
                                 	}))
                                 	defer ts.Close()
                                +	c := ts.Client()
                                 
                                -	tr := &Transport{DisableKeepAlives: false}
                                -	c := &Client{Transport: tr}
                                 	for i := 0; i < 2; i++ {
                                 		res, err := c.Head(ts.URL)
                                 		if err != nil {
                                @@ -656,10 +644,7 @@
                                 		w.WriteHeader(200)
                                 	}))
                                 	defer ts.Close()
                                -
                                -	tr := &Transport{DisableKeepAlives: false}
                                -	c := &Client{Transport: tr}
                                -	defer tr.CloseIdleConnections()
                                +	c := ts.Client()
                                 
                                 	// Ensure that we wait for the readLoop to complete before
                                 	// calling Head again
                                @@ -720,6 +705,7 @@
                                 		}
                                 	}))
                                 	defer ts.Close()
                                +	tr := ts.Client().Transport.(*Transport)
                                 
                                 	for i, test := range roundTripTests {
                                 		// Test basic request (no accept-encoding)
                                @@ -727,7 +713,7 @@
                                 		if test.accept != "" {
                                 			req.Header.Set("Accept-Encoding", test.accept)
                                 		}
                                -		res, err := DefaultTransport.RoundTrip(req)
                                +		res, err := tr.RoundTrip(req)
                                 		var body []byte
                                 		if test.compressed {
                                 			var r *gzip.Reader
                                @@ -792,10 +778,9 @@
                                 		gz.Close()
                                 	}))
                                 	defer ts.Close()
                                +	c := ts.Client()
                                 
                                 	for _, chunked := range []string{"1", "0"} {
                                -		c := &Client{Transport: &Transport{}}
                                -
                                 		// First fetch something large, but only read some of it.
                                 		res, err := c.Get(ts.URL + "/?body=large&chunked=" + chunked)
                                 		if err != nil {
                                @@ -845,7 +830,6 @@
                                 	}
                                 
                                 	// And a HEAD request too, because they're always weird.
                                -	c := &Client{Transport: &Transport{}}
                                 	res, err := c.Head(ts.URL)
                                 	if err != nil {
                                 		t.Fatalf("Head: %v", err)
                                @@ -915,11 +899,13 @@
                                 		{path: "/timeout", body: []byte("hello"), sent: 5, status: 200},   // Timeout exceeded and entire body is sent.
                                 	}
                                 
                                +	c := ts.Client()
                                 	for i, v := range tests {
                                -		tr := &Transport{ExpectContinueTimeout: 2 * time.Second}
                                +		tr := &Transport{
                                +			ExpectContinueTimeout: 2 * time.Second,
                                +		}
                                 		defer tr.CloseIdleConnections()
                                -		c := &Client{Transport: tr}
                                -
                                +		c.Transport = tr
                                 		body := bytes.NewReader(v.body)
                                 		req, err := NewRequest("PUT", ts.URL+v.path, body)
                                 		if err != nil {
                                @@ -1016,7 +1002,8 @@
                                 	if err != nil {
                                 		t.Fatal(err)
                                 	}
                                -	c := &Client{Transport: &Transport{Proxy: ProxyURL(pu)}}
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).Proxy = ProxyURL(pu)
                                 	if _, err := c.Head(ts.URL); err != nil {
                                 		t.Error(err)
                                 	}
                                @@ -1052,7 +1039,8 @@
                                 	if err != nil {
                                 		t.Fatal(err)
                                 	}
                                -	c := &Client{Transport: &Transport{Proxy: ProxyURL(pu)}}
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).Proxy = ProxyURL(pu)
                                 	if _, err := c.Head(ts.URL); err != nil {
                                 		t.Error(err)
                                 	}
                                @@ -1122,9 +1110,7 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 	res, err := c.Get(ts.URL)
                                 	if err != nil {
                                 		t.Fatal(err)
                                @@ -1152,9 +1138,7 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 	res, err := c.Get(ts.URL)
                                 	if err != nil {
                                 		t.Fatal(err)
                                @@ -1195,9 +1179,8 @@
                                 		w.WriteHeader(204)
                                 	}))
                                 	defer ts.Close()
                                -
                                -	tr := &Transport{}
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                 
                                 	n0 := runtime.NumGoroutine()
                                 
                                @@ -1260,9 +1243,8 @@
                                 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
                                 	}))
                                 	defer ts.Close()
                                -
                                -	tr := &Transport{}
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                 
                                 	n0 := runtime.NumGoroutine()
                                 	body := []byte("Hello")
                                @@ -1294,8 +1276,7 @@
                                 // This used to crash; https://golang.org/issue/3266
                                 func TestTransportIdleConnCrash(t *testing.T) {
                                 	defer afterTest(t)
                                -	tr := &Transport{}
                                -	c := &Client{Transport: tr}
                                +	var tr *Transport
                                 
                                 	unblockCh := make(chan bool, 1)
                                 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
                                @@ -1303,6 +1284,8 @@
                                 		tr.CloseIdleConnections()
                                 	}))
                                 	defer ts.Close()
                                +	c := ts.Client()
                                +	tr = c.Transport.(*Transport)
                                 
                                 	didreq := make(chan bool)
                                 	go func() {
                                @@ -1332,8 +1315,7 @@
                                 		}
                                 	}))
                                 	defer ts.Close()
                                -	tr := &Transport{}
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 	res, err := c.Get(ts.URL)
                                 	if err != nil {
                                 		t.Fatal(err)
                                @@ -1358,8 +1340,7 @@
                                 		Error(w, deniedMsg, StatusUnauthorized)
                                 	}))
                                 	defer ts.Close()
                                -	tr := &Transport{}
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 	res, err := c.Post(ts.URL, "application/octet-stream", neverEnding('a'))
                                 	if err != nil {
                                 		t.Errorf("Post: %v", err)
                                @@ -1383,8 +1364,8 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                +	c := ts.Client()
                                 	for _, closeBody := range []bool{true, false} {
                                -		c := &Client{Transport: &Transport{}}
                                 		const n = 4
                                 		for i := 1; i <= n; i++ {
                                 			res, err := c.Get(ts.URL)
                                @@ -1424,10 +1405,7 @@
                                 	SetPendingDialHooks(func() { wg.Add(1) }, wg.Done)
                                 	defer SetPendingDialHooks(nil, nil)
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 	reqs := make(chan string)
                                 	defer close(reqs)
                                 
                                @@ -1469,23 +1447,20 @@
                                 		io.Copy(w, neverEnding('a'))
                                 	})
                                 	ts := httptest.NewServer(mux)
                                +	defer ts.Close()
                                 	timeout := 100 * time.Millisecond
                                 
                                -	client := &Client{
                                -		Transport: &Transport{
                                -			Dial: func(n, addr string) (net.Conn, error) {
                                -				conn, err := net.Dial(n, addr)
                                -				if err != nil {
                                -					return nil, err
                                -				}
                                -				conn.SetDeadline(time.Now().Add(timeout))
                                -				if debug {
                                -					conn = NewLoggingConn("client", conn)
                                -				}
                                -				return conn, nil
                                -			},
                                -			DisableKeepAlives: true,
                                -		},
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
                                +		conn, err := net.Dial(n, addr)
                                +		if err != nil {
                                +			return nil, err
                                +		}
                                +		conn.SetDeadline(time.Now().Add(timeout))
                                +		if debug {
                                +			conn = NewLoggingConn("client", conn)
                                +		}
                                +		return conn, nil
                                 	}
                                 
                                 	getFailed := false
                                @@ -1497,7 +1472,7 @@
                                 		if debug {
                                 			println("run", i+1, "of", nRuns)
                                 		}
                                -		sres, err := client.Get(ts.URL + "/get")
                                +		sres, err := c.Get(ts.URL + "/get")
                                 		if err != nil {
                                 			if !getFailed {
                                 				// Make the timeout longer, once.
                                @@ -1519,7 +1494,6 @@
                                 	if debug {
                                 		println("tests complete; waiting for handlers to finish")
                                 	}
                                -	ts.Close()
                                 }
                                 
                                 func TestIssue4191_InfiniteGetToPutTimeout(t *testing.T) {
                                @@ -1537,21 +1511,17 @@
                                 	ts := httptest.NewServer(mux)
                                 	timeout := 100 * time.Millisecond
                                 
                                -	client := &Client{
                                -		Transport: &Transport{
                                -			Dial: func(n, addr string) (net.Conn, error) {
                                -				conn, err := net.Dial(n, addr)
                                -				if err != nil {
                                -					return nil, err
                                -				}
                                -				conn.SetDeadline(time.Now().Add(timeout))
                                -				if debug {
                                -					conn = NewLoggingConn("client", conn)
                                -				}
                                -				return conn, nil
                                -			},
                                -			DisableKeepAlives: true,
                                -		},
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
                                +		conn, err := net.Dial(n, addr)
                                +		if err != nil {
                                +			return nil, err
                                +		}
                                +		conn.SetDeadline(time.Now().Add(timeout))
                                +		if debug {
                                +			conn = NewLoggingConn("client", conn)
                                +		}
                                +		return conn, nil
                                 	}
                                 
                                 	getFailed := false
                                @@ -1563,7 +1533,7 @@
                                 		if debug {
                                 			println("run", i+1, "of", nRuns)
                                 		}
                                -		sres, err := client.Get(ts.URL + "/get")
                                +		sres, err := c.Get(ts.URL + "/get")
                                 		if err != nil {
                                 			if !getFailed {
                                 				// Make the timeout longer, once.
                                @@ -1577,7 +1547,7 @@
                                 			break
                                 		}
                                 		req, _ := NewRequest("PUT", ts.URL+"/put", sres.Body)
                                -		_, err = client.Do(req)
                                +		_, err = c.Do(req)
                                 		if err == nil {
                                 			sres.Body.Close()
                                 			t.Errorf("Unexpected successful PUT")
                                @@ -1609,11 +1579,8 @@
                                 	ts := httptest.NewServer(mux)
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{
                                -		ResponseHeaderTimeout: 500 * time.Millisecond,
                                -	}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).ResponseHeaderTimeout = 500 * time.Millisecond
                                 
                                 	tests := []struct {
                                 		path    string
                                @@ -1680,9 +1647,8 @@
                                 	defer ts.Close()
                                 	defer close(unblockc)
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                 
                                 	req, _ := NewRequest("GET", ts.URL, nil)
                                 	res, err := c.Do(req)
                                @@ -1790,9 +1756,8 @@
                                 	defer ts.Close()
                                 	defer close(unblockc)
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                 
                                 	req, _ := NewRequest("GET", ts.URL, nil)
                                 	ch := make(chan struct{})
                                @@ -1849,9 +1814,7 @@
                                 	defer ts.Close()
                                 	defer close(unblockc)
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                 
                                 	req, _ := NewRequest("GET", ts.URL, nil)
                                 	if withCtx {
                                @@ -1939,9 +1902,8 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                 
                                 	req, _ := NewRequest("GET", ts.URL, nil)
                                 	defer tr.CancelRequest(req)
                                @@ -2061,18 +2023,12 @@
                                 	defer ts.Close()
                                 
                                 	dialGate := make(chan bool, 1)
                                -	tr := &Transport{
                                -		Dial: func(n, addr string) (net.Conn, error) {
                                -			if <-dialGate {
                                -				return net.Dial(n, addr)
                                -			}
                                -			return nil, errors.New("manually closed")
                                -		},
                                -		DisableKeepAlives: false,
                                -	}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{
                                -		Transport: tr,
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).Dial = func(n, addr string) (net.Conn, error) {
                                +		if <-dialGate {
                                +			return net.Dial(n, addr)
                                +		}
                                +		return nil, errors.New("manually closed")
                                 	}
                                 
                                 	dialGate <- true // only allow one dial
                                @@ -2326,14 +2282,11 @@
                                 	SetReadLoopBeforeNextReadHook(func() { didRead <- true })
                                 	defer SetReadLoopBeforeNextReadHook(nil)
                                 
                                -	tr := &Transport{
                                -		Dial: func(netw, addr string) (net.Conn, error) {
                                -			return net.Dial(netw, ts.Listener.Addr().String())
                                -		},
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                +	tr.Dial = func(netw, addr string) (net.Conn, error) {
                                +		return net.Dial(netw, ts.Listener.Addr().String())
                                 	}
                                -	defer tr.CloseIdleConnections()
                                -
                                -	c := &Client{Transport: tr}
                                 
                                 	// First, without keep-alives.
                                 	for _, disableKeep := range []bool{true, false} {
                                @@ -2376,13 +2329,11 @@
                                 	}))
                                 	defer ts.Close()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	cl := &Client{Transport: tr}
                                +	c := ts.Client()
                                 
                                 	closes := 0
                                 
                                -	res, err := cl.Post(ts.URL, "text/plain", countCloseReader{&closes, strings.NewReader("hello")})
                                +	res, err := c.Post(ts.URL, "text/plain", countCloseReader{&closes, strings.NewReader("hello")})
                                 	if err != nil {
                                 		t.Fatal(err)
                                 	}
                                @@ -2468,20 +2419,16 @@
                                 		fmt.Fprintf(w, "hello")
                                 	}))
                                 	defer ts.Close()
                                -	tr := &Transport{
                                -		TLSClientConfig: &tls.Config{
                                -			InsecureSkipVerify: true,
                                -		},
                                -	}
                                -	defer tr.CloseIdleConnections()
                                -	client := &Client{Transport: tr}
                                +
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                 
                                 	var nSuccess = 0
                                 	var errs []error
                                 	const trials = 20
                                 	for i := 0; i < trials; i++ {
                                 		tr.CloseIdleConnections()
                                -		res, err := client.Get(ts.URL + "/keep-alive-then-die")
                                +		res, err := c.Get(ts.URL + "/keep-alive-then-die")
                                 		if err != nil {
                                 			t.Fatal(err)
                                 		}
                                @@ -2496,7 +2443,7 @@
                                 
                                 		// Now try again and see if we successfully
                                 		// pick a new connection.
                                -		res, err = client.Get(ts.URL + "/")
                                +		res, err = c.Get(ts.URL + "/")
                                 		if err != nil {
                                 			errs = append(errs, err)
                                 			continue
                                @@ -2575,22 +2522,20 @@
                                 		go io.Copy(ioutil.Discard, conn)
                                 	}))
                                 	defer ts.Close()
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	client := &Client{Transport: tr}
                                +	c := ts.Client()
                                 
                                 	const bodySize = 256 << 10
                                 	finalBit := make(byteFromChanReader, 1)
                                 	req, _ := NewRequest("POST", ts.URL, io.MultiReader(io.LimitReader(neverEnding('x'), bodySize-1), finalBit))
                                 	req.ContentLength = bodySize
                                -	res, err := client.Do(req)
                                +	res, err := c.Do(req)
                                 	if err := wantBody(res, err, "foo"); err != nil {
                                 		t.Errorf("POST response: %v", err)
                                 	}
                                 	donec := make(chan bool)
                                 	go func() {
                                 		defer close(donec)
                                -		res, err = client.Get(ts.URL)
                                +		res, err = c.Get(ts.URL)
                                 		if err := wantBody(res, err, "bar"); err != nil {
                                 			t.Errorf("GET response: %v", err)
                                 			return
                                @@ -2622,10 +2567,9 @@
                                 		conn.Close()
                                 	}))
                                 	defer ts.Close()
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	cl := &Client{Transport: tr}
                                -	res, err := cl.Get(ts.URL)
                                +	c := ts.Client()
                                +
                                +	res, err := c.Get(ts.URL)
                                 	if err != nil {
                                 		t.Fatalf("Get: %v", err)
                                 	}
                                @@ -2686,29 +2630,26 @@
                                 	defer ts.Close()
                                 
                                 	var writeNumAtomic int32
                                -	tr := &Transport{
                                -		Dial: func(network, addr string) (net.Conn, error) {
                                -			logf("Dial")
                                -			c, err := net.Dial(network, ts.Listener.Addr().String())
                                -			if err != nil {
                                -				logf("Dial error: %v", err)
                                -				return nil, err
                                -			}
                                -			return &writerFuncConn{
                                -				Conn: c,
                                -				write: func(p []byte) (n int, err error) {
                                -					if atomic.AddInt32(&writeNumAtomic, 1) == 2 {
                                -						logf("intentional write failure")
                                -						return 0, errors.New("second write fails")
                                -					}
                                -					logf("Write(%q)", p)
                                -					return c.Write(p)
                                -				},
                                -			}, nil
                                -		},
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).Dial = func(network, addr string) (net.Conn, error) {
                                +		logf("Dial")
                                +		c, err := net.Dial(network, ts.Listener.Addr().String())
                                +		if err != nil {
                                +			logf("Dial error: %v", err)
                                +			return nil, err
                                +		}
                                +		return &writerFuncConn{
                                +			Conn: c,
                                +			write: func(p []byte) (n int, err error) {
                                +				if atomic.AddInt32(&writeNumAtomic, 1) == 2 {
                                +					logf("intentional write failure")
                                +					return 0, errors.New("second write fails")
                                +				}
                                +				logf("Write(%q)", p)
                                +				return c.Write(p)
                                +			},
                                +		}, nil
                                 	}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                 
                                 	SetRoundTripRetried(func() {
                                 		logf("Retried.")
                                @@ -2752,6 +2693,7 @@
                                 		readBody <- err
                                 	}))
                                 	defer ts.Close()
                                +	c := ts.Client()
                                 	fakeErr := errors.New("fake error")
                                 	didClose := make(chan bool, 1)
                                 	req, _ := NewRequest("POST", ts.URL, struct {
                                @@ -2767,7 +2709,7 @@
                                 			return nil
                                 		}),
                                 	})
                                -	res, err := DefaultClient.Do(req)
                                +	res, err := c.Do(req)
                                 	if res != nil {
                                 		defer res.Body.Close()
                                 	}
                                @@ -2801,23 +2743,19 @@
                                 		mu.Unlock()
                                 	}))
                                 	defer ts.Close()
                                -	tr := &Transport{
                                -		DialTLS: func(netw, addr string) (net.Conn, error) {
                                -			mu.Lock()
                                -			didDial = true
                                -			mu.Unlock()
                                -			c, err := tls.Dial(netw, addr, &tls.Config{
                                -				InsecureSkipVerify: true,
                                -			})
                                -			if err != nil {
                                -				return nil, err
                                -			}
                                -			return c, c.Handshake()
                                -		},
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).DialTLS = func(netw, addr string) (net.Conn, error) {
                                +		mu.Lock()
                                +		didDial = true
                                +		mu.Unlock()
                                +		c, err := tls.Dial(netw, addr, c.Transport.(*Transport).TLSClientConfig)
                                +		if err != nil {
                                +			return nil, err
                                +		}
                                +		return c, c.Handshake()
                                 	}
                                -	defer tr.CloseIdleConnections()
                                -	client := &Client{Transport: tr}
                                -	res, err := client.Get(ts.URL)
                                +
                                +	res, err := c.Get(ts.URL)
                                 	if err != nil {
                                 		t.Fatal(err)
                                 	}
                                @@ -2899,10 +2837,11 @@
                                 		reqc <- r
                                 	}))
                                 	defer ts.Close()
                                +	c := ts.Client()
                                 
                                 	req, _ := NewRequest("GET", ts.URL, nil)
                                 	req.Header.Set("Range", "bytes=7-11")
                                -	res, err := DefaultClient.Do(req)
                                +	res, err := c.Do(req)
                                 	if err != nil {
                                 		t.Fatal(err)
                                 	}
                                @@ -2931,9 +2870,7 @@
                                 		w.Write(b[:])
                                 	}))
                                 	defer ts.Close()
                                -
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                +	tr := ts.Client().Transport.(*Transport)
                                 
                                 	req, err := NewRequest("GET", ts.URL, nil)
                                 	if err != nil {
                                @@ -2967,9 +2904,7 @@
                                 
                                 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
                                 	defer ts.Close()
                                -
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                +	tr := ts.Client().Transport.(*Transport)
                                 
                                 	req, err := NewRequest("GET", ts.URL, nil)
                                 	if err != nil {
                                @@ -3096,6 +3031,7 @@
                                 		w.WriteHeader(StatusOK)
                                 	}))
                                 	defer ts.Close()
                                +	c := ts.Client()
                                 
                                 	fail := 0
                                 	count := 100
                                @@ -3105,10 +3041,7 @@
                                 		if err != nil {
                                 			t.Fatal(err)
                                 		}
                                -		tr := new(Transport)
                                -		defer tr.CloseIdleConnections()
                                -		client := &Client{Transport: tr}
                                -		resp, err := client.Do(req)
                                +		resp, err := c.Do(req)
                                 		if err != nil {
                                 			fail++
                                 			t.Logf("%d = %#v", i, err)
                                @@ -3321,10 +3254,8 @@
                                 		w.Write(rgz) // arbitrary gzip response
                                 	}))
                                 	defer ts.Close()
                                +	c := ts.Client()
                                 
                                -	tr := &Transport{}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                 	for i := 0; i < 2; i++ {
                                 		res, err := c.Get(ts.URL)
                                 		if err != nil {
                                @@ -3353,12 +3284,9 @@
                                 		}
                                 	}))
                                 	defer ts.Close()
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).MaxResponseHeaderBytes = 512 << 10
                                 
                                -	tr := &Transport{
                                -		MaxResponseHeaderBytes: 512 << 10,
                                -	}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                 	if res, err := c.Get(ts.URL); err != nil {
                                 		t.Fatal(err)
                                 	} else {
                                @@ -3619,8 +3547,8 @@
                                 // connections. The http2 test is done in TestTransportEventTrace_h2
                                 func TestTLSHandshakeTrace(t *testing.T) {
                                 	defer afterTest(t)
                                -	s := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
                                -	defer s.Close()
                                +	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
                                +	defer ts.Close()
                                 
                                 	var mu sync.Mutex
                                 	var start, done bool
                                @@ -3640,10 +3568,8 @@
                                 		},
                                 	}
                                 
                                -	tr := &Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                -	req, err := NewRequest("GET", s.URL, nil)
                                +	c := ts.Client()
                                +	req, err := NewRequest("GET", ts.URL, nil)
                                 	if err != nil {
                                 		t.Fatal("Unable to construct test request:", err)
                                 	}
                                @@ -3670,16 +3596,14 @@
                                 		// No body for convenience.
                                 	}))
                                 	defer ts.Close()
                                -	tr := &Transport{
                                -		MaxIdleConns: 4,
                                -	}
                                -	defer tr.CloseIdleConnections()
                                +	c := ts.Client()
                                +	tr := c.Transport.(*Transport)
                                +	tr.MaxIdleConns = 4
                                 
                                 	ip, port, err := net.SplitHostPort(ts.Listener.Addr().String())
                                 	if err != nil {
                                 		t.Fatal(err)
                                 	}
                                -	c := &Client{Transport: tr}
                                 	ctx := context.WithValue(context.Background(), nettrace.LookupIPAltResolverKey{}, func(ctx context.Context, host string) ([]net.IPAddr, error) {
                                 		return []net.IPAddr{{IP: net.ParseIP(ip)}}, nil
                                 	})
                                @@ -3975,17 +3899,16 @@
                                 		c.Close()
                                 	}))
                                 	defer ts.Close()
                                -	tr := &Transport{
                                -		ProxyConnectHeader: Header{
                                -			"User-Agent": {"foo"},
                                -			"Other":      {"bar"},
                                -		},
                                -		Proxy: func(r *Request) (*url.URL, error) {
                                -			return url.Parse(ts.URL)
                                -		},
                                +
                                +	c := ts.Client()
                                +	c.Transport.(*Transport).Proxy = func(r *Request) (*url.URL, error) {
                                +		return url.Parse(ts.URL)
                                 	}
                                -	defer tr.CloseIdleConnections()
                                -	c := &Client{Transport: tr}
                                +	c.Transport.(*Transport).ProxyConnectHeader = Header{
                                +		"User-Agent": {"foo"},
                                +		"Other":      {"bar"},
                                +	}
                                +
                                 	res, err := c.Get("https://dummy.tld/") // https to force a CONNECT
                                 	if err == nil {
                                 		res.Body.Close()
                                

                                To view, visit change 37771. To unsubscribe, visit settings.

                                Gerrit-Project: go
                                Gerrit-Branch: master
                                Gerrit-MessageType: merged
                                Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                                Gerrit-Change-Number: 37771
                                Gerrit-PatchSet: 4

                                Gobot Gobot (Gerrit)

                                unread,
                                Mar 8, 2017, 10:57:39 AM3/8/17
                                to Johan Brandhorst, Brad Fitzpatrick, golang-co...@googlegroups.com

                                Gobot Gobot posted comments on this change.

                                View Change

                                Patch set 3:TryBot-Result +1

                                TryBots are happy.

                                  To view, visit change 37771. To unsubscribe, visit settings.

                                  Gerrit-Project: go
                                  Gerrit-Branch: master
                                  Gerrit-MessageType: comment
                                  Gerrit-Change-Id: I9f9d15f59d72893deead5678d314388718c91821
                                  Gerrit-Change-Number: 37771
                                  Gerrit-PatchSet: 3
                                  Gerrit-Owner: Johan Brandhorst <johan.br...@gmail.com>
                                  Gerrit-Reviewer: Brad Fitzpatrick <brad...@golang.org>
                                  Gerrit-Reviewer: Gobot Gobot <go...@golang.org>
                                  Gerrit-Reviewer: Johan Brandhorst <johan.br...@gmail.com>
                                  Gerrit-Comment-Date: Wed, 08 Mar 2017 15:57:37 +0000
                                  Gerrit-HasComments: No
                                  Reply all
                                  Reply to author
                                  Forward
                                  0 new messages