github.com/FenixAra/go@v0.0.0-20170127160404-96ea0918e670/src/net/http/transport_test.go (about)

     1  // Copyright 2011 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Tests for transport.go.
     6  //
     7  // More tests are in clientserver_test.go (for things testing both client & server for both
     8  // HTTP/1 and HTTP/2). This
     9  
    10  package http_test
    11  
    12  import (
    13  	"bufio"
    14  	"bytes"
    15  	"compress/gzip"
    16  	"context"
    17  	"crypto/rand"
    18  	"crypto/tls"
    19  	"errors"
    20  	"fmt"
    21  	"internal/nettrace"
    22  	"internal/testenv"
    23  	"io"
    24  	"io/ioutil"
    25  	"log"
    26  	"net"
    27  	. "net/http"
    28  	"net/http/httptest"
    29  	"net/http/httptrace"
    30  	"net/http/httputil"
    31  	"net/http/internal"
    32  	"net/url"
    33  	"os"
    34  	"reflect"
    35  	"runtime"
    36  	"strconv"
    37  	"strings"
    38  	"sync"
    39  	"sync/atomic"
    40  	"testing"
    41  	"time"
    42  )
    43  
    44  // TODO: test 5 pipelined requests with responses: 1) OK, 2) OK, Connection: Close
    45  //       and then verify that the final 2 responses get errors back.
    46  
    47  // hostPortHandler writes back the client's "host:port".
    48  var hostPortHandler = HandlerFunc(func(w ResponseWriter, r *Request) {
    49  	if r.FormValue("close") == "true" {
    50  		w.Header().Set("Connection", "close")
    51  	}
    52  	w.Header().Set("X-Saw-Close", fmt.Sprint(r.Close))
    53  	w.Write([]byte(r.RemoteAddr))
    54  })
    55  
    56  // testCloseConn is a net.Conn tracked by a testConnSet.
    57  type testCloseConn struct {
    58  	net.Conn
    59  	set *testConnSet
    60  }
    61  
    62  func (c *testCloseConn) Close() error {
    63  	c.set.remove(c)
    64  	return c.Conn.Close()
    65  }
    66  
    67  // testConnSet tracks a set of TCP connections and whether they've
    68  // been closed.
    69  type testConnSet struct {
    70  	t      *testing.T
    71  	mu     sync.Mutex // guards closed and list
    72  	closed map[net.Conn]bool
    73  	list   []net.Conn // in order created
    74  }
    75  
    76  func (tcs *testConnSet) insert(c net.Conn) {
    77  	tcs.mu.Lock()
    78  	defer tcs.mu.Unlock()
    79  	tcs.closed[c] = false
    80  	tcs.list = append(tcs.list, c)
    81  }
    82  
    83  func (tcs *testConnSet) remove(c net.Conn) {
    84  	tcs.mu.Lock()
    85  	defer tcs.mu.Unlock()
    86  	tcs.closed[c] = true
    87  }
    88  
    89  // some tests use this to manage raw tcp connections for later inspection
    90  func makeTestDial(t *testing.T) (*testConnSet, func(n, addr string) (net.Conn, error)) {
    91  	connSet := &testConnSet{
    92  		t:      t,
    93  		closed: make(map[net.Conn]bool),
    94  	}
    95  	dial := func(n, addr string) (net.Conn, error) {
    96  		c, err := net.Dial(n, addr)
    97  		if err != nil {
    98  			return nil, err
    99  		}
   100  		tc := &testCloseConn{c, connSet}
   101  		connSet.insert(tc)
   102  		return tc, nil
   103  	}
   104  	return connSet, dial
   105  }
   106  
   107  func (tcs *testConnSet) check(t *testing.T) {
   108  	tcs.mu.Lock()
   109  	defer tcs.mu.Unlock()
   110  	for i := 4; i >= 0; i-- {
   111  		for i, c := range tcs.list {
   112  			if tcs.closed[c] {
   113  				continue
   114  			}
   115  			if i != 0 {
   116  				tcs.mu.Unlock()
   117  				time.Sleep(50 * time.Millisecond)
   118  				tcs.mu.Lock()
   119  				continue
   120  			}
   121  			t.Errorf("TCP connection #%d, %p (of %d total) was not closed", i+1, c, len(tcs.list))
   122  		}
   123  	}
   124  }
   125  
   126  // Two subsequent requests and verify their response is the same.
   127  // The response from the server is our own IP:port
   128  func TestTransportKeepAlives(t *testing.T) {
   129  	defer afterTest(t)
   130  	ts := httptest.NewServer(hostPortHandler)
   131  	defer ts.Close()
   132  
   133  	for _, disableKeepAlive := range []bool{false, true} {
   134  		tr := &Transport{DisableKeepAlives: disableKeepAlive}
   135  		defer tr.CloseIdleConnections()
   136  		c := &Client{Transport: tr}
   137  
   138  		fetch := func(n int) string {
   139  			res, err := c.Get(ts.URL)
   140  			if err != nil {
   141  				t.Fatalf("error in disableKeepAlive=%v, req #%d, GET: %v", disableKeepAlive, n, err)
   142  			}
   143  			body, err := ioutil.ReadAll(res.Body)
   144  			if err != nil {
   145  				t.Fatalf("error in disableKeepAlive=%v, req #%d, ReadAll: %v", disableKeepAlive, n, err)
   146  			}
   147  			return string(body)
   148  		}
   149  
   150  		body1 := fetch(1)
   151  		body2 := fetch(2)
   152  
   153  		bodiesDiffer := body1 != body2
   154  		if bodiesDiffer != disableKeepAlive {
   155  			t.Errorf("error in disableKeepAlive=%v. unexpected bodiesDiffer=%v; body1=%q; body2=%q",
   156  				disableKeepAlive, bodiesDiffer, body1, body2)
   157  		}
   158  	}
   159  }
   160  
   161  func TestTransportConnectionCloseOnResponse(t *testing.T) {
   162  	defer afterTest(t)
   163  	ts := httptest.NewServer(hostPortHandler)
   164  	defer ts.Close()
   165  
   166  	connSet, testDial := makeTestDial(t)
   167  
   168  	for _, connectionClose := range []bool{false, true} {
   169  		tr := &Transport{
   170  			Dial: testDial,
   171  		}
   172  		c := &Client{Transport: tr}
   173  
   174  		fetch := func(n int) string {
   175  			req := new(Request)
   176  			var err error
   177  			req.URL, err = url.Parse(ts.URL + fmt.Sprintf("/?close=%v", connectionClose))
   178  			if err != nil {
   179  				t.Fatalf("URL parse error: %v", err)
   180  			}
   181  			req.Method = "GET"
   182  			req.Proto = "HTTP/1.1"
   183  			req.ProtoMajor = 1
   184  			req.ProtoMinor = 1
   185  
   186  			res, err := c.Do(req)
   187  			if err != nil {
   188  				t.Fatalf("error in connectionClose=%v, req #%d, Do: %v", connectionClose, n, err)
   189  			}
   190  			defer res.Body.Close()
   191  			body, err := ioutil.ReadAll(res.Body)
   192  			if err != nil {
   193  				t.Fatalf("error in connectionClose=%v, req #%d, ReadAll: %v", connectionClose, n, err)
   194  			}
   195  			return string(body)
   196  		}
   197  
   198  		body1 := fetch(1)
   199  		body2 := fetch(2)
   200  		bodiesDiffer := body1 != body2
   201  		if bodiesDiffer != connectionClose {
   202  			t.Errorf("error in connectionClose=%v. unexpected bodiesDiffer=%v; body1=%q; body2=%q",
   203  				connectionClose, bodiesDiffer, body1, body2)
   204  		}
   205  
   206  		tr.CloseIdleConnections()
   207  	}
   208  
   209  	connSet.check(t)
   210  }
   211  
   212  func TestTransportConnectionCloseOnRequest(t *testing.T) {
   213  	defer afterTest(t)
   214  	ts := httptest.NewServer(hostPortHandler)
   215  	defer ts.Close()
   216  
   217  	connSet, testDial := makeTestDial(t)
   218  
   219  	for _, connectionClose := range []bool{false, true} {
   220  		tr := &Transport{
   221  			Dial: testDial,
   222  		}
   223  		c := &Client{Transport: tr}
   224  
   225  		fetch := func(n int) string {
   226  			req := new(Request)
   227  			var err error
   228  			req.URL, err = url.Parse(ts.URL)
   229  			if err != nil {
   230  				t.Fatalf("URL parse error: %v", err)
   231  			}
   232  			req.Method = "GET"
   233  			req.Proto = "HTTP/1.1"
   234  			req.ProtoMajor = 1
   235  			req.ProtoMinor = 1
   236  			req.Close = connectionClose
   237  
   238  			res, err := c.Do(req)
   239  			if err != nil {
   240  				t.Fatalf("error in connectionClose=%v, req #%d, Do: %v", connectionClose, n, err)
   241  			}
   242  			if got, want := res.Header.Get("X-Saw-Close"), fmt.Sprint(connectionClose); got != want {
   243  				t.Errorf("For connectionClose = %v; handler's X-Saw-Close was %v; want %v",
   244  					connectionClose, got, !connectionClose)
   245  			}
   246  			body, err := ioutil.ReadAll(res.Body)
   247  			if err != nil {
   248  				t.Fatalf("error in connectionClose=%v, req #%d, ReadAll: %v", connectionClose, n, err)
   249  			}
   250  			return string(body)
   251  		}
   252  
   253  		body1 := fetch(1)
   254  		body2 := fetch(2)
   255  		bodiesDiffer := body1 != body2
   256  		if bodiesDiffer != connectionClose {
   257  			t.Errorf("error in connectionClose=%v. unexpected bodiesDiffer=%v; body1=%q; body2=%q",
   258  				connectionClose, bodiesDiffer, body1, body2)
   259  		}
   260  
   261  		tr.CloseIdleConnections()
   262  	}
   263  
   264  	connSet.check(t)
   265  }
   266  
   267  // if the Transport's DisableKeepAlives is set, all requests should
   268  // send Connection: close.
   269  // HTTP/1-only (Connection: close doesn't exist in h2)
   270  func TestTransportConnectionCloseOnRequestDisableKeepAlive(t *testing.T) {
   271  	defer afterTest(t)
   272  	ts := httptest.NewServer(hostPortHandler)
   273  	defer ts.Close()
   274  
   275  	tr := &Transport{
   276  		DisableKeepAlives: true,
   277  	}
   278  	c := &Client{Transport: tr}
   279  	res, err := c.Get(ts.URL)
   280  	if err != nil {
   281  		t.Fatal(err)
   282  	}
   283  	res.Body.Close()
   284  	if res.Header.Get("X-Saw-Close") != "true" {
   285  		t.Errorf("handler didn't see Connection: close ")
   286  	}
   287  }
   288  
   289  func TestTransportIdleCacheKeys(t *testing.T) {
   290  	defer afterTest(t)
   291  	ts := httptest.NewServer(hostPortHandler)
   292  	defer ts.Close()
   293  
   294  	tr := &Transport{DisableKeepAlives: false}
   295  	c := &Client{Transport: tr}
   296  
   297  	if e, g := 0, len(tr.IdleConnKeysForTesting()); e != g {
   298  		t.Errorf("After CloseIdleConnections expected %d idle conn cache keys; got %d", e, g)
   299  	}
   300  
   301  	resp, err := c.Get(ts.URL)
   302  	if err != nil {
   303  		t.Error(err)
   304  	}
   305  	ioutil.ReadAll(resp.Body)
   306  
   307  	keys := tr.IdleConnKeysForTesting()
   308  	if e, g := 1, len(keys); e != g {
   309  		t.Fatalf("After Get expected %d idle conn cache keys; got %d", e, g)
   310  	}
   311  
   312  	if e := "|http|" + ts.Listener.Addr().String(); keys[0] != e {
   313  		t.Errorf("Expected idle cache key %q; got %q", e, keys[0])
   314  	}
   315  
   316  	tr.CloseIdleConnections()
   317  	if e, g := 0, len(tr.IdleConnKeysForTesting()); e != g {
   318  		t.Errorf("After CloseIdleConnections expected %d idle conn cache keys; got %d", e, g)
   319  	}
   320  }
   321  
   322  // Tests that the HTTP transport re-uses connections when a client
   323  // reads to the end of a response Body without closing it.
   324  func TestTransportReadToEndReusesConn(t *testing.T) {
   325  	defer afterTest(t)
   326  	const msg = "foobar"
   327  
   328  	var addrSeen map[string]int
   329  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   330  		addrSeen[r.RemoteAddr]++
   331  		if r.URL.Path == "/chunked/" {
   332  			w.WriteHeader(200)
   333  			w.(Flusher).Flush()
   334  		} else {
   335  			w.Header().Set("Content-Type", strconv.Itoa(len(msg)))
   336  			w.WriteHeader(200)
   337  		}
   338  		w.Write([]byte(msg))
   339  	}))
   340  	defer ts.Close()
   341  
   342  	buf := make([]byte, len(msg))
   343  
   344  	for pi, path := range []string{"/content-length/", "/chunked/"} {
   345  		wantLen := []int{len(msg), -1}[pi]
   346  		addrSeen = make(map[string]int)
   347  		for i := 0; i < 3; i++ {
   348  			res, err := Get(ts.URL + path)
   349  			if err != nil {
   350  				t.Errorf("Get %s: %v", path, err)
   351  				continue
   352  			}
   353  			// We want to close this body eventually (before the
   354  			// defer afterTest at top runs), but not before the
   355  			// len(addrSeen) check at the bottom of this test,
   356  			// since Closing this early in the loop would risk
   357  			// making connections be re-used for the wrong reason.
   358  			defer res.Body.Close()
   359  
   360  			if res.ContentLength != int64(wantLen) {
   361  				t.Errorf("%s res.ContentLength = %d; want %d", path, res.ContentLength, wantLen)
   362  			}
   363  			n, err := res.Body.Read(buf)
   364  			if n != len(msg) || err != io.EOF {
   365  				t.Errorf("%s Read = %v, %v; want %d, EOF", path, n, err, len(msg))
   366  			}
   367  		}
   368  		if len(addrSeen) != 1 {
   369  			t.Errorf("for %s, server saw %d distinct client addresses; want 1", path, len(addrSeen))
   370  		}
   371  	}
   372  }
   373  
   374  func TestTransportMaxPerHostIdleConns(t *testing.T) {
   375  	defer afterTest(t)
   376  	resch := make(chan string)
   377  	gotReq := make(chan bool)
   378  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   379  		gotReq <- true
   380  		msg := <-resch
   381  		_, err := w.Write([]byte(msg))
   382  		if err != nil {
   383  			t.Fatalf("Write: %v", err)
   384  		}
   385  	}))
   386  	defer ts.Close()
   387  	maxIdleConnsPerHost := 2
   388  	tr := &Transport{DisableKeepAlives: false, MaxIdleConnsPerHost: maxIdleConnsPerHost}
   389  	c := &Client{Transport: tr}
   390  
   391  	// Start 3 outstanding requests and wait for the server to get them.
   392  	// Their responses will hang until we write to resch, though.
   393  	donech := make(chan bool)
   394  	doReq := func() {
   395  		resp, err := c.Get(ts.URL)
   396  		if err != nil {
   397  			t.Error(err)
   398  			return
   399  		}
   400  		if _, err := ioutil.ReadAll(resp.Body); err != nil {
   401  			t.Errorf("ReadAll: %v", err)
   402  			return
   403  		}
   404  		donech <- true
   405  	}
   406  	go doReq()
   407  	<-gotReq
   408  	go doReq()
   409  	<-gotReq
   410  	go doReq()
   411  	<-gotReq
   412  
   413  	if e, g := 0, len(tr.IdleConnKeysForTesting()); e != g {
   414  		t.Fatalf("Before writes, expected %d idle conn cache keys; got %d", e, g)
   415  	}
   416  
   417  	resch <- "res1"
   418  	<-donech
   419  	keys := tr.IdleConnKeysForTesting()
   420  	if e, g := 1, len(keys); e != g {
   421  		t.Fatalf("after first response, expected %d idle conn cache keys; got %d", e, g)
   422  	}
   423  	cacheKey := "|http|" + ts.Listener.Addr().String()
   424  	if keys[0] != cacheKey {
   425  		t.Fatalf("Expected idle cache key %q; got %q", cacheKey, keys[0])
   426  	}
   427  	if e, g := 1, tr.IdleConnCountForTesting(cacheKey); e != g {
   428  		t.Errorf("after first response, expected %d idle conns; got %d", e, g)
   429  	}
   430  
   431  	resch <- "res2"
   432  	<-donech
   433  	if g, w := tr.IdleConnCountForTesting(cacheKey), 2; g != w {
   434  		t.Errorf("after second response, idle conns = %d; want %d", g, w)
   435  	}
   436  
   437  	resch <- "res3"
   438  	<-donech
   439  	if g, w := tr.IdleConnCountForTesting(cacheKey), maxIdleConnsPerHost; g != w {
   440  		t.Errorf("after third response, idle conns = %d; want %d", g, w)
   441  	}
   442  }
   443  
   444  func TestTransportRemovesDeadIdleConnections(t *testing.T) {
   445  	setParallel(t)
   446  	defer afterTest(t)
   447  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   448  		io.WriteString(w, r.RemoteAddr)
   449  	}))
   450  	defer ts.Close()
   451  
   452  	tr := &Transport{}
   453  	defer tr.CloseIdleConnections()
   454  	c := &Client{Transport: tr}
   455  
   456  	doReq := func(name string) string {
   457  		// Do a POST instead of a GET to prevent the Transport's
   458  		// idempotent request retry logic from kicking in...
   459  		res, err := c.Post(ts.URL, "", nil)
   460  		if err != nil {
   461  			t.Fatalf("%s: %v", name, err)
   462  		}
   463  		if res.StatusCode != 200 {
   464  			t.Fatalf("%s: %v", name, res.Status)
   465  		}
   466  		defer res.Body.Close()
   467  		slurp, err := ioutil.ReadAll(res.Body)
   468  		if err != nil {
   469  			t.Fatalf("%s: %v", name, err)
   470  		}
   471  		return string(slurp)
   472  	}
   473  
   474  	first := doReq("first")
   475  	keys1 := tr.IdleConnKeysForTesting()
   476  
   477  	ts.CloseClientConnections()
   478  
   479  	var keys2 []string
   480  	if !waitCondition(3*time.Second, 50*time.Millisecond, func() bool {
   481  		keys2 = tr.IdleConnKeysForTesting()
   482  		return len(keys2) == 0
   483  	}) {
   484  		t.Fatalf("Transport didn't notice idle connection's death.\nbefore: %q\n after: %q\n", keys1, keys2)
   485  	}
   486  
   487  	second := doReq("second")
   488  	if first == second {
   489  		t.Errorf("expected a different connection between requests. got %q both times", first)
   490  	}
   491  }
   492  
   493  func TestTransportServerClosingUnexpectedly(t *testing.T) {
   494  	setParallel(t)
   495  	defer afterTest(t)
   496  	ts := httptest.NewServer(hostPortHandler)
   497  	defer ts.Close()
   498  
   499  	tr := &Transport{}
   500  	c := &Client{Transport: tr}
   501  
   502  	fetch := func(n, retries int) string {
   503  		condFatalf := func(format string, arg ...interface{}) {
   504  			if retries <= 0 {
   505  				t.Fatalf(format, arg...)
   506  			}
   507  			t.Logf("retrying shortly after expected error: "+format, arg...)
   508  			time.Sleep(time.Second / time.Duration(retries))
   509  		}
   510  		for retries >= 0 {
   511  			retries--
   512  			res, err := c.Get(ts.URL)
   513  			if err != nil {
   514  				condFatalf("error in req #%d, GET: %v", n, err)
   515  				continue
   516  			}
   517  			body, err := ioutil.ReadAll(res.Body)
   518  			if err != nil {
   519  				condFatalf("error in req #%d, ReadAll: %v", n, err)
   520  				continue
   521  			}
   522  			res.Body.Close()
   523  			return string(body)
   524  		}
   525  		panic("unreachable")
   526  	}
   527  
   528  	body1 := fetch(1, 0)
   529  	body2 := fetch(2, 0)
   530  
   531  	ts.CloseClientConnections() // surprise!
   532  
   533  	// This test has an expected race. Sleeping for 25 ms prevents
   534  	// it on most fast machines, causing the next fetch() call to
   535  	// succeed quickly. But if we do get errors, fetch() will retry 5
   536  	// times with some delays between.
   537  	time.Sleep(25 * time.Millisecond)
   538  
   539  	body3 := fetch(3, 5)
   540  
   541  	if body1 != body2 {
   542  		t.Errorf("expected body1 and body2 to be equal")
   543  	}
   544  	if body2 == body3 {
   545  		t.Errorf("expected body2 and body3 to be different")
   546  	}
   547  }
   548  
   549  // Test for https://golang.org/issue/2616 (appropriate issue number)
   550  // This fails pretty reliably with GOMAXPROCS=100 or something high.
   551  func TestStressSurpriseServerCloses(t *testing.T) {
   552  	defer afterTest(t)
   553  	if testing.Short() {
   554  		t.Skip("skipping test in short mode")
   555  	}
   556  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   557  		w.Header().Set("Content-Length", "5")
   558  		w.Header().Set("Content-Type", "text/plain")
   559  		w.Write([]byte("Hello"))
   560  		w.(Flusher).Flush()
   561  		conn, buf, _ := w.(Hijacker).Hijack()
   562  		buf.Flush()
   563  		conn.Close()
   564  	}))
   565  	defer ts.Close()
   566  
   567  	tr := &Transport{DisableKeepAlives: false}
   568  	c := &Client{Transport: tr}
   569  	defer tr.CloseIdleConnections()
   570  
   571  	// Do a bunch of traffic from different goroutines. Send to activityc
   572  	// after each request completes, regardless of whether it failed.
   573  	// If these are too high, OS X exhausts its ephemeral ports
   574  	// and hangs waiting for them to transition TCP states. That's
   575  	// not what we want to test. TODO(bradfitz): use an io.Pipe
   576  	// dialer for this test instead?
   577  	const (
   578  		numClients    = 20
   579  		reqsPerClient = 25
   580  	)
   581  	activityc := make(chan bool)
   582  	for i := 0; i < numClients; i++ {
   583  		go func() {
   584  			for i := 0; i < reqsPerClient; i++ {
   585  				res, err := c.Get(ts.URL)
   586  				if err == nil {
   587  					// We expect errors since the server is
   588  					// hanging up on us after telling us to
   589  					// send more requests, so we don't
   590  					// actually care what the error is.
   591  					// But we want to close the body in cases
   592  					// where we won the race.
   593  					res.Body.Close()
   594  				}
   595  				activityc <- true
   596  			}
   597  		}()
   598  	}
   599  
   600  	// Make sure all the request come back, one way or another.
   601  	for i := 0; i < numClients*reqsPerClient; i++ {
   602  		select {
   603  		case <-activityc:
   604  		case <-time.After(5 * time.Second):
   605  			t.Fatalf("presumed deadlock; no HTTP client activity seen in awhile")
   606  		}
   607  	}
   608  }
   609  
   610  // TestTransportHeadResponses verifies that we deal with Content-Lengths
   611  // with no bodies properly
   612  func TestTransportHeadResponses(t *testing.T) {
   613  	defer afterTest(t)
   614  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   615  		if r.Method != "HEAD" {
   616  			panic("expected HEAD; got " + r.Method)
   617  		}
   618  		w.Header().Set("Content-Length", "123")
   619  		w.WriteHeader(200)
   620  	}))
   621  	defer ts.Close()
   622  
   623  	tr := &Transport{DisableKeepAlives: false}
   624  	c := &Client{Transport: tr}
   625  	for i := 0; i < 2; i++ {
   626  		res, err := c.Head(ts.URL)
   627  		if err != nil {
   628  			t.Errorf("error on loop %d: %v", i, err)
   629  			continue
   630  		}
   631  		if e, g := "123", res.Header.Get("Content-Length"); e != g {
   632  			t.Errorf("loop %d: expected Content-Length header of %q, got %q", i, e, g)
   633  		}
   634  		if e, g := int64(123), res.ContentLength; e != g {
   635  			t.Errorf("loop %d: expected res.ContentLength of %v, got %v", i, e, g)
   636  		}
   637  		if all, err := ioutil.ReadAll(res.Body); err != nil {
   638  			t.Errorf("loop %d: Body ReadAll: %v", i, err)
   639  		} else if len(all) != 0 {
   640  			t.Errorf("Bogus body %q", all)
   641  		}
   642  	}
   643  }
   644  
   645  // TestTransportHeadChunkedResponse verifies that we ignore chunked transfer-encoding
   646  // on responses to HEAD requests.
   647  func TestTransportHeadChunkedResponse(t *testing.T) {
   648  	defer afterTest(t)
   649  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   650  		if r.Method != "HEAD" {
   651  			panic("expected HEAD; got " + r.Method)
   652  		}
   653  		w.Header().Set("Transfer-Encoding", "chunked") // client should ignore
   654  		w.Header().Set("x-client-ipport", r.RemoteAddr)
   655  		w.WriteHeader(200)
   656  	}))
   657  	defer ts.Close()
   658  
   659  	tr := &Transport{DisableKeepAlives: false}
   660  	c := &Client{Transport: tr}
   661  	defer tr.CloseIdleConnections()
   662  
   663  	// Ensure that we wait for the readLoop to complete before
   664  	// calling Head again
   665  	didRead := make(chan bool)
   666  	SetReadLoopBeforeNextReadHook(func() { didRead <- true })
   667  	defer SetReadLoopBeforeNextReadHook(nil)
   668  
   669  	res1, err := c.Head(ts.URL)
   670  	<-didRead
   671  
   672  	if err != nil {
   673  		t.Fatalf("request 1 error: %v", err)
   674  	}
   675  
   676  	res2, err := c.Head(ts.URL)
   677  	<-didRead
   678  
   679  	if err != nil {
   680  		t.Fatalf("request 2 error: %v", err)
   681  	}
   682  	if v1, v2 := res1.Header.Get("x-client-ipport"), res2.Header.Get("x-client-ipport"); v1 != v2 {
   683  		t.Errorf("ip/ports differed between head requests: %q vs %q", v1, v2)
   684  	}
   685  }
   686  
   687  var roundTripTests = []struct {
   688  	accept       string
   689  	expectAccept string
   690  	compressed   bool
   691  }{
   692  	// Requests with no accept-encoding header use transparent compression
   693  	{"", "gzip", false},
   694  	// Requests with other accept-encoding should pass through unmodified
   695  	{"foo", "foo", false},
   696  	// Requests with accept-encoding == gzip should be passed through
   697  	{"gzip", "gzip", true},
   698  }
   699  
   700  // Test that the modification made to the Request by the RoundTripper is cleaned up
   701  func TestRoundTripGzip(t *testing.T) {
   702  	setParallel(t)
   703  	defer afterTest(t)
   704  	const responseBody = "test response body"
   705  	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
   706  		accept := req.Header.Get("Accept-Encoding")
   707  		if expect := req.FormValue("expect_accept"); accept != expect {
   708  			t.Errorf("in handler, test %v: Accept-Encoding = %q, want %q",
   709  				req.FormValue("testnum"), accept, expect)
   710  		}
   711  		if accept == "gzip" {
   712  			rw.Header().Set("Content-Encoding", "gzip")
   713  			gz := gzip.NewWriter(rw)
   714  			gz.Write([]byte(responseBody))
   715  			gz.Close()
   716  		} else {
   717  			rw.Header().Set("Content-Encoding", accept)
   718  			rw.Write([]byte(responseBody))
   719  		}
   720  	}))
   721  	defer ts.Close()
   722  
   723  	for i, test := range roundTripTests {
   724  		// Test basic request (no accept-encoding)
   725  		req, _ := NewRequest("GET", fmt.Sprintf("%s/?testnum=%d&expect_accept=%s", ts.URL, i, test.expectAccept), nil)
   726  		if test.accept != "" {
   727  			req.Header.Set("Accept-Encoding", test.accept)
   728  		}
   729  		res, err := DefaultTransport.RoundTrip(req)
   730  		var body []byte
   731  		if test.compressed {
   732  			var r *gzip.Reader
   733  			r, err = gzip.NewReader(res.Body)
   734  			if err != nil {
   735  				t.Errorf("%d. gzip NewReader: %v", i, err)
   736  				continue
   737  			}
   738  			body, err = ioutil.ReadAll(r)
   739  			res.Body.Close()
   740  		} else {
   741  			body, err = ioutil.ReadAll(res.Body)
   742  		}
   743  		if err != nil {
   744  			t.Errorf("%d. Error: %q", i, err)
   745  			continue
   746  		}
   747  		if g, e := string(body), responseBody; g != e {
   748  			t.Errorf("%d. body = %q; want %q", i, g, e)
   749  		}
   750  		if g, e := req.Header.Get("Accept-Encoding"), test.accept; g != e {
   751  			t.Errorf("%d. Accept-Encoding = %q; want %q (it was mutated, in violation of RoundTrip contract)", i, g, e)
   752  		}
   753  		if g, e := res.Header.Get("Content-Encoding"), test.accept; g != e {
   754  			t.Errorf("%d. Content-Encoding = %q; want %q", i, g, e)
   755  		}
   756  	}
   757  
   758  }
   759  
   760  func TestTransportGzip(t *testing.T) {
   761  	setParallel(t)
   762  	defer afterTest(t)
   763  	const testString = "The test string aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
   764  	const nRandBytes = 1024 * 1024
   765  	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
   766  		if req.Method == "HEAD" {
   767  			if g := req.Header.Get("Accept-Encoding"); g != "" {
   768  				t.Errorf("HEAD request sent with Accept-Encoding of %q; want none", g)
   769  			}
   770  			return
   771  		}
   772  		if g, e := req.Header.Get("Accept-Encoding"), "gzip"; g != e {
   773  			t.Errorf("Accept-Encoding = %q, want %q", g, e)
   774  		}
   775  		rw.Header().Set("Content-Encoding", "gzip")
   776  
   777  		var w io.Writer = rw
   778  		var buf bytes.Buffer
   779  		if req.FormValue("chunked") == "0" {
   780  			w = &buf
   781  			defer io.Copy(rw, &buf)
   782  			defer func() {
   783  				rw.Header().Set("Content-Length", strconv.Itoa(buf.Len()))
   784  			}()
   785  		}
   786  		gz := gzip.NewWriter(w)
   787  		gz.Write([]byte(testString))
   788  		if req.FormValue("body") == "large" {
   789  			io.CopyN(gz, rand.Reader, nRandBytes)
   790  		}
   791  		gz.Close()
   792  	}))
   793  	defer ts.Close()
   794  
   795  	for _, chunked := range []string{"1", "0"} {
   796  		c := &Client{Transport: &Transport{}}
   797  
   798  		// First fetch something large, but only read some of it.
   799  		res, err := c.Get(ts.URL + "/?body=large&chunked=" + chunked)
   800  		if err != nil {
   801  			t.Fatalf("large get: %v", err)
   802  		}
   803  		buf := make([]byte, len(testString))
   804  		n, err := io.ReadFull(res.Body, buf)
   805  		if err != nil {
   806  			t.Fatalf("partial read of large response: size=%d, %v", n, err)
   807  		}
   808  		if e, g := testString, string(buf); e != g {
   809  			t.Errorf("partial read got %q, expected %q", g, e)
   810  		}
   811  		res.Body.Close()
   812  		// Read on the body, even though it's closed
   813  		n, err = res.Body.Read(buf)
   814  		if n != 0 || err == nil {
   815  			t.Errorf("expected error post-closed large Read; got = %d, %v", n, err)
   816  		}
   817  
   818  		// Then something small.
   819  		res, err = c.Get(ts.URL + "/?chunked=" + chunked)
   820  		if err != nil {
   821  			t.Fatal(err)
   822  		}
   823  		body, err := ioutil.ReadAll(res.Body)
   824  		if err != nil {
   825  			t.Fatal(err)
   826  		}
   827  		if g, e := string(body), testString; g != e {
   828  			t.Fatalf("body = %q; want %q", g, e)
   829  		}
   830  		if g, e := res.Header.Get("Content-Encoding"), ""; g != e {
   831  			t.Fatalf("Content-Encoding = %q; want %q", g, e)
   832  		}
   833  
   834  		// Read on the body after it's been fully read:
   835  		n, err = res.Body.Read(buf)
   836  		if n != 0 || err == nil {
   837  			t.Errorf("expected Read error after exhausted reads; got %d, %v", n, err)
   838  		}
   839  		res.Body.Close()
   840  		n, err = res.Body.Read(buf)
   841  		if n != 0 || err == nil {
   842  			t.Errorf("expected Read error after Close; got %d, %v", n, err)
   843  		}
   844  	}
   845  
   846  	// And a HEAD request too, because they're always weird.
   847  	c := &Client{Transport: &Transport{}}
   848  	res, err := c.Head(ts.URL)
   849  	if err != nil {
   850  		t.Fatalf("Head: %v", err)
   851  	}
   852  	if res.StatusCode != 200 {
   853  		t.Errorf("Head status=%d; want=200", res.StatusCode)
   854  	}
   855  }
   856  
   857  // If a request has Expect:100-continue header, the request blocks sending body until the first response.
   858  // Premature consumption of the request body should not be occurred.
   859  func TestTransportExpect100Continue(t *testing.T) {
   860  	setParallel(t)
   861  	defer afterTest(t)
   862  
   863  	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
   864  		switch req.URL.Path {
   865  		case "/100":
   866  			// This endpoint implicitly responds 100 Continue and reads body.
   867  			if _, err := io.Copy(ioutil.Discard, req.Body); err != nil {
   868  				t.Error("Failed to read Body", err)
   869  			}
   870  			rw.WriteHeader(StatusOK)
   871  		case "/200":
   872  			// Go 1.5 adds Connection: close header if the client expect
   873  			// continue but not entire request body is consumed.
   874  			rw.WriteHeader(StatusOK)
   875  		case "/500":
   876  			rw.WriteHeader(StatusInternalServerError)
   877  		case "/keepalive":
   878  			// This hijacked endpoint responds error without Connection:close.
   879  			_, bufrw, err := rw.(Hijacker).Hijack()
   880  			if err != nil {
   881  				log.Fatal(err)
   882  			}
   883  			bufrw.WriteString("HTTP/1.1 500 Internal Server Error\r\n")
   884  			bufrw.WriteString("Content-Length: 0\r\n\r\n")
   885  			bufrw.Flush()
   886  		case "/timeout":
   887  			// This endpoint tries to read body without 100 (Continue) response.
   888  			// After ExpectContinueTimeout, the reading will be started.
   889  			conn, bufrw, err := rw.(Hijacker).Hijack()
   890  			if err != nil {
   891  				log.Fatal(err)
   892  			}
   893  			if _, err := io.CopyN(ioutil.Discard, bufrw, req.ContentLength); err != nil {
   894  				t.Error("Failed to read Body", err)
   895  			}
   896  			bufrw.WriteString("HTTP/1.1 200 OK\r\n\r\n")
   897  			bufrw.Flush()
   898  			conn.Close()
   899  		}
   900  
   901  	}))
   902  	defer ts.Close()
   903  
   904  	tests := []struct {
   905  		path   string
   906  		body   []byte
   907  		sent   int
   908  		status int
   909  	}{
   910  		{path: "/100", body: []byte("hello"), sent: 5, status: 200},       // Got 100 followed by 200, entire body is sent.
   911  		{path: "/200", body: []byte("hello"), sent: 0, status: 200},       // Got 200 without 100. body isn't sent.
   912  		{path: "/500", body: []byte("hello"), sent: 0, status: 500},       // Got 500 without 100. body isn't sent.
   913  		{path: "/keepalive", body: []byte("hello"), sent: 0, status: 500}, // Although without Connection:close, body isn't sent.
   914  		{path: "/timeout", body: []byte("hello"), sent: 5, status: 200},   // Timeout exceeded and entire body is sent.
   915  	}
   916  
   917  	for i, v := range tests {
   918  		tr := &Transport{ExpectContinueTimeout: 2 * time.Second}
   919  		defer tr.CloseIdleConnections()
   920  		c := &Client{Transport: tr}
   921  
   922  		body := bytes.NewReader(v.body)
   923  		req, err := NewRequest("PUT", ts.URL+v.path, body)
   924  		if err != nil {
   925  			t.Fatal(err)
   926  		}
   927  		req.Header.Set("Expect", "100-continue")
   928  		req.ContentLength = int64(len(v.body))
   929  
   930  		resp, err := c.Do(req)
   931  		if err != nil {
   932  			t.Fatal(err)
   933  		}
   934  		resp.Body.Close()
   935  
   936  		sent := len(v.body) - body.Len()
   937  		if v.status != resp.StatusCode {
   938  			t.Errorf("test %d: status code should be %d but got %d. (%s)", i, v.status, resp.StatusCode, v.path)
   939  		}
   940  		if v.sent != sent {
   941  			t.Errorf("test %d: sent body should be %d but sent %d. (%s)", i, v.sent, sent, v.path)
   942  		}
   943  	}
   944  }
   945  
   946  func TestTransportProxy(t *testing.T) {
   947  	defer afterTest(t)
   948  	ch := make(chan string, 1)
   949  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   950  		ch <- "real server"
   951  	}))
   952  	defer ts.Close()
   953  	proxy := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   954  		ch <- "proxy for " + r.URL.String()
   955  	}))
   956  	defer proxy.Close()
   957  
   958  	pu, err := url.Parse(proxy.URL)
   959  	if err != nil {
   960  		t.Fatal(err)
   961  	}
   962  	c := &Client{Transport: &Transport{Proxy: ProxyURL(pu)}}
   963  	c.Head(ts.URL)
   964  	got := <-ch
   965  	want := "proxy for " + ts.URL + "/"
   966  	if got != want {
   967  		t.Errorf("want %q, got %q", want, got)
   968  	}
   969  }
   970  
   971  // Issue 16997: test transport dial preserves typed errors
   972  func TestTransportDialPreservesNetOpProxyError(t *testing.T) {
   973  	defer afterTest(t)
   974  
   975  	var errDial = errors.New("some dial error")
   976  
   977  	tr := &Transport{
   978  		Proxy: func(*Request) (*url.URL, error) {
   979  			return url.Parse("http://proxy.fake.tld/")
   980  		},
   981  		Dial: func(string, string) (net.Conn, error) {
   982  			return nil, errDial
   983  		},
   984  	}
   985  	defer tr.CloseIdleConnections()
   986  
   987  	c := &Client{Transport: tr}
   988  	req, _ := NewRequest("GET", "http://fake.tld", nil)
   989  	res, err := c.Do(req)
   990  	if err == nil {
   991  		res.Body.Close()
   992  		t.Fatal("wanted a non-nil error")
   993  	}
   994  
   995  	uerr, ok := err.(*url.Error)
   996  	if !ok {
   997  		t.Fatalf("got %T, want *url.Error", err)
   998  	}
   999  	oe, ok := uerr.Err.(*net.OpError)
  1000  	if !ok {
  1001  		t.Fatalf("url.Error.Err =  %T; want *net.OpError", uerr.Err)
  1002  	}
  1003  	want := &net.OpError{
  1004  		Op:  "proxyconnect",
  1005  		Net: "tcp",
  1006  		Err: errDial, // original error, unwrapped.
  1007  	}
  1008  	if !reflect.DeepEqual(oe, want) {
  1009  		t.Errorf("Got error %#v; want %#v", oe, want)
  1010  	}
  1011  }
  1012  
  1013  // TestTransportGzipRecursive sends a gzip quine and checks that the
  1014  // client gets the same value back. This is more cute than anything,
  1015  // but checks that we don't recurse forever, and checks that
  1016  // Content-Encoding is removed.
  1017  func TestTransportGzipRecursive(t *testing.T) {
  1018  	defer afterTest(t)
  1019  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1020  		w.Header().Set("Content-Encoding", "gzip")
  1021  		w.Write(rgz)
  1022  	}))
  1023  	defer ts.Close()
  1024  
  1025  	tr := &Transport{}
  1026  	defer tr.CloseIdleConnections()
  1027  	c := &Client{Transport: tr}
  1028  	res, err := c.Get(ts.URL)
  1029  	if err != nil {
  1030  		t.Fatal(err)
  1031  	}
  1032  	body, err := ioutil.ReadAll(res.Body)
  1033  	if err != nil {
  1034  		t.Fatal(err)
  1035  	}
  1036  	if !bytes.Equal(body, rgz) {
  1037  		t.Fatalf("Incorrect result from recursive gz:\nhave=%x\nwant=%x",
  1038  			body, rgz)
  1039  	}
  1040  	if g, e := res.Header.Get("Content-Encoding"), ""; g != e {
  1041  		t.Fatalf("Content-Encoding = %q; want %q", g, e)
  1042  	}
  1043  }
  1044  
  1045  // golang.org/issue/7750: request fails when server replies with
  1046  // a short gzip body
  1047  func TestTransportGzipShort(t *testing.T) {
  1048  	defer afterTest(t)
  1049  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1050  		w.Header().Set("Content-Encoding", "gzip")
  1051  		w.Write([]byte{0x1f, 0x8b})
  1052  	}))
  1053  	defer ts.Close()
  1054  
  1055  	tr := &Transport{}
  1056  	defer tr.CloseIdleConnections()
  1057  	c := &Client{Transport: tr}
  1058  	res, err := c.Get(ts.URL)
  1059  	if err != nil {
  1060  		t.Fatal(err)
  1061  	}
  1062  	defer res.Body.Close()
  1063  	_, err = ioutil.ReadAll(res.Body)
  1064  	if err == nil {
  1065  		t.Fatal("Expect an error from reading a body.")
  1066  	}
  1067  	if err != io.ErrUnexpectedEOF {
  1068  		t.Errorf("ReadAll error = %v; want io.ErrUnexpectedEOF", err)
  1069  	}
  1070  }
  1071  
  1072  // Wait until number of goroutines is no greater than nmax, or time out.
  1073  func waitNumGoroutine(nmax int) int {
  1074  	nfinal := runtime.NumGoroutine()
  1075  	for ntries := 10; ntries > 0 && nfinal > nmax; ntries-- {
  1076  		time.Sleep(50 * time.Millisecond)
  1077  		runtime.GC()
  1078  		nfinal = runtime.NumGoroutine()
  1079  	}
  1080  	return nfinal
  1081  }
  1082  
  1083  // tests that persistent goroutine connections shut down when no longer desired.
  1084  func TestTransportPersistConnLeak(t *testing.T) {
  1085  	// Not parallel: counts goroutines
  1086  	defer afterTest(t)
  1087  
  1088  	const numReq = 25
  1089  	gotReqCh := make(chan bool, numReq)
  1090  	unblockCh := make(chan bool, numReq)
  1091  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1092  		gotReqCh <- true
  1093  		<-unblockCh
  1094  		w.Header().Set("Content-Length", "0")
  1095  		w.WriteHeader(204)
  1096  	}))
  1097  	defer ts.Close()
  1098  
  1099  	tr := &Transport{}
  1100  	c := &Client{Transport: tr}
  1101  
  1102  	n0 := runtime.NumGoroutine()
  1103  
  1104  	didReqCh := make(chan bool, numReq)
  1105  	failed := make(chan bool, numReq)
  1106  	for i := 0; i < numReq; i++ {
  1107  		go func() {
  1108  			res, err := c.Get(ts.URL)
  1109  			didReqCh <- true
  1110  			if err != nil {
  1111  				t.Errorf("client fetch error: %v", err)
  1112  				failed <- true
  1113  				return
  1114  			}
  1115  			res.Body.Close()
  1116  		}()
  1117  	}
  1118  
  1119  	// Wait for all goroutines to be stuck in the Handler.
  1120  	for i := 0; i < numReq; i++ {
  1121  		select {
  1122  		case <-gotReqCh:
  1123  			// ok
  1124  		case <-failed:
  1125  			close(unblockCh)
  1126  			return
  1127  		}
  1128  	}
  1129  
  1130  	nhigh := runtime.NumGoroutine()
  1131  
  1132  	// Tell all handlers to unblock and reply.
  1133  	for i := 0; i < numReq; i++ {
  1134  		unblockCh <- true
  1135  	}
  1136  
  1137  	// Wait for all HTTP clients to be done.
  1138  	for i := 0; i < numReq; i++ {
  1139  		<-didReqCh
  1140  	}
  1141  
  1142  	tr.CloseIdleConnections()
  1143  	nfinal := waitNumGoroutine(n0 + 5)
  1144  
  1145  	growth := nfinal - n0
  1146  
  1147  	// We expect 0 or 1 extra goroutine, empirically. Allow up to 5.
  1148  	// Previously we were leaking one per numReq.
  1149  	if int(growth) > 5 {
  1150  		t.Logf("goroutine growth: %d -> %d -> %d (delta: %d)", n0, nhigh, nfinal, growth)
  1151  		t.Error("too many new goroutines")
  1152  	}
  1153  }
  1154  
  1155  // golang.org/issue/4531: Transport leaks goroutines when
  1156  // request.ContentLength is explicitly short
  1157  func TestTransportPersistConnLeakShortBody(t *testing.T) {
  1158  	// Not parallel: measures goroutines.
  1159  	defer afterTest(t)
  1160  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1161  	}))
  1162  	defer ts.Close()
  1163  
  1164  	tr := &Transport{}
  1165  	c := &Client{Transport: tr}
  1166  
  1167  	n0 := runtime.NumGoroutine()
  1168  	body := []byte("Hello")
  1169  	for i := 0; i < 20; i++ {
  1170  		req, err := NewRequest("POST", ts.URL, bytes.NewReader(body))
  1171  		if err != nil {
  1172  			t.Fatal(err)
  1173  		}
  1174  		req.ContentLength = int64(len(body) - 2) // explicitly short
  1175  		_, err = c.Do(req)
  1176  		if err == nil {
  1177  			t.Fatal("Expect an error from writing too long of a body.")
  1178  		}
  1179  	}
  1180  	nhigh := runtime.NumGoroutine()
  1181  	tr.CloseIdleConnections()
  1182  	nfinal := waitNumGoroutine(n0 + 5)
  1183  
  1184  	growth := nfinal - n0
  1185  
  1186  	// We expect 0 or 1 extra goroutine, empirically. Allow up to 5.
  1187  	// Previously we were leaking one per numReq.
  1188  	t.Logf("goroutine growth: %d -> %d -> %d (delta: %d)", n0, nhigh, nfinal, growth)
  1189  	if int(growth) > 5 {
  1190  		t.Error("too many new goroutines")
  1191  	}
  1192  }
  1193  
  1194  // This used to crash; https://golang.org/issue/3266
  1195  func TestTransportIdleConnCrash(t *testing.T) {
  1196  	defer afterTest(t)
  1197  	tr := &Transport{}
  1198  	c := &Client{Transport: tr}
  1199  
  1200  	unblockCh := make(chan bool, 1)
  1201  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1202  		<-unblockCh
  1203  		tr.CloseIdleConnections()
  1204  	}))
  1205  	defer ts.Close()
  1206  
  1207  	didreq := make(chan bool)
  1208  	go func() {
  1209  		res, err := c.Get(ts.URL)
  1210  		if err != nil {
  1211  			t.Error(err)
  1212  		} else {
  1213  			res.Body.Close() // returns idle conn
  1214  		}
  1215  		didreq <- true
  1216  	}()
  1217  	unblockCh <- true
  1218  	<-didreq
  1219  }
  1220  
  1221  // Test that the transport doesn't close the TCP connection early,
  1222  // before the response body has been read. This was a regression
  1223  // which sadly lacked a triggering test. The large response body made
  1224  // the old race easier to trigger.
  1225  func TestIssue3644(t *testing.T) {
  1226  	defer afterTest(t)
  1227  	const numFoos = 5000
  1228  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1229  		w.Header().Set("Connection", "close")
  1230  		for i := 0; i < numFoos; i++ {
  1231  			w.Write([]byte("foo "))
  1232  		}
  1233  	}))
  1234  	defer ts.Close()
  1235  	tr := &Transport{}
  1236  	c := &Client{Transport: tr}
  1237  	res, err := c.Get(ts.URL)
  1238  	if err != nil {
  1239  		t.Fatal(err)
  1240  	}
  1241  	defer res.Body.Close()
  1242  	bs, err := ioutil.ReadAll(res.Body)
  1243  	if err != nil {
  1244  		t.Fatal(err)
  1245  	}
  1246  	if len(bs) != numFoos*len("foo ") {
  1247  		t.Errorf("unexpected response length")
  1248  	}
  1249  }
  1250  
  1251  // Test that a client receives a server's reply, even if the server doesn't read
  1252  // the entire request body.
  1253  func TestIssue3595(t *testing.T) {
  1254  	setParallel(t)
  1255  	defer afterTest(t)
  1256  	const deniedMsg = "sorry, denied."
  1257  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1258  		Error(w, deniedMsg, StatusUnauthorized)
  1259  	}))
  1260  	defer ts.Close()
  1261  	tr := &Transport{}
  1262  	c := &Client{Transport: tr}
  1263  	res, err := c.Post(ts.URL, "application/octet-stream", neverEnding('a'))
  1264  	if err != nil {
  1265  		t.Errorf("Post: %v", err)
  1266  		return
  1267  	}
  1268  	got, err := ioutil.ReadAll(res.Body)
  1269  	if err != nil {
  1270  		t.Fatalf("Body ReadAll: %v", err)
  1271  	}
  1272  	if !strings.Contains(string(got), deniedMsg) {
  1273  		t.Errorf("Known bug: response %q does not contain %q", got, deniedMsg)
  1274  	}
  1275  }
  1276  
  1277  // From https://golang.org/issue/4454 ,
  1278  // "client fails to handle requests with no body and chunked encoding"
  1279  func TestChunkedNoContent(t *testing.T) {
  1280  	defer afterTest(t)
  1281  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1282  		w.WriteHeader(StatusNoContent)
  1283  	}))
  1284  	defer ts.Close()
  1285  
  1286  	for _, closeBody := range []bool{true, false} {
  1287  		c := &Client{Transport: &Transport{}}
  1288  		const n = 4
  1289  		for i := 1; i <= n; i++ {
  1290  			res, err := c.Get(ts.URL)
  1291  			if err != nil {
  1292  				t.Errorf("closingBody=%v, req %d/%d: %v", closeBody, i, n, err)
  1293  			} else {
  1294  				if closeBody {
  1295  					res.Body.Close()
  1296  				}
  1297  			}
  1298  		}
  1299  	}
  1300  }
  1301  
  1302  func TestTransportConcurrency(t *testing.T) {
  1303  	// Not parallel: uses global test hooks.
  1304  	defer afterTest(t)
  1305  	maxProcs, numReqs := 16, 500
  1306  	if testing.Short() {
  1307  		maxProcs, numReqs = 4, 50
  1308  	}
  1309  	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(maxProcs))
  1310  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1311  		fmt.Fprintf(w, "%v", r.FormValue("echo"))
  1312  	}))
  1313  	defer ts.Close()
  1314  
  1315  	var wg sync.WaitGroup
  1316  	wg.Add(numReqs)
  1317  
  1318  	// Due to the Transport's "socket late binding" (see
  1319  	// idleConnCh in transport.go), the numReqs HTTP requests
  1320  	// below can finish with a dial still outstanding. To keep
  1321  	// the leak checker happy, keep track of pending dials and
  1322  	// wait for them to finish (and be closed or returned to the
  1323  	// idle pool) before we close idle connections.
  1324  	SetPendingDialHooks(func() { wg.Add(1) }, wg.Done)
  1325  	defer SetPendingDialHooks(nil, nil)
  1326  
  1327  	tr := &Transport{}
  1328  	defer tr.CloseIdleConnections()
  1329  
  1330  	c := &Client{Transport: tr}
  1331  	reqs := make(chan string)
  1332  	defer close(reqs)
  1333  
  1334  	for i := 0; i < maxProcs*2; i++ {
  1335  		go func() {
  1336  			for req := range reqs {
  1337  				res, err := c.Get(ts.URL + "/?echo=" + req)
  1338  				if err != nil {
  1339  					t.Errorf("error on req %s: %v", req, err)
  1340  					wg.Done()
  1341  					continue
  1342  				}
  1343  				all, err := ioutil.ReadAll(res.Body)
  1344  				if err != nil {
  1345  					t.Errorf("read error on req %s: %v", req, err)
  1346  					wg.Done()
  1347  					continue
  1348  				}
  1349  				if string(all) != req {
  1350  					t.Errorf("body of req %s = %q; want %q", req, all, req)
  1351  				}
  1352  				res.Body.Close()
  1353  				wg.Done()
  1354  			}
  1355  		}()
  1356  	}
  1357  	for i := 0; i < numReqs; i++ {
  1358  		reqs <- fmt.Sprintf("request-%d", i)
  1359  	}
  1360  	wg.Wait()
  1361  }
  1362  
  1363  func TestIssue4191_InfiniteGetTimeout(t *testing.T) {
  1364  	setParallel(t)
  1365  	defer afterTest(t)
  1366  	const debug = false
  1367  	mux := NewServeMux()
  1368  	mux.HandleFunc("/get", func(w ResponseWriter, r *Request) {
  1369  		io.Copy(w, neverEnding('a'))
  1370  	})
  1371  	ts := httptest.NewServer(mux)
  1372  	timeout := 100 * time.Millisecond
  1373  
  1374  	client := &Client{
  1375  		Transport: &Transport{
  1376  			Dial: func(n, addr string) (net.Conn, error) {
  1377  				conn, err := net.Dial(n, addr)
  1378  				if err != nil {
  1379  					return nil, err
  1380  				}
  1381  				conn.SetDeadline(time.Now().Add(timeout))
  1382  				if debug {
  1383  					conn = NewLoggingConn("client", conn)
  1384  				}
  1385  				return conn, nil
  1386  			},
  1387  			DisableKeepAlives: true,
  1388  		},
  1389  	}
  1390  
  1391  	getFailed := false
  1392  	nRuns := 5
  1393  	if testing.Short() {
  1394  		nRuns = 1
  1395  	}
  1396  	for i := 0; i < nRuns; i++ {
  1397  		if debug {
  1398  			println("run", i+1, "of", nRuns)
  1399  		}
  1400  		sres, err := client.Get(ts.URL + "/get")
  1401  		if err != nil {
  1402  			if !getFailed {
  1403  				// Make the timeout longer, once.
  1404  				getFailed = true
  1405  				t.Logf("increasing timeout")
  1406  				i--
  1407  				timeout *= 10
  1408  				continue
  1409  			}
  1410  			t.Errorf("Error issuing GET: %v", err)
  1411  			break
  1412  		}
  1413  		_, err = io.Copy(ioutil.Discard, sres.Body)
  1414  		if err == nil {
  1415  			t.Errorf("Unexpected successful copy")
  1416  			break
  1417  		}
  1418  	}
  1419  	if debug {
  1420  		println("tests complete; waiting for handlers to finish")
  1421  	}
  1422  	ts.Close()
  1423  }
  1424  
  1425  func TestIssue4191_InfiniteGetToPutTimeout(t *testing.T) {
  1426  	setParallel(t)
  1427  	defer afterTest(t)
  1428  	const debug = false
  1429  	mux := NewServeMux()
  1430  	mux.HandleFunc("/get", func(w ResponseWriter, r *Request) {
  1431  		io.Copy(w, neverEnding('a'))
  1432  	})
  1433  	mux.HandleFunc("/put", func(w ResponseWriter, r *Request) {
  1434  		defer r.Body.Close()
  1435  		io.Copy(ioutil.Discard, r.Body)
  1436  	})
  1437  	ts := httptest.NewServer(mux)
  1438  	timeout := 100 * time.Millisecond
  1439  
  1440  	client := &Client{
  1441  		Transport: &Transport{
  1442  			Dial: func(n, addr string) (net.Conn, error) {
  1443  				conn, err := net.Dial(n, addr)
  1444  				if err != nil {
  1445  					return nil, err
  1446  				}
  1447  				conn.SetDeadline(time.Now().Add(timeout))
  1448  				if debug {
  1449  					conn = NewLoggingConn("client", conn)
  1450  				}
  1451  				return conn, nil
  1452  			},
  1453  			DisableKeepAlives: true,
  1454  		},
  1455  	}
  1456  
  1457  	getFailed := false
  1458  	nRuns := 5
  1459  	if testing.Short() {
  1460  		nRuns = 1
  1461  	}
  1462  	for i := 0; i < nRuns; i++ {
  1463  		if debug {
  1464  			println("run", i+1, "of", nRuns)
  1465  		}
  1466  		sres, err := client.Get(ts.URL + "/get")
  1467  		if err != nil {
  1468  			if !getFailed {
  1469  				// Make the timeout longer, once.
  1470  				getFailed = true
  1471  				t.Logf("increasing timeout")
  1472  				i--
  1473  				timeout *= 10
  1474  				continue
  1475  			}
  1476  			t.Errorf("Error issuing GET: %v", err)
  1477  			break
  1478  		}
  1479  		req, _ := NewRequest("PUT", ts.URL+"/put", sres.Body)
  1480  		_, err = client.Do(req)
  1481  		if err == nil {
  1482  			sres.Body.Close()
  1483  			t.Errorf("Unexpected successful PUT")
  1484  			break
  1485  		}
  1486  		sres.Body.Close()
  1487  	}
  1488  	if debug {
  1489  		println("tests complete; waiting for handlers to finish")
  1490  	}
  1491  	ts.Close()
  1492  }
  1493  
  1494  func TestTransportResponseHeaderTimeout(t *testing.T) {
  1495  	setParallel(t)
  1496  	defer afterTest(t)
  1497  	if testing.Short() {
  1498  		t.Skip("skipping timeout test in -short mode")
  1499  	}
  1500  	inHandler := make(chan bool, 1)
  1501  	mux := NewServeMux()
  1502  	mux.HandleFunc("/fast", func(w ResponseWriter, r *Request) {
  1503  		inHandler <- true
  1504  	})
  1505  	mux.HandleFunc("/slow", func(w ResponseWriter, r *Request) {
  1506  		inHandler <- true
  1507  		time.Sleep(2 * time.Second)
  1508  	})
  1509  	ts := httptest.NewServer(mux)
  1510  	defer ts.Close()
  1511  
  1512  	tr := &Transport{
  1513  		ResponseHeaderTimeout: 500 * time.Millisecond,
  1514  	}
  1515  	defer tr.CloseIdleConnections()
  1516  	c := &Client{Transport: tr}
  1517  
  1518  	tests := []struct {
  1519  		path    string
  1520  		want    int
  1521  		wantErr string
  1522  	}{
  1523  		{path: "/fast", want: 200},
  1524  		{path: "/slow", wantErr: "timeout awaiting response headers"},
  1525  		{path: "/fast", want: 200},
  1526  	}
  1527  	for i, tt := range tests {
  1528  		res, err := c.Get(ts.URL + tt.path)
  1529  		select {
  1530  		case <-inHandler:
  1531  		case <-time.After(5 * time.Second):
  1532  			t.Errorf("never entered handler for test index %d, %s", i, tt.path)
  1533  			continue
  1534  		}
  1535  		if err != nil {
  1536  			uerr, ok := err.(*url.Error)
  1537  			if !ok {
  1538  				t.Errorf("error is not an url.Error; got: %#v", err)
  1539  				continue
  1540  			}
  1541  			nerr, ok := uerr.Err.(net.Error)
  1542  			if !ok {
  1543  				t.Errorf("error does not satisfy net.Error interface; got: %#v", err)
  1544  				continue
  1545  			}
  1546  			if !nerr.Timeout() {
  1547  				t.Errorf("want timeout error; got: %q", nerr)
  1548  				continue
  1549  			}
  1550  			if strings.Contains(err.Error(), tt.wantErr) {
  1551  				continue
  1552  			}
  1553  			t.Errorf("%d. unexpected error: %v", i, err)
  1554  			continue
  1555  		}
  1556  		if tt.wantErr != "" {
  1557  			t.Errorf("%d. no error. expected error: %v", i, tt.wantErr)
  1558  			continue
  1559  		}
  1560  		if res.StatusCode != tt.want {
  1561  			t.Errorf("%d for path %q status = %d; want %d", i, tt.path, res.StatusCode, tt.want)
  1562  		}
  1563  	}
  1564  }
  1565  
  1566  func TestTransportCancelRequest(t *testing.T) {
  1567  	setParallel(t)
  1568  	defer afterTest(t)
  1569  	if testing.Short() {
  1570  		t.Skip("skipping test in -short mode")
  1571  	}
  1572  	unblockc := make(chan bool)
  1573  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1574  		fmt.Fprintf(w, "Hello")
  1575  		w.(Flusher).Flush() // send headers and some body
  1576  		<-unblockc
  1577  	}))
  1578  	defer ts.Close()
  1579  	defer close(unblockc)
  1580  
  1581  	tr := &Transport{}
  1582  	defer tr.CloseIdleConnections()
  1583  	c := &Client{Transport: tr}
  1584  
  1585  	req, _ := NewRequest("GET", ts.URL, nil)
  1586  	res, err := c.Do(req)
  1587  	if err != nil {
  1588  		t.Fatal(err)
  1589  	}
  1590  	go func() {
  1591  		time.Sleep(1 * time.Second)
  1592  		tr.CancelRequest(req)
  1593  	}()
  1594  	t0 := time.Now()
  1595  	body, err := ioutil.ReadAll(res.Body)
  1596  	d := time.Since(t0)
  1597  
  1598  	if err != ExportErrRequestCanceled {
  1599  		t.Errorf("Body.Read error = %v; want errRequestCanceled", err)
  1600  	}
  1601  	if string(body) != "Hello" {
  1602  		t.Errorf("Body = %q; want Hello", body)
  1603  	}
  1604  	if d < 500*time.Millisecond {
  1605  		t.Errorf("expected ~1 second delay; got %v", d)
  1606  	}
  1607  	// Verify no outstanding requests after readLoop/writeLoop
  1608  	// goroutines shut down.
  1609  	for tries := 5; tries > 0; tries-- {
  1610  		n := tr.NumPendingRequestsForTesting()
  1611  		if n == 0 {
  1612  			break
  1613  		}
  1614  		time.Sleep(100 * time.Millisecond)
  1615  		if tries == 1 {
  1616  			t.Errorf("pending requests = %d; want 0", n)
  1617  		}
  1618  	}
  1619  }
  1620  
  1621  func TestTransportCancelRequestInDial(t *testing.T) {
  1622  	defer afterTest(t)
  1623  	if testing.Short() {
  1624  		t.Skip("skipping test in -short mode")
  1625  	}
  1626  	var logbuf bytes.Buffer
  1627  	eventLog := log.New(&logbuf, "", 0)
  1628  
  1629  	unblockDial := make(chan bool)
  1630  	defer close(unblockDial)
  1631  
  1632  	inDial := make(chan bool)
  1633  	tr := &Transport{
  1634  		Dial: func(network, addr string) (net.Conn, error) {
  1635  			eventLog.Println("dial: blocking")
  1636  			inDial <- true
  1637  			<-unblockDial
  1638  			return nil, errors.New("nope")
  1639  		},
  1640  	}
  1641  	cl := &Client{Transport: tr}
  1642  	gotres := make(chan bool)
  1643  	req, _ := NewRequest("GET", "http://something.no-network.tld/", nil)
  1644  	go func() {
  1645  		_, err := cl.Do(req)
  1646  		eventLog.Printf("Get = %v", err)
  1647  		gotres <- true
  1648  	}()
  1649  
  1650  	select {
  1651  	case <-inDial:
  1652  	case <-time.After(5 * time.Second):
  1653  		t.Fatal("timeout; never saw blocking dial")
  1654  	}
  1655  
  1656  	eventLog.Printf("canceling")
  1657  	tr.CancelRequest(req)
  1658  	tr.CancelRequest(req) // used to panic on second call
  1659  
  1660  	select {
  1661  	case <-gotres:
  1662  	case <-time.After(5 * time.Second):
  1663  		panic("hang. events are: " + logbuf.String())
  1664  	}
  1665  
  1666  	got := logbuf.String()
  1667  	want := `dial: blocking
  1668  canceling
  1669  Get = Get http://something.no-network.tld/: net/http: request canceled while waiting for connection
  1670  `
  1671  	if got != want {
  1672  		t.Errorf("Got events:\n%s\nWant:\n%s", got, want)
  1673  	}
  1674  }
  1675  
  1676  func TestCancelRequestWithChannel(t *testing.T) {
  1677  	setParallel(t)
  1678  	defer afterTest(t)
  1679  	if testing.Short() {
  1680  		t.Skip("skipping test in -short mode")
  1681  	}
  1682  	unblockc := make(chan bool)
  1683  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1684  		fmt.Fprintf(w, "Hello")
  1685  		w.(Flusher).Flush() // send headers and some body
  1686  		<-unblockc
  1687  	}))
  1688  	defer ts.Close()
  1689  	defer close(unblockc)
  1690  
  1691  	tr := &Transport{}
  1692  	defer tr.CloseIdleConnections()
  1693  	c := &Client{Transport: tr}
  1694  
  1695  	req, _ := NewRequest("GET", ts.URL, nil)
  1696  	ch := make(chan struct{})
  1697  	req.Cancel = ch
  1698  
  1699  	res, err := c.Do(req)
  1700  	if err != nil {
  1701  		t.Fatal(err)
  1702  	}
  1703  	go func() {
  1704  		time.Sleep(1 * time.Second)
  1705  		close(ch)
  1706  	}()
  1707  	t0 := time.Now()
  1708  	body, err := ioutil.ReadAll(res.Body)
  1709  	d := time.Since(t0)
  1710  
  1711  	if err != ExportErrRequestCanceled {
  1712  		t.Errorf("Body.Read error = %v; want errRequestCanceled", err)
  1713  	}
  1714  	if string(body) != "Hello" {
  1715  		t.Errorf("Body = %q; want Hello", body)
  1716  	}
  1717  	if d < 500*time.Millisecond {
  1718  		t.Errorf("expected ~1 second delay; got %v", d)
  1719  	}
  1720  	// Verify no outstanding requests after readLoop/writeLoop
  1721  	// goroutines shut down.
  1722  	for tries := 5; tries > 0; tries-- {
  1723  		n := tr.NumPendingRequestsForTesting()
  1724  		if n == 0 {
  1725  			break
  1726  		}
  1727  		time.Sleep(100 * time.Millisecond)
  1728  		if tries == 1 {
  1729  			t.Errorf("pending requests = %d; want 0", n)
  1730  		}
  1731  	}
  1732  }
  1733  
  1734  func TestCancelRequestWithChannelBeforeDo_Cancel(t *testing.T) {
  1735  	testCancelRequestWithChannelBeforeDo(t, false)
  1736  }
  1737  func TestCancelRequestWithChannelBeforeDo_Context(t *testing.T) {
  1738  	testCancelRequestWithChannelBeforeDo(t, true)
  1739  }
  1740  func testCancelRequestWithChannelBeforeDo(t *testing.T, withCtx bool) {
  1741  	setParallel(t)
  1742  	defer afterTest(t)
  1743  	unblockc := make(chan bool)
  1744  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1745  		<-unblockc
  1746  	}))
  1747  	defer ts.Close()
  1748  	defer close(unblockc)
  1749  
  1750  	tr := &Transport{}
  1751  	defer tr.CloseIdleConnections()
  1752  	c := &Client{Transport: tr}
  1753  
  1754  	req, _ := NewRequest("GET", ts.URL, nil)
  1755  	if withCtx {
  1756  		ctx, cancel := context.WithCancel(context.Background())
  1757  		cancel()
  1758  		req = req.WithContext(ctx)
  1759  	} else {
  1760  		ch := make(chan struct{})
  1761  		req.Cancel = ch
  1762  		close(ch)
  1763  	}
  1764  
  1765  	_, err := c.Do(req)
  1766  	if ue, ok := err.(*url.Error); ok {
  1767  		err = ue.Err
  1768  	}
  1769  	if withCtx {
  1770  		if err != context.Canceled {
  1771  			t.Errorf("Do error = %v; want %v", err, context.Canceled)
  1772  		}
  1773  	} else {
  1774  		if err == nil || !strings.Contains(err.Error(), "canceled") {
  1775  			t.Errorf("Do error = %v; want cancelation", err)
  1776  		}
  1777  	}
  1778  }
  1779  
  1780  // Issue 11020. The returned error message should be errRequestCanceled
  1781  func TestTransportCancelBeforeResponseHeaders(t *testing.T) {
  1782  	defer afterTest(t)
  1783  
  1784  	serverConnCh := make(chan net.Conn, 1)
  1785  	tr := &Transport{
  1786  		Dial: func(network, addr string) (net.Conn, error) {
  1787  			cc, sc := net.Pipe()
  1788  			serverConnCh <- sc
  1789  			return cc, nil
  1790  		},
  1791  	}
  1792  	defer tr.CloseIdleConnections()
  1793  	errc := make(chan error, 1)
  1794  	req, _ := NewRequest("GET", "http://example.com/", nil)
  1795  	go func() {
  1796  		_, err := tr.RoundTrip(req)
  1797  		errc <- err
  1798  	}()
  1799  
  1800  	sc := <-serverConnCh
  1801  	verb := make([]byte, 3)
  1802  	if _, err := io.ReadFull(sc, verb); err != nil {
  1803  		t.Errorf("Error reading HTTP verb from server: %v", err)
  1804  	}
  1805  	if string(verb) != "GET" {
  1806  		t.Errorf("server received %q; want GET", verb)
  1807  	}
  1808  	defer sc.Close()
  1809  
  1810  	tr.CancelRequest(req)
  1811  
  1812  	err := <-errc
  1813  	if err == nil {
  1814  		t.Fatalf("unexpected success from RoundTrip")
  1815  	}
  1816  	if err != ExportErrRequestCanceled {
  1817  		t.Errorf("RoundTrip error = %v; want ExportErrRequestCanceled", err)
  1818  	}
  1819  }
  1820  
  1821  // golang.org/issue/3672 -- Client can't close HTTP stream
  1822  // Calling Close on a Response.Body used to just read until EOF.
  1823  // Now it actually closes the TCP connection.
  1824  func TestTransportCloseResponseBody(t *testing.T) {
  1825  	defer afterTest(t)
  1826  	writeErr := make(chan error, 1)
  1827  	msg := []byte("young\n")
  1828  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  1829  		for {
  1830  			_, err := w.Write(msg)
  1831  			if err != nil {
  1832  				writeErr <- err
  1833  				return
  1834  			}
  1835  			w.(Flusher).Flush()
  1836  		}
  1837  	}))
  1838  	defer ts.Close()
  1839  
  1840  	tr := &Transport{}
  1841  	defer tr.CloseIdleConnections()
  1842  	c := &Client{Transport: tr}
  1843  
  1844  	req, _ := NewRequest("GET", ts.URL, nil)
  1845  	defer tr.CancelRequest(req)
  1846  
  1847  	res, err := c.Do(req)
  1848  	if err != nil {
  1849  		t.Fatal(err)
  1850  	}
  1851  
  1852  	const repeats = 3
  1853  	buf := make([]byte, len(msg)*repeats)
  1854  	want := bytes.Repeat(msg, repeats)
  1855  
  1856  	_, err = io.ReadFull(res.Body, buf)
  1857  	if err != nil {
  1858  		t.Fatal(err)
  1859  	}
  1860  	if !bytes.Equal(buf, want) {
  1861  		t.Fatalf("read %q; want %q", buf, want)
  1862  	}
  1863  	didClose := make(chan error, 1)
  1864  	go func() {
  1865  		didClose <- res.Body.Close()
  1866  	}()
  1867  	select {
  1868  	case err := <-didClose:
  1869  		if err != nil {
  1870  			t.Errorf("Close = %v", err)
  1871  		}
  1872  	case <-time.After(10 * time.Second):
  1873  		t.Fatal("too long waiting for close")
  1874  	}
  1875  	select {
  1876  	case err := <-writeErr:
  1877  		if err == nil {
  1878  			t.Errorf("expected non-nil write error")
  1879  		}
  1880  	case <-time.After(10 * time.Second):
  1881  		t.Fatal("too long waiting for write error")
  1882  	}
  1883  }
  1884  
  1885  type fooProto struct{}
  1886  
  1887  func (fooProto) RoundTrip(req *Request) (*Response, error) {
  1888  	res := &Response{
  1889  		Status:     "200 OK",
  1890  		StatusCode: 200,
  1891  		Header:     make(Header),
  1892  		Body:       ioutil.NopCloser(strings.NewReader("You wanted " + req.URL.String())),
  1893  	}
  1894  	return res, nil
  1895  }
  1896  
  1897  func TestTransportAltProto(t *testing.T) {
  1898  	defer afterTest(t)
  1899  	tr := &Transport{}
  1900  	c := &Client{Transport: tr}
  1901  	tr.RegisterProtocol("foo", fooProto{})
  1902  	res, err := c.Get("foo://bar.com/path")
  1903  	if err != nil {
  1904  		t.Fatal(err)
  1905  	}
  1906  	bodyb, err := ioutil.ReadAll(res.Body)
  1907  	if err != nil {
  1908  		t.Fatal(err)
  1909  	}
  1910  	body := string(bodyb)
  1911  	if e := "You wanted foo://bar.com/path"; body != e {
  1912  		t.Errorf("got response %q, want %q", body, e)
  1913  	}
  1914  }
  1915  
  1916  func TestTransportNoHost(t *testing.T) {
  1917  	defer afterTest(t)
  1918  	tr := &Transport{}
  1919  	_, err := tr.RoundTrip(&Request{
  1920  		Header: make(Header),
  1921  		URL: &url.URL{
  1922  			Scheme: "http",
  1923  		},
  1924  	})
  1925  	want := "http: no Host in request URL"
  1926  	if got := fmt.Sprint(err); got != want {
  1927  		t.Errorf("error = %v; want %q", err, want)
  1928  	}
  1929  }
  1930  
  1931  // Issue 13311
  1932  func TestTransportEmptyMethod(t *testing.T) {
  1933  	req, _ := NewRequest("GET", "http://foo.com/", nil)
  1934  	req.Method = ""                                 // docs say "For client requests an empty string means GET"
  1935  	got, err := httputil.DumpRequestOut(req, false) // DumpRequestOut uses Transport
  1936  	if err != nil {
  1937  		t.Fatal(err)
  1938  	}
  1939  	if !strings.Contains(string(got), "GET ") {
  1940  		t.Fatalf("expected substring 'GET '; got: %s", got)
  1941  	}
  1942  }
  1943  
  1944  func TestTransportSocketLateBinding(t *testing.T) {
  1945  	setParallel(t)
  1946  	defer afterTest(t)
  1947  
  1948  	mux := NewServeMux()
  1949  	fooGate := make(chan bool, 1)
  1950  	mux.HandleFunc("/foo", func(w ResponseWriter, r *Request) {
  1951  		w.Header().Set("foo-ipport", r.RemoteAddr)
  1952  		w.(Flusher).Flush()
  1953  		<-fooGate
  1954  	})
  1955  	mux.HandleFunc("/bar", func(w ResponseWriter, r *Request) {
  1956  		w.Header().Set("bar-ipport", r.RemoteAddr)
  1957  	})
  1958  	ts := httptest.NewServer(mux)
  1959  	defer ts.Close()
  1960  
  1961  	dialGate := make(chan bool, 1)
  1962  	tr := &Transport{
  1963  		Dial: func(n, addr string) (net.Conn, error) {
  1964  			if <-dialGate {
  1965  				return net.Dial(n, addr)
  1966  			}
  1967  			return nil, errors.New("manually closed")
  1968  		},
  1969  		DisableKeepAlives: false,
  1970  	}
  1971  	defer tr.CloseIdleConnections()
  1972  	c := &Client{
  1973  		Transport: tr,
  1974  	}
  1975  
  1976  	dialGate <- true // only allow one dial
  1977  	fooRes, err := c.Get(ts.URL + "/foo")
  1978  	if err != nil {
  1979  		t.Fatal(err)
  1980  	}
  1981  	fooAddr := fooRes.Header.Get("foo-ipport")
  1982  	if fooAddr == "" {
  1983  		t.Fatal("No addr on /foo request")
  1984  	}
  1985  	time.AfterFunc(200*time.Millisecond, func() {
  1986  		// let the foo response finish so we can use its
  1987  		// connection for /bar
  1988  		fooGate <- true
  1989  		io.Copy(ioutil.Discard, fooRes.Body)
  1990  		fooRes.Body.Close()
  1991  	})
  1992  
  1993  	barRes, err := c.Get(ts.URL + "/bar")
  1994  	if err != nil {
  1995  		t.Fatal(err)
  1996  	}
  1997  	barAddr := barRes.Header.Get("bar-ipport")
  1998  	if barAddr != fooAddr {
  1999  		t.Fatalf("/foo came from conn %q; /bar came from %q instead", fooAddr, barAddr)
  2000  	}
  2001  	barRes.Body.Close()
  2002  	dialGate <- false
  2003  }
  2004  
  2005  // Issue 2184
  2006  func TestTransportReading100Continue(t *testing.T) {
  2007  	defer afterTest(t)
  2008  
  2009  	const numReqs = 5
  2010  	reqBody := func(n int) string { return fmt.Sprintf("request body %d", n) }
  2011  	reqID := func(n int) string { return fmt.Sprintf("REQ-ID-%d", n) }
  2012  
  2013  	send100Response := func(w *io.PipeWriter, r *io.PipeReader) {
  2014  		defer w.Close()
  2015  		defer r.Close()
  2016  		br := bufio.NewReader(r)
  2017  		n := 0
  2018  		for {
  2019  			n++
  2020  			req, err := ReadRequest(br)
  2021  			if err == io.EOF {
  2022  				return
  2023  			}
  2024  			if err != nil {
  2025  				t.Error(err)
  2026  				return
  2027  			}
  2028  			slurp, err := ioutil.ReadAll(req.Body)
  2029  			if err != nil {
  2030  				t.Errorf("Server request body slurp: %v", err)
  2031  				return
  2032  			}
  2033  			id := req.Header.Get("Request-Id")
  2034  			resCode := req.Header.Get("X-Want-Response-Code")
  2035  			if resCode == "" {
  2036  				resCode = "100 Continue"
  2037  				if string(slurp) != reqBody(n) {
  2038  					t.Errorf("Server got %q, %v; want %q", slurp, err, reqBody(n))
  2039  				}
  2040  			}
  2041  			body := fmt.Sprintf("Response number %d", n)
  2042  			v := []byte(strings.Replace(fmt.Sprintf(`HTTP/1.1 %s
  2043  Date: Thu, 28 Feb 2013 17:55:41 GMT
  2044  
  2045  HTTP/1.1 200 OK
  2046  Content-Type: text/html
  2047  Echo-Request-Id: %s
  2048  Content-Length: %d
  2049  
  2050  %s`, resCode, id, len(body), body), "\n", "\r\n", -1))
  2051  			w.Write(v)
  2052  			if id == reqID(numReqs) {
  2053  				return
  2054  			}
  2055  		}
  2056  
  2057  	}
  2058  
  2059  	tr := &Transport{
  2060  		Dial: func(n, addr string) (net.Conn, error) {
  2061  			sr, sw := io.Pipe() // server read/write
  2062  			cr, cw := io.Pipe() // client read/write
  2063  			conn := &rwTestConn{
  2064  				Reader: cr,
  2065  				Writer: sw,
  2066  				closeFunc: func() error {
  2067  					sw.Close()
  2068  					cw.Close()
  2069  					return nil
  2070  				},
  2071  			}
  2072  			go send100Response(cw, sr)
  2073  			return conn, nil
  2074  		},
  2075  		DisableKeepAlives: false,
  2076  	}
  2077  	defer tr.CloseIdleConnections()
  2078  	c := &Client{Transport: tr}
  2079  
  2080  	testResponse := func(req *Request, name string, wantCode int) {
  2081  		res, err := c.Do(req)
  2082  		if err != nil {
  2083  			t.Fatalf("%s: Do: %v", name, err)
  2084  		}
  2085  		if res.StatusCode != wantCode {
  2086  			t.Fatalf("%s: Response Statuscode=%d; want %d", name, res.StatusCode, wantCode)
  2087  		}
  2088  		if id, idBack := req.Header.Get("Request-Id"), res.Header.Get("Echo-Request-Id"); id != "" && id != idBack {
  2089  			t.Errorf("%s: response id %q != request id %q", name, idBack, id)
  2090  		}
  2091  		_, err = ioutil.ReadAll(res.Body)
  2092  		if err != nil {
  2093  			t.Fatalf("%s: Slurp error: %v", name, err)
  2094  		}
  2095  	}
  2096  
  2097  	// Few 100 responses, making sure we're not off-by-one.
  2098  	for i := 1; i <= numReqs; i++ {
  2099  		req, _ := NewRequest("POST", "http://dummy.tld/", strings.NewReader(reqBody(i)))
  2100  		req.Header.Set("Request-Id", reqID(i))
  2101  		testResponse(req, fmt.Sprintf("100, %d/%d", i, numReqs), 200)
  2102  	}
  2103  
  2104  	// And some other informational 1xx but non-100 responses, to test
  2105  	// we return them but don't re-use the connection.
  2106  	for i := 1; i <= numReqs; i++ {
  2107  		req, _ := NewRequest("POST", "http://other.tld/", strings.NewReader(reqBody(i)))
  2108  		req.Header.Set("X-Want-Response-Code", "123 Sesame Street")
  2109  		testResponse(req, fmt.Sprintf("123, %d/%d", i, numReqs), 123)
  2110  	}
  2111  }
  2112  
  2113  type proxyFromEnvTest struct {
  2114  	req string // URL to fetch; blank means "http://example.com"
  2115  
  2116  	env      string // HTTP_PROXY
  2117  	httpsenv string // HTTPS_PROXY
  2118  	noenv    string // NO_PROXY
  2119  	reqmeth  string // REQUEST_METHOD
  2120  
  2121  	want    string
  2122  	wanterr error
  2123  }
  2124  
  2125  func (t proxyFromEnvTest) String() string {
  2126  	var buf bytes.Buffer
  2127  	space := func() {
  2128  		if buf.Len() > 0 {
  2129  			buf.WriteByte(' ')
  2130  		}
  2131  	}
  2132  	if t.env != "" {
  2133  		fmt.Fprintf(&buf, "http_proxy=%q", t.env)
  2134  	}
  2135  	if t.httpsenv != "" {
  2136  		space()
  2137  		fmt.Fprintf(&buf, "https_proxy=%q", t.httpsenv)
  2138  	}
  2139  	if t.noenv != "" {
  2140  		space()
  2141  		fmt.Fprintf(&buf, "no_proxy=%q", t.noenv)
  2142  	}
  2143  	if t.reqmeth != "" {
  2144  		space()
  2145  		fmt.Fprintf(&buf, "request_method=%q", t.reqmeth)
  2146  	}
  2147  	req := "http://example.com"
  2148  	if t.req != "" {
  2149  		req = t.req
  2150  	}
  2151  	space()
  2152  	fmt.Fprintf(&buf, "req=%q", req)
  2153  	return strings.TrimSpace(buf.String())
  2154  }
  2155  
  2156  var proxyFromEnvTests = []proxyFromEnvTest{
  2157  	{env: "127.0.0.1:8080", want: "http://127.0.0.1:8080"},
  2158  	{env: "cache.corp.example.com:1234", want: "http://cache.corp.example.com:1234"},
  2159  	{env: "cache.corp.example.com", want: "http://cache.corp.example.com"},
  2160  	{env: "https://cache.corp.example.com", want: "https://cache.corp.example.com"},
  2161  	{env: "http://127.0.0.1:8080", want: "http://127.0.0.1:8080"},
  2162  	{env: "https://127.0.0.1:8080", want: "https://127.0.0.1:8080"},
  2163  
  2164  	// Don't use secure for http
  2165  	{req: "http://insecure.tld/", env: "http.proxy.tld", httpsenv: "secure.proxy.tld", want: "http://http.proxy.tld"},
  2166  	// Use secure for https.
  2167  	{req: "https://secure.tld/", env: "http.proxy.tld", httpsenv: "secure.proxy.tld", want: "http://secure.proxy.tld"},
  2168  	{req: "https://secure.tld/", env: "http.proxy.tld", httpsenv: "https://secure.proxy.tld", want: "https://secure.proxy.tld"},
  2169  
  2170  	// Issue 16405: don't use HTTP_PROXY in a CGI environment,
  2171  	// where HTTP_PROXY can be attacker-controlled.
  2172  	{env: "http://10.1.2.3:8080", reqmeth: "POST",
  2173  		want:    "<nil>",
  2174  		wanterr: errors.New("net/http: refusing to use HTTP_PROXY value in CGI environment; see golang.org/s/cgihttpproxy")},
  2175  
  2176  	{want: "<nil>"},
  2177  
  2178  	{noenv: "example.com", req: "http://example.com/", env: "proxy", want: "<nil>"},
  2179  	{noenv: ".example.com", req: "http://example.com/", env: "proxy", want: "<nil>"},
  2180  	{noenv: "ample.com", req: "http://example.com/", env: "proxy", want: "http://proxy"},
  2181  	{noenv: "example.com", req: "http://foo.example.com/", env: "proxy", want: "<nil>"},
  2182  	{noenv: ".foo.com", req: "http://example.com/", env: "proxy", want: "http://proxy"},
  2183  }
  2184  
  2185  func TestProxyFromEnvironment(t *testing.T) {
  2186  	ResetProxyEnv()
  2187  	for _, tt := range proxyFromEnvTests {
  2188  		os.Setenv("HTTP_PROXY", tt.env)
  2189  		os.Setenv("HTTPS_PROXY", tt.httpsenv)
  2190  		os.Setenv("NO_PROXY", tt.noenv)
  2191  		os.Setenv("REQUEST_METHOD", tt.reqmeth)
  2192  		ResetCachedEnvironment()
  2193  		reqURL := tt.req
  2194  		if reqURL == "" {
  2195  			reqURL = "http://example.com"
  2196  		}
  2197  		req, _ := NewRequest("GET", reqURL, nil)
  2198  		url, err := ProxyFromEnvironment(req)
  2199  		if g, e := fmt.Sprintf("%v", err), fmt.Sprintf("%v", tt.wanterr); g != e {
  2200  			t.Errorf("%v: got error = %q, want %q", tt, g, e)
  2201  			continue
  2202  		}
  2203  		if got := fmt.Sprintf("%s", url); got != tt.want {
  2204  			t.Errorf("%v: got URL = %q, want %q", tt, url, tt.want)
  2205  		}
  2206  	}
  2207  }
  2208  
  2209  func TestIdleConnChannelLeak(t *testing.T) {
  2210  	// Not parallel: uses global test hooks.
  2211  	var mu sync.Mutex
  2212  	var n int
  2213  
  2214  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2215  		mu.Lock()
  2216  		n++
  2217  		mu.Unlock()
  2218  	}))
  2219  	defer ts.Close()
  2220  
  2221  	const nReqs = 5
  2222  	didRead := make(chan bool, nReqs)
  2223  	SetReadLoopBeforeNextReadHook(func() { didRead <- true })
  2224  	defer SetReadLoopBeforeNextReadHook(nil)
  2225  
  2226  	tr := &Transport{
  2227  		Dial: func(netw, addr string) (net.Conn, error) {
  2228  			return net.Dial(netw, ts.Listener.Addr().String())
  2229  		},
  2230  	}
  2231  	defer tr.CloseIdleConnections()
  2232  
  2233  	c := &Client{Transport: tr}
  2234  
  2235  	// First, without keep-alives.
  2236  	for _, disableKeep := range []bool{true, false} {
  2237  		tr.DisableKeepAlives = disableKeep
  2238  		for i := 0; i < nReqs; i++ {
  2239  			_, err := c.Get(fmt.Sprintf("http://foo-host-%d.tld/", i))
  2240  			if err != nil {
  2241  				t.Fatal(err)
  2242  			}
  2243  			// Note: no res.Body.Close is needed here, since the
  2244  			// response Content-Length is zero. Perhaps the test
  2245  			// should be more explicit and use a HEAD, but tests
  2246  			// elsewhere guarantee that zero byte responses generate
  2247  			// a "Content-Length: 0" instead of chunking.
  2248  		}
  2249  
  2250  		// At this point, each of the 5 Transport.readLoop goroutines
  2251  		// are scheduling noting that there are no response bodies (see
  2252  		// earlier comment), and are then calling putIdleConn, which
  2253  		// decrements this count. Usually that happens quickly, which is
  2254  		// why this test has seemed to work for ages. But it's still
  2255  		// racey: we have wait for them to finish first. See Issue 10427
  2256  		for i := 0; i < nReqs; i++ {
  2257  			<-didRead
  2258  		}
  2259  
  2260  		if got := tr.IdleConnChMapSizeForTesting(); got != 0 {
  2261  			t.Fatalf("ForDisableKeepAlives = %v, map size = %d; want 0", disableKeep, got)
  2262  		}
  2263  	}
  2264  }
  2265  
  2266  // Verify the status quo: that the Client.Post function coerces its
  2267  // body into a ReadCloser if it's a Closer, and that the Transport
  2268  // then closes it.
  2269  func TestTransportClosesRequestBody(t *testing.T) {
  2270  	defer afterTest(t)
  2271  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2272  		io.Copy(ioutil.Discard, r.Body)
  2273  	}))
  2274  	defer ts.Close()
  2275  
  2276  	tr := &Transport{}
  2277  	defer tr.CloseIdleConnections()
  2278  	cl := &Client{Transport: tr}
  2279  
  2280  	closes := 0
  2281  
  2282  	res, err := cl.Post(ts.URL, "text/plain", countCloseReader{&closes, strings.NewReader("hello")})
  2283  	if err != nil {
  2284  		t.Fatal(err)
  2285  	}
  2286  	res.Body.Close()
  2287  	if closes != 1 {
  2288  		t.Errorf("closes = %d; want 1", closes)
  2289  	}
  2290  }
  2291  
  2292  func TestTransportTLSHandshakeTimeout(t *testing.T) {
  2293  	defer afterTest(t)
  2294  	if testing.Short() {
  2295  		t.Skip("skipping in short mode")
  2296  	}
  2297  	ln := newLocalListener(t)
  2298  	defer ln.Close()
  2299  	testdonec := make(chan struct{})
  2300  	defer close(testdonec)
  2301  
  2302  	go func() {
  2303  		c, err := ln.Accept()
  2304  		if err != nil {
  2305  			t.Error(err)
  2306  			return
  2307  		}
  2308  		<-testdonec
  2309  		c.Close()
  2310  	}()
  2311  
  2312  	getdonec := make(chan struct{})
  2313  	go func() {
  2314  		defer close(getdonec)
  2315  		tr := &Transport{
  2316  			Dial: func(_, _ string) (net.Conn, error) {
  2317  				return net.Dial("tcp", ln.Addr().String())
  2318  			},
  2319  			TLSHandshakeTimeout: 250 * time.Millisecond,
  2320  		}
  2321  		cl := &Client{Transport: tr}
  2322  		_, err := cl.Get("https://dummy.tld/")
  2323  		if err == nil {
  2324  			t.Error("expected error")
  2325  			return
  2326  		}
  2327  		ue, ok := err.(*url.Error)
  2328  		if !ok {
  2329  			t.Errorf("expected url.Error; got %#v", err)
  2330  			return
  2331  		}
  2332  		ne, ok := ue.Err.(net.Error)
  2333  		if !ok {
  2334  			t.Errorf("expected net.Error; got %#v", err)
  2335  			return
  2336  		}
  2337  		if !ne.Timeout() {
  2338  			t.Errorf("expected timeout error; got %v", err)
  2339  		}
  2340  		if !strings.Contains(err.Error(), "handshake timeout") {
  2341  			t.Errorf("expected 'handshake timeout' in error; got %v", err)
  2342  		}
  2343  	}()
  2344  	select {
  2345  	case <-getdonec:
  2346  	case <-time.After(5 * time.Second):
  2347  		t.Error("test timeout; TLS handshake hung?")
  2348  	}
  2349  }
  2350  
  2351  // Trying to repro golang.org/issue/3514
  2352  func TestTLSServerClosesConnection(t *testing.T) {
  2353  	defer afterTest(t)
  2354  	testenv.SkipFlaky(t, 7634)
  2355  
  2356  	closedc := make(chan bool, 1)
  2357  	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2358  		if strings.Contains(r.URL.Path, "/keep-alive-then-die") {
  2359  			conn, _, _ := w.(Hijacker).Hijack()
  2360  			conn.Write([]byte("HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nfoo"))
  2361  			conn.Close()
  2362  			closedc <- true
  2363  			return
  2364  		}
  2365  		fmt.Fprintf(w, "hello")
  2366  	}))
  2367  	defer ts.Close()
  2368  	tr := &Transport{
  2369  		TLSClientConfig: &tls.Config{
  2370  			InsecureSkipVerify: true,
  2371  		},
  2372  	}
  2373  	defer tr.CloseIdleConnections()
  2374  	client := &Client{Transport: tr}
  2375  
  2376  	var nSuccess = 0
  2377  	var errs []error
  2378  	const trials = 20
  2379  	for i := 0; i < trials; i++ {
  2380  		tr.CloseIdleConnections()
  2381  		res, err := client.Get(ts.URL + "/keep-alive-then-die")
  2382  		if err != nil {
  2383  			t.Fatal(err)
  2384  		}
  2385  		<-closedc
  2386  		slurp, err := ioutil.ReadAll(res.Body)
  2387  		if err != nil {
  2388  			t.Fatal(err)
  2389  		}
  2390  		if string(slurp) != "foo" {
  2391  			t.Errorf("Got %q, want foo", slurp)
  2392  		}
  2393  
  2394  		// Now try again and see if we successfully
  2395  		// pick a new connection.
  2396  		res, err = client.Get(ts.URL + "/")
  2397  		if err != nil {
  2398  			errs = append(errs, err)
  2399  			continue
  2400  		}
  2401  		slurp, err = ioutil.ReadAll(res.Body)
  2402  		if err != nil {
  2403  			errs = append(errs, err)
  2404  			continue
  2405  		}
  2406  		nSuccess++
  2407  	}
  2408  	if nSuccess > 0 {
  2409  		t.Logf("successes = %d of %d", nSuccess, trials)
  2410  	} else {
  2411  		t.Errorf("All runs failed:")
  2412  	}
  2413  	for _, err := range errs {
  2414  		t.Logf("  err: %v", err)
  2415  	}
  2416  }
  2417  
  2418  // byteFromChanReader is an io.Reader that reads a single byte at a
  2419  // time from the channel. When the channel is closed, the reader
  2420  // returns io.EOF.
  2421  type byteFromChanReader chan byte
  2422  
  2423  func (c byteFromChanReader) Read(p []byte) (n int, err error) {
  2424  	if len(p) == 0 {
  2425  		return
  2426  	}
  2427  	b, ok := <-c
  2428  	if !ok {
  2429  		return 0, io.EOF
  2430  	}
  2431  	p[0] = b
  2432  	return 1, nil
  2433  }
  2434  
  2435  // Verifies that the Transport doesn't reuse a connection in the case
  2436  // where the server replies before the request has been fully
  2437  // written. We still honor that reply (see TestIssue3595), but don't
  2438  // send future requests on the connection because it's then in a
  2439  // questionable state.
  2440  // golang.org/issue/7569
  2441  func TestTransportNoReuseAfterEarlyResponse(t *testing.T) {
  2442  	setParallel(t)
  2443  	defer afterTest(t)
  2444  	var sconn struct {
  2445  		sync.Mutex
  2446  		c net.Conn
  2447  	}
  2448  	var getOkay bool
  2449  	closeConn := func() {
  2450  		sconn.Lock()
  2451  		defer sconn.Unlock()
  2452  		if sconn.c != nil {
  2453  			sconn.c.Close()
  2454  			sconn.c = nil
  2455  			if !getOkay {
  2456  				t.Logf("Closed server connection")
  2457  			}
  2458  		}
  2459  	}
  2460  	defer closeConn()
  2461  
  2462  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2463  		if r.Method == "GET" {
  2464  			io.WriteString(w, "bar")
  2465  			return
  2466  		}
  2467  		conn, _, _ := w.(Hijacker).Hijack()
  2468  		sconn.Lock()
  2469  		sconn.c = conn
  2470  		sconn.Unlock()
  2471  		conn.Write([]byte("HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nfoo")) // keep-alive
  2472  		go io.Copy(ioutil.Discard, conn)
  2473  	}))
  2474  	defer ts.Close()
  2475  	tr := &Transport{}
  2476  	defer tr.CloseIdleConnections()
  2477  	client := &Client{Transport: tr}
  2478  
  2479  	const bodySize = 256 << 10
  2480  	finalBit := make(byteFromChanReader, 1)
  2481  	req, _ := NewRequest("POST", ts.URL, io.MultiReader(io.LimitReader(neverEnding('x'), bodySize-1), finalBit))
  2482  	req.ContentLength = bodySize
  2483  	res, err := client.Do(req)
  2484  	if err := wantBody(res, err, "foo"); err != nil {
  2485  		t.Errorf("POST response: %v", err)
  2486  	}
  2487  	donec := make(chan bool)
  2488  	go func() {
  2489  		defer close(donec)
  2490  		res, err = client.Get(ts.URL)
  2491  		if err := wantBody(res, err, "bar"); err != nil {
  2492  			t.Errorf("GET response: %v", err)
  2493  			return
  2494  		}
  2495  		getOkay = true // suppress test noise
  2496  	}()
  2497  	time.AfterFunc(5*time.Second, closeConn)
  2498  	select {
  2499  	case <-donec:
  2500  		finalBit <- 'x' // unblock the writeloop of the first Post
  2501  		close(finalBit)
  2502  	case <-time.After(7 * time.Second):
  2503  		t.Fatal("timeout waiting for GET request to finish")
  2504  	}
  2505  }
  2506  
  2507  // Tests that we don't leak Transport persistConn.readLoop goroutines
  2508  // when a server hangs up immediately after saying it would keep-alive.
  2509  func TestTransportIssue10457(t *testing.T) {
  2510  	defer afterTest(t) // used to fail in goroutine leak check
  2511  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2512  		// Send a response with no body, keep-alive
  2513  		// (implicit), and then lie and immediately close the
  2514  		// connection. This forces the Transport's readLoop to
  2515  		// immediately Peek an io.EOF and get to the point
  2516  		// that used to hang.
  2517  		conn, _, _ := w.(Hijacker).Hijack()
  2518  		conn.Write([]byte("HTTP/1.1 200 OK\r\nFoo: Bar\r\nContent-Length: 0\r\n\r\n")) // keep-alive
  2519  		conn.Close()
  2520  	}))
  2521  	defer ts.Close()
  2522  	tr := &Transport{}
  2523  	defer tr.CloseIdleConnections()
  2524  	cl := &Client{Transport: tr}
  2525  	res, err := cl.Get(ts.URL)
  2526  	if err != nil {
  2527  		t.Fatalf("Get: %v", err)
  2528  	}
  2529  	defer res.Body.Close()
  2530  
  2531  	// Just a sanity check that we at least get the response. The real
  2532  	// test here is that the "defer afterTest" above doesn't find any
  2533  	// leaked goroutines.
  2534  	if got, want := res.Header.Get("Foo"), "Bar"; got != want {
  2535  		t.Errorf("Foo header = %q; want %q", got, want)
  2536  	}
  2537  }
  2538  
  2539  type errorReader struct {
  2540  	err error
  2541  }
  2542  
  2543  func (e errorReader) Read(p []byte) (int, error) { return 0, e.err }
  2544  
  2545  type closerFunc func() error
  2546  
  2547  func (f closerFunc) Close() error { return f() }
  2548  
  2549  type writerFuncConn struct {
  2550  	net.Conn
  2551  	write func(p []byte) (n int, err error)
  2552  }
  2553  
  2554  func (c writerFuncConn) Write(p []byte) (n int, err error) { return c.write(p) }
  2555  
  2556  // Issue 4677. If we try to reuse a connection that the server is in the
  2557  // process of closing, we may end up successfully writing out our request (or a
  2558  // portion of our request) only to find a connection error when we try to read
  2559  // from (or finish writing to) the socket.
  2560  //
  2561  // NOTE: we resend a request only if the request is idempotent, we reused a
  2562  // keep-alive connection, and we haven't yet received any header data. This
  2563  // automatically prevents an infinite resend loop because we'll run out of the
  2564  // cached keep-alive connections eventually.
  2565  func TestRetryIdempotentRequestsOnError(t *testing.T) {
  2566  	defer afterTest(t)
  2567  
  2568  	var (
  2569  		mu     sync.Mutex
  2570  		logbuf bytes.Buffer
  2571  	)
  2572  	logf := func(format string, args ...interface{}) {
  2573  		mu.Lock()
  2574  		defer mu.Unlock()
  2575  		fmt.Fprintf(&logbuf, format, args...)
  2576  		logbuf.WriteByte('\n')
  2577  	}
  2578  
  2579  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2580  		logf("Handler")
  2581  		w.Header().Set("X-Status", "ok")
  2582  	}))
  2583  	defer ts.Close()
  2584  
  2585  	var writeNumAtomic int32
  2586  	tr := &Transport{
  2587  		Dial: func(network, addr string) (net.Conn, error) {
  2588  			logf("Dial")
  2589  			c, err := net.Dial(network, ts.Listener.Addr().String())
  2590  			if err != nil {
  2591  				logf("Dial error: %v", err)
  2592  				return nil, err
  2593  			}
  2594  			return &writerFuncConn{
  2595  				Conn: c,
  2596  				write: func(p []byte) (n int, err error) {
  2597  					if atomic.AddInt32(&writeNumAtomic, 1) == 2 {
  2598  						logf("intentional write failure")
  2599  						return 0, errors.New("second write fails")
  2600  					}
  2601  					logf("Write(%q)", p)
  2602  					return c.Write(p)
  2603  				},
  2604  			}, nil
  2605  		},
  2606  	}
  2607  	defer tr.CloseIdleConnections()
  2608  	c := &Client{Transport: tr}
  2609  
  2610  	SetRoundTripRetried(func() {
  2611  		logf("Retried.")
  2612  	})
  2613  	defer SetRoundTripRetried(nil)
  2614  
  2615  	for i := 0; i < 3; i++ {
  2616  		res, err := c.Get("http://fake.golang/")
  2617  		if err != nil {
  2618  			t.Fatalf("i=%d: Get = %v", i, err)
  2619  		}
  2620  		res.Body.Close()
  2621  	}
  2622  
  2623  	mu.Lock()
  2624  	got := logbuf.String()
  2625  	mu.Unlock()
  2626  	const want = `Dial
  2627  Write("GET / HTTP/1.1\r\nHost: fake.golang\r\nUser-Agent: Go-http-client/1.1\r\nAccept-Encoding: gzip\r\n\r\n")
  2628  Handler
  2629  intentional write failure
  2630  Retried.
  2631  Dial
  2632  Write("GET / HTTP/1.1\r\nHost: fake.golang\r\nUser-Agent: Go-http-client/1.1\r\nAccept-Encoding: gzip\r\n\r\n")
  2633  Handler
  2634  Write("GET / HTTP/1.1\r\nHost: fake.golang\r\nUser-Agent: Go-http-client/1.1\r\nAccept-Encoding: gzip\r\n\r\n")
  2635  Handler
  2636  `
  2637  	if got != want {
  2638  		t.Errorf("Log of events differs. Got:\n%s\nWant:\n%s", got, want)
  2639  	}
  2640  }
  2641  
  2642  // Issue 6981
  2643  func TestTransportClosesBodyOnError(t *testing.T) {
  2644  	setParallel(t)
  2645  	defer afterTest(t)
  2646  	readBody := make(chan error, 1)
  2647  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2648  		_, err := ioutil.ReadAll(r.Body)
  2649  		readBody <- err
  2650  	}))
  2651  	defer ts.Close()
  2652  	fakeErr := errors.New("fake error")
  2653  	didClose := make(chan bool, 1)
  2654  	req, _ := NewRequest("POST", ts.URL, struct {
  2655  		io.Reader
  2656  		io.Closer
  2657  	}{
  2658  		io.MultiReader(io.LimitReader(neverEnding('x'), 1<<20), errorReader{fakeErr}),
  2659  		closerFunc(func() error {
  2660  			select {
  2661  			case didClose <- true:
  2662  			default:
  2663  			}
  2664  			return nil
  2665  		}),
  2666  	})
  2667  	res, err := DefaultClient.Do(req)
  2668  	if res != nil {
  2669  		defer res.Body.Close()
  2670  	}
  2671  	if err == nil || !strings.Contains(err.Error(), fakeErr.Error()) {
  2672  		t.Fatalf("Do error = %v; want something containing %q", err, fakeErr.Error())
  2673  	}
  2674  	select {
  2675  	case err := <-readBody:
  2676  		if err == nil {
  2677  			t.Errorf("Unexpected success reading request body from handler; want 'unexpected EOF reading trailer'")
  2678  		}
  2679  	case <-time.After(5 * time.Second):
  2680  		t.Error("timeout waiting for server handler to complete")
  2681  	}
  2682  	select {
  2683  	case <-didClose:
  2684  	default:
  2685  		t.Errorf("didn't see Body.Close")
  2686  	}
  2687  }
  2688  
  2689  func TestTransportDialTLS(t *testing.T) {
  2690  	setParallel(t)
  2691  	defer afterTest(t)
  2692  	var mu sync.Mutex // guards following
  2693  	var gotReq, didDial bool
  2694  
  2695  	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2696  		mu.Lock()
  2697  		gotReq = true
  2698  		mu.Unlock()
  2699  	}))
  2700  	defer ts.Close()
  2701  	tr := &Transport{
  2702  		DialTLS: func(netw, addr string) (net.Conn, error) {
  2703  			mu.Lock()
  2704  			didDial = true
  2705  			mu.Unlock()
  2706  			c, err := tls.Dial(netw, addr, &tls.Config{
  2707  				InsecureSkipVerify: true,
  2708  			})
  2709  			if err != nil {
  2710  				return nil, err
  2711  			}
  2712  			return c, c.Handshake()
  2713  		},
  2714  	}
  2715  	defer tr.CloseIdleConnections()
  2716  	client := &Client{Transport: tr}
  2717  	res, err := client.Get(ts.URL)
  2718  	if err != nil {
  2719  		t.Fatal(err)
  2720  	}
  2721  	res.Body.Close()
  2722  	mu.Lock()
  2723  	if !gotReq {
  2724  		t.Error("didn't get request")
  2725  	}
  2726  	if !didDial {
  2727  		t.Error("didn't use dial hook")
  2728  	}
  2729  }
  2730  
  2731  // Test for issue 8755
  2732  // Ensure that if a proxy returns an error, it is exposed by RoundTrip
  2733  func TestRoundTripReturnsProxyError(t *testing.T) {
  2734  	badProxy := func(*Request) (*url.URL, error) {
  2735  		return nil, errors.New("errorMessage")
  2736  	}
  2737  
  2738  	tr := &Transport{Proxy: badProxy}
  2739  
  2740  	req, _ := NewRequest("GET", "http://example.com", nil)
  2741  
  2742  	_, err := tr.RoundTrip(req)
  2743  
  2744  	if err == nil {
  2745  		t.Error("Expected proxy error to be returned by RoundTrip")
  2746  	}
  2747  }
  2748  
  2749  // tests that putting an idle conn after a call to CloseIdleConns does return it
  2750  func TestTransportCloseIdleConnsThenReturn(t *testing.T) {
  2751  	tr := &Transport{}
  2752  	wantIdle := func(when string, n int) bool {
  2753  		got := tr.IdleConnCountForTesting("|http|example.com") // key used by PutIdleTestConn
  2754  		if got == n {
  2755  			return true
  2756  		}
  2757  		t.Errorf("%s: idle conns = %d; want %d", when, got, n)
  2758  		return false
  2759  	}
  2760  	wantIdle("start", 0)
  2761  	if !tr.PutIdleTestConn() {
  2762  		t.Fatal("put failed")
  2763  	}
  2764  	if !tr.PutIdleTestConn() {
  2765  		t.Fatal("second put failed")
  2766  	}
  2767  	wantIdle("after put", 2)
  2768  	tr.CloseIdleConnections()
  2769  	if !tr.IsIdleForTesting() {
  2770  		t.Error("should be idle after CloseIdleConnections")
  2771  	}
  2772  	wantIdle("after close idle", 0)
  2773  	if tr.PutIdleTestConn() {
  2774  		t.Fatal("put didn't fail")
  2775  	}
  2776  	wantIdle("after second put", 0)
  2777  
  2778  	tr.RequestIdleConnChForTesting() // should toggle the transport out of idle mode
  2779  	if tr.IsIdleForTesting() {
  2780  		t.Error("shouldn't be idle after RequestIdleConnChForTesting")
  2781  	}
  2782  	if !tr.PutIdleTestConn() {
  2783  		t.Fatal("after re-activation")
  2784  	}
  2785  	wantIdle("after final put", 1)
  2786  }
  2787  
  2788  // This tests that an client requesting a content range won't also
  2789  // implicitly ask for gzip support. If they want that, they need to do it
  2790  // on their own.
  2791  // golang.org/issue/8923
  2792  func TestTransportRangeAndGzip(t *testing.T) {
  2793  	defer afterTest(t)
  2794  	reqc := make(chan *Request, 1)
  2795  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2796  		reqc <- r
  2797  	}))
  2798  	defer ts.Close()
  2799  
  2800  	req, _ := NewRequest("GET", ts.URL, nil)
  2801  	req.Header.Set("Range", "bytes=7-11")
  2802  	res, err := DefaultClient.Do(req)
  2803  	if err != nil {
  2804  		t.Fatal(err)
  2805  	}
  2806  
  2807  	select {
  2808  	case r := <-reqc:
  2809  		if strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
  2810  			t.Error("Transport advertised gzip support in the Accept header")
  2811  		}
  2812  		if r.Header.Get("Range") == "" {
  2813  			t.Error("no Range in request")
  2814  		}
  2815  	case <-time.After(10 * time.Second):
  2816  		t.Fatal("timeout")
  2817  	}
  2818  	res.Body.Close()
  2819  }
  2820  
  2821  // Test for issue 10474
  2822  func TestTransportResponseCancelRace(t *testing.T) {
  2823  	defer afterTest(t)
  2824  
  2825  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2826  		// important that this response has a body.
  2827  		var b [1024]byte
  2828  		w.Write(b[:])
  2829  	}))
  2830  	defer ts.Close()
  2831  
  2832  	tr := &Transport{}
  2833  	defer tr.CloseIdleConnections()
  2834  
  2835  	req, err := NewRequest("GET", ts.URL, nil)
  2836  	if err != nil {
  2837  		t.Fatal(err)
  2838  	}
  2839  	res, err := tr.RoundTrip(req)
  2840  	if err != nil {
  2841  		t.Fatal(err)
  2842  	}
  2843  	// If we do an early close, Transport just throws the connection away and
  2844  	// doesn't reuse it. In order to trigger the bug, it has to reuse the connection
  2845  	// so read the body
  2846  	if _, err := io.Copy(ioutil.Discard, res.Body); err != nil {
  2847  		t.Fatal(err)
  2848  	}
  2849  
  2850  	req2, err := NewRequest("GET", ts.URL, nil)
  2851  	if err != nil {
  2852  		t.Fatal(err)
  2853  	}
  2854  	tr.CancelRequest(req)
  2855  	res, err = tr.RoundTrip(req2)
  2856  	if err != nil {
  2857  		t.Fatal(err)
  2858  	}
  2859  	res.Body.Close()
  2860  }
  2861  
  2862  func TestTransportDialCancelRace(t *testing.T) {
  2863  	defer afterTest(t)
  2864  
  2865  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
  2866  	defer ts.Close()
  2867  
  2868  	tr := &Transport{}
  2869  	defer tr.CloseIdleConnections()
  2870  
  2871  	req, err := NewRequest("GET", ts.URL, nil)
  2872  	if err != nil {
  2873  		t.Fatal(err)
  2874  	}
  2875  	SetEnterRoundTripHook(func() {
  2876  		tr.CancelRequest(req)
  2877  	})
  2878  	defer SetEnterRoundTripHook(nil)
  2879  	res, err := tr.RoundTrip(req)
  2880  	if err != ExportErrRequestCanceled {
  2881  		t.Errorf("expected canceled request error; got %v", err)
  2882  		if err == nil {
  2883  			res.Body.Close()
  2884  		}
  2885  	}
  2886  }
  2887  
  2888  // logWritesConn is a net.Conn that logs each Write call to writes
  2889  // and then proxies to w.
  2890  // It proxies Read calls to a reader it receives from rch.
  2891  type logWritesConn struct {
  2892  	net.Conn // nil. crash on use.
  2893  
  2894  	w io.Writer
  2895  
  2896  	rch <-chan io.Reader
  2897  	r   io.Reader // nil until received by rch
  2898  
  2899  	mu     sync.Mutex
  2900  	writes []string
  2901  }
  2902  
  2903  func (c *logWritesConn) Write(p []byte) (n int, err error) {
  2904  	c.mu.Lock()
  2905  	defer c.mu.Unlock()
  2906  	c.writes = append(c.writes, string(p))
  2907  	return c.w.Write(p)
  2908  }
  2909  
  2910  func (c *logWritesConn) Read(p []byte) (n int, err error) {
  2911  	if c.r == nil {
  2912  		c.r = <-c.rch
  2913  	}
  2914  	return c.r.Read(p)
  2915  }
  2916  
  2917  func (c *logWritesConn) Close() error { return nil }
  2918  
  2919  // Issue 6574
  2920  func TestTransportFlushesBodyChunks(t *testing.T) {
  2921  	defer afterTest(t)
  2922  	resBody := make(chan io.Reader, 1)
  2923  	connr, connw := io.Pipe() // connection pipe pair
  2924  	lw := &logWritesConn{
  2925  		rch: resBody,
  2926  		w:   connw,
  2927  	}
  2928  	tr := &Transport{
  2929  		Dial: func(network, addr string) (net.Conn, error) {
  2930  			return lw, nil
  2931  		},
  2932  	}
  2933  	bodyr, bodyw := io.Pipe() // body pipe pair
  2934  	go func() {
  2935  		defer bodyw.Close()
  2936  		for i := 0; i < 3; i++ {
  2937  			fmt.Fprintf(bodyw, "num%d\n", i)
  2938  		}
  2939  	}()
  2940  	resc := make(chan *Response)
  2941  	go func() {
  2942  		req, _ := NewRequest("POST", "http://localhost:8080", bodyr)
  2943  		req.Header.Set("User-Agent", "x") // known value for test
  2944  		res, err := tr.RoundTrip(req)
  2945  		if err != nil {
  2946  			t.Errorf("RoundTrip: %v", err)
  2947  			close(resc)
  2948  			return
  2949  		}
  2950  		resc <- res
  2951  
  2952  	}()
  2953  	// Fully consume the request before checking the Write log vs. want.
  2954  	req, err := ReadRequest(bufio.NewReader(connr))
  2955  	if err != nil {
  2956  		t.Fatal(err)
  2957  	}
  2958  	io.Copy(ioutil.Discard, req.Body)
  2959  
  2960  	// Unblock the transport's roundTrip goroutine.
  2961  	resBody <- strings.NewReader("HTTP/1.1 204 No Content\r\nConnection: close\r\n\r\n")
  2962  	res, ok := <-resc
  2963  	if !ok {
  2964  		return
  2965  	}
  2966  	defer res.Body.Close()
  2967  
  2968  	want := []string{
  2969  		"POST / HTTP/1.1\r\nHost: localhost:8080\r\nUser-Agent: x\r\nTransfer-Encoding: chunked\r\nAccept-Encoding: gzip\r\n\r\n" +
  2970  			"5\r\nnum0\n\r\n",
  2971  		"5\r\nnum1\n\r\n",
  2972  		"5\r\nnum2\n\r\n",
  2973  		"0\r\n\r\n",
  2974  	}
  2975  	if !reflect.DeepEqual(lw.writes, want) {
  2976  		t.Errorf("Writes differed.\n Got: %q\nWant: %q\n", lw.writes, want)
  2977  	}
  2978  }
  2979  
  2980  // Issue 11745.
  2981  func TestTransportPrefersResponseOverWriteError(t *testing.T) {
  2982  	if testing.Short() {
  2983  		t.Skip("skipping in short mode")
  2984  	}
  2985  	defer afterTest(t)
  2986  	const contentLengthLimit = 1024 * 1024 // 1MB
  2987  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  2988  		if r.ContentLength >= contentLengthLimit {
  2989  			w.WriteHeader(StatusBadRequest)
  2990  			r.Body.Close()
  2991  			return
  2992  		}
  2993  		w.WriteHeader(StatusOK)
  2994  	}))
  2995  	defer ts.Close()
  2996  
  2997  	fail := 0
  2998  	count := 100
  2999  	bigBody := strings.Repeat("a", contentLengthLimit*2)
  3000  	for i := 0; i < count; i++ {
  3001  		req, err := NewRequest("PUT", ts.URL, strings.NewReader(bigBody))
  3002  		if err != nil {
  3003  			t.Fatal(err)
  3004  		}
  3005  		tr := new(Transport)
  3006  		defer tr.CloseIdleConnections()
  3007  		client := &Client{Transport: tr}
  3008  		resp, err := client.Do(req)
  3009  		if err != nil {
  3010  			fail++
  3011  			t.Logf("%d = %#v", i, err)
  3012  			if ue, ok := err.(*url.Error); ok {
  3013  				t.Logf("urlErr = %#v", ue.Err)
  3014  				if ne, ok := ue.Err.(*net.OpError); ok {
  3015  					t.Logf("netOpError = %#v", ne.Err)
  3016  				}
  3017  			}
  3018  		} else {
  3019  			resp.Body.Close()
  3020  			if resp.StatusCode != 400 {
  3021  				t.Errorf("Expected status code 400, got %v", resp.Status)
  3022  			}
  3023  		}
  3024  	}
  3025  	if fail > 0 {
  3026  		t.Errorf("Failed %v out of %v\n", fail, count)
  3027  	}
  3028  }
  3029  
  3030  func TestTransportAutomaticHTTP2(t *testing.T) {
  3031  	testTransportAutoHTTP(t, &Transport{}, true)
  3032  }
  3033  
  3034  // golang.org/issue/14391: also check DefaultTransport
  3035  func TestTransportAutomaticHTTP2_DefaultTransport(t *testing.T) {
  3036  	testTransportAutoHTTP(t, DefaultTransport.(*Transport), true)
  3037  }
  3038  
  3039  func TestTransportAutomaticHTTP2_TLSNextProto(t *testing.T) {
  3040  	testTransportAutoHTTP(t, &Transport{
  3041  		TLSNextProto: make(map[string]func(string, *tls.Conn) RoundTripper),
  3042  	}, false)
  3043  }
  3044  
  3045  func TestTransportAutomaticHTTP2_TLSConfig(t *testing.T) {
  3046  	testTransportAutoHTTP(t, &Transport{
  3047  		TLSClientConfig: new(tls.Config),
  3048  	}, false)
  3049  }
  3050  
  3051  func TestTransportAutomaticHTTP2_ExpectContinueTimeout(t *testing.T) {
  3052  	testTransportAutoHTTP(t, &Transport{
  3053  		ExpectContinueTimeout: 1 * time.Second,
  3054  	}, true)
  3055  }
  3056  
  3057  func TestTransportAutomaticHTTP2_Dial(t *testing.T) {
  3058  	var d net.Dialer
  3059  	testTransportAutoHTTP(t, &Transport{
  3060  		Dial: d.Dial,
  3061  	}, false)
  3062  }
  3063  
  3064  func TestTransportAutomaticHTTP2_DialTLS(t *testing.T) {
  3065  	testTransportAutoHTTP(t, &Transport{
  3066  		DialTLS: func(network, addr string) (net.Conn, error) {
  3067  			panic("unused")
  3068  		},
  3069  	}, false)
  3070  }
  3071  
  3072  func testTransportAutoHTTP(t *testing.T, tr *Transport, wantH2 bool) {
  3073  	_, err := tr.RoundTrip(new(Request))
  3074  	if err == nil {
  3075  		t.Error("expected error from RoundTrip")
  3076  	}
  3077  	if reg := tr.TLSNextProto["h2"] != nil; reg != wantH2 {
  3078  		t.Errorf("HTTP/2 registered = %v; want %v", reg, wantH2)
  3079  	}
  3080  }
  3081  
  3082  // Issue 13633: there was a race where we returned bodyless responses
  3083  // to callers before recycling the persistent connection, which meant
  3084  // a client doing two subsequent requests could end up on different
  3085  // connections. It's somewhat harmless but enough tests assume it's
  3086  // not true in order to test other things that it's worth fixing.
  3087  // Plus it's nice to be consistent and not have timing-dependent
  3088  // behavior.
  3089  func TestTransportReuseConnEmptyResponseBody(t *testing.T) {
  3090  	defer afterTest(t)
  3091  	cst := newClientServerTest(t, h1Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  3092  		w.Header().Set("X-Addr", r.RemoteAddr)
  3093  		// Empty response body.
  3094  	}))
  3095  	defer cst.close()
  3096  	n := 100
  3097  	if testing.Short() {
  3098  		n = 10
  3099  	}
  3100  	var firstAddr string
  3101  	for i := 0; i < n; i++ {
  3102  		res, err := cst.c.Get(cst.ts.URL)
  3103  		if err != nil {
  3104  			log.Fatal(err)
  3105  		}
  3106  		addr := res.Header.Get("X-Addr")
  3107  		if i == 0 {
  3108  			firstAddr = addr
  3109  		} else if addr != firstAddr {
  3110  			t.Fatalf("On request %d, addr %q != original addr %q", i+1, addr, firstAddr)
  3111  		}
  3112  		res.Body.Close()
  3113  	}
  3114  }
  3115  
  3116  // Issue 13839
  3117  func TestNoCrashReturningTransportAltConn(t *testing.T) {
  3118  	cert, err := tls.X509KeyPair(internal.LocalhostCert, internal.LocalhostKey)
  3119  	if err != nil {
  3120  		t.Fatal(err)
  3121  	}
  3122  	ln := newLocalListener(t)
  3123  	defer ln.Close()
  3124  
  3125  	handledPendingDial := make(chan bool, 1)
  3126  	SetPendingDialHooks(nil, func() { handledPendingDial <- true })
  3127  	defer SetPendingDialHooks(nil, nil)
  3128  
  3129  	testDone := make(chan struct{})
  3130  	defer close(testDone)
  3131  	go func() {
  3132  		tln := tls.NewListener(ln, &tls.Config{
  3133  			NextProtos:   []string{"foo"},
  3134  			Certificates: []tls.Certificate{cert},
  3135  		})
  3136  		sc, err := tln.Accept()
  3137  		if err != nil {
  3138  			t.Error(err)
  3139  			return
  3140  		}
  3141  		if err := sc.(*tls.Conn).Handshake(); err != nil {
  3142  			t.Error(err)
  3143  			return
  3144  		}
  3145  		<-testDone
  3146  		sc.Close()
  3147  	}()
  3148  
  3149  	addr := ln.Addr().String()
  3150  
  3151  	req, _ := NewRequest("GET", "https://fake.tld/", nil)
  3152  	cancel := make(chan struct{})
  3153  	req.Cancel = cancel
  3154  
  3155  	doReturned := make(chan bool, 1)
  3156  	madeRoundTripper := make(chan bool, 1)
  3157  
  3158  	tr := &Transport{
  3159  		DisableKeepAlives: true,
  3160  		TLSNextProto: map[string]func(string, *tls.Conn) RoundTripper{
  3161  			"foo": func(authority string, c *tls.Conn) RoundTripper {
  3162  				madeRoundTripper <- true
  3163  				return funcRoundTripper(func() {
  3164  					t.Error("foo RoundTripper should not be called")
  3165  				})
  3166  			},
  3167  		},
  3168  		Dial: func(_, _ string) (net.Conn, error) {
  3169  			panic("shouldn't be called")
  3170  		},
  3171  		DialTLS: func(_, _ string) (net.Conn, error) {
  3172  			tc, err := tls.Dial("tcp", addr, &tls.Config{
  3173  				InsecureSkipVerify: true,
  3174  				NextProtos:         []string{"foo"},
  3175  			})
  3176  			if err != nil {
  3177  				return nil, err
  3178  			}
  3179  			if err := tc.Handshake(); err != nil {
  3180  				return nil, err
  3181  			}
  3182  			close(cancel)
  3183  			<-doReturned
  3184  			return tc, nil
  3185  		},
  3186  	}
  3187  	c := &Client{Transport: tr}
  3188  
  3189  	_, err = c.Do(req)
  3190  	if ue, ok := err.(*url.Error); !ok || ue.Err != ExportErrRequestCanceledConn {
  3191  		t.Fatalf("Do error = %v; want url.Error with errRequestCanceledConn", err)
  3192  	}
  3193  
  3194  	doReturned <- true
  3195  	<-madeRoundTripper
  3196  	<-handledPendingDial
  3197  }
  3198  
  3199  func TestTransportReuseConnection_Gzip_Chunked(t *testing.T) {
  3200  	testTransportReuseConnection_Gzip(t, true)
  3201  }
  3202  
  3203  func TestTransportReuseConnection_Gzip_ContentLength(t *testing.T) {
  3204  	testTransportReuseConnection_Gzip(t, false)
  3205  }
  3206  
  3207  // Make sure we re-use underlying TCP connection for gzipped responses too.
  3208  func testTransportReuseConnection_Gzip(t *testing.T, chunked bool) {
  3209  	setParallel(t)
  3210  	defer afterTest(t)
  3211  	addr := make(chan string, 2)
  3212  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3213  		addr <- r.RemoteAddr
  3214  		w.Header().Set("Content-Encoding", "gzip")
  3215  		if chunked {
  3216  			w.(Flusher).Flush()
  3217  		}
  3218  		w.Write(rgz) // arbitrary gzip response
  3219  	}))
  3220  	defer ts.Close()
  3221  
  3222  	tr := &Transport{}
  3223  	defer tr.CloseIdleConnections()
  3224  	c := &Client{Transport: tr}
  3225  	for i := 0; i < 2; i++ {
  3226  		res, err := c.Get(ts.URL)
  3227  		if err != nil {
  3228  			t.Fatal(err)
  3229  		}
  3230  		buf := make([]byte, len(rgz))
  3231  		if n, err := io.ReadFull(res.Body, buf); err != nil {
  3232  			t.Errorf("%d. ReadFull = %v, %v", i, n, err)
  3233  		}
  3234  		// Note: no res.Body.Close call. It should work without it,
  3235  		// since the flate.Reader's internal buffering will hit EOF
  3236  		// and that should be sufficient.
  3237  	}
  3238  	a1, a2 := <-addr, <-addr
  3239  	if a1 != a2 {
  3240  		t.Fatalf("didn't reuse connection")
  3241  	}
  3242  }
  3243  
  3244  func TestTransportResponseHeaderLength(t *testing.T) {
  3245  	setParallel(t)
  3246  	defer afterTest(t)
  3247  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3248  		if r.URL.Path == "/long" {
  3249  			w.Header().Set("Long", strings.Repeat("a", 1<<20))
  3250  		}
  3251  	}))
  3252  	defer ts.Close()
  3253  
  3254  	tr := &Transport{
  3255  		MaxResponseHeaderBytes: 512 << 10,
  3256  	}
  3257  	defer tr.CloseIdleConnections()
  3258  	c := &Client{Transport: tr}
  3259  	if res, err := c.Get(ts.URL); err != nil {
  3260  		t.Fatal(err)
  3261  	} else {
  3262  		res.Body.Close()
  3263  	}
  3264  
  3265  	res, err := c.Get(ts.URL + "/long")
  3266  	if err == nil {
  3267  		defer res.Body.Close()
  3268  		var n int64
  3269  		for k, vv := range res.Header {
  3270  			for _, v := range vv {
  3271  				n += int64(len(k)) + int64(len(v))
  3272  			}
  3273  		}
  3274  		t.Fatalf("Unexpected success. Got %v and %d bytes of response headers", res.Status, n)
  3275  	}
  3276  	if want := "server response headers exceeded 524288 bytes"; !strings.Contains(err.Error(), want) {
  3277  		t.Errorf("got error: %v; want %q", err, want)
  3278  	}
  3279  }
  3280  
  3281  func TestTransportEventTrace(t *testing.T)    { testTransportEventTrace(t, h1Mode, false) }
  3282  func TestTransportEventTrace_h2(t *testing.T) { testTransportEventTrace(t, h2Mode, false) }
  3283  
  3284  // test a non-nil httptrace.ClientTrace but with all hooks set to zero.
  3285  func TestTransportEventTrace_NoHooks(t *testing.T)    { testTransportEventTrace(t, h1Mode, true) }
  3286  func TestTransportEventTrace_NoHooks_h2(t *testing.T) { testTransportEventTrace(t, h2Mode, true) }
  3287  
  3288  func testTransportEventTrace(t *testing.T, h2 bool, noHooks bool) {
  3289  	defer afterTest(t)
  3290  	const resBody = "some body"
  3291  	gotWroteReqEvent := make(chan struct{})
  3292  	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
  3293  		if _, err := ioutil.ReadAll(r.Body); err != nil {
  3294  			t.Error(err)
  3295  		}
  3296  		if !noHooks {
  3297  			select {
  3298  			case <-gotWroteReqEvent:
  3299  			case <-time.After(5 * time.Second):
  3300  				t.Error("timeout waiting for WroteRequest event")
  3301  			}
  3302  		}
  3303  		io.WriteString(w, resBody)
  3304  	}))
  3305  	defer cst.close()
  3306  
  3307  	cst.tr.ExpectContinueTimeout = 1 * time.Second
  3308  
  3309  	var mu sync.Mutex // guards buf
  3310  	var buf bytes.Buffer
  3311  	logf := func(format string, args ...interface{}) {
  3312  		mu.Lock()
  3313  		defer mu.Unlock()
  3314  		fmt.Fprintf(&buf, format, args...)
  3315  		buf.WriteByte('\n')
  3316  	}
  3317  
  3318  	addrStr := cst.ts.Listener.Addr().String()
  3319  	ip, port, err := net.SplitHostPort(addrStr)
  3320  	if err != nil {
  3321  		t.Fatal(err)
  3322  	}
  3323  
  3324  	// Install a fake DNS server.
  3325  	ctx := context.WithValue(context.Background(), nettrace.LookupIPAltResolverKey{}, func(ctx context.Context, host string) ([]net.IPAddr, error) {
  3326  		if host != "dns-is-faked.golang" {
  3327  			t.Errorf("unexpected DNS host lookup for %q", host)
  3328  			return nil, nil
  3329  		}
  3330  		return []net.IPAddr{{IP: net.ParseIP(ip)}}, nil
  3331  	})
  3332  
  3333  	req, _ := NewRequest("POST", cst.scheme()+"://dns-is-faked.golang:"+port, strings.NewReader("some body"))
  3334  	trace := &httptrace.ClientTrace{
  3335  		GetConn:              func(hostPort string) { logf("Getting conn for %v ...", hostPort) },
  3336  		GotConn:              func(ci httptrace.GotConnInfo) { logf("got conn: %+v", ci) },
  3337  		GotFirstResponseByte: func() { logf("first response byte") },
  3338  		PutIdleConn:          func(err error) { logf("PutIdleConn = %v", err) },
  3339  		DNSStart:             func(e httptrace.DNSStartInfo) { logf("DNS start: %+v", e) },
  3340  		DNSDone:              func(e httptrace.DNSDoneInfo) { logf("DNS done: %+v", e) },
  3341  		ConnectStart:         func(network, addr string) { logf("ConnectStart: Connecting to %s %s ...", network, addr) },
  3342  		ConnectDone: func(network, addr string, err error) {
  3343  			if err != nil {
  3344  				t.Errorf("ConnectDone: %v", err)
  3345  			}
  3346  			logf("ConnectDone: connected to %s %s = %v", network, addr, err)
  3347  		},
  3348  		Wait100Continue: func() { logf("Wait100Continue") },
  3349  		Got100Continue:  func() { logf("Got100Continue") },
  3350  		WroteRequest: func(e httptrace.WroteRequestInfo) {
  3351  			logf("WroteRequest: %+v", e)
  3352  			close(gotWroteReqEvent)
  3353  		},
  3354  	}
  3355  	if h2 {
  3356  		trace.TLSHandshakeStart = func() { logf("tls handshake start") }
  3357  		trace.TLSHandshakeDone = func(s tls.ConnectionState, err error) {
  3358  			logf("tls handshake done. ConnectionState = %v \n err = %v", s, err)
  3359  		}
  3360  	}
  3361  	if noHooks {
  3362  		// zero out all func pointers, trying to get some path to crash
  3363  		*trace = httptrace.ClientTrace{}
  3364  	}
  3365  	req = req.WithContext(httptrace.WithClientTrace(ctx, trace))
  3366  
  3367  	req.Header.Set("Expect", "100-continue")
  3368  	res, err := cst.c.Do(req)
  3369  	if err != nil {
  3370  		t.Fatal(err)
  3371  	}
  3372  	logf("got roundtrip.response")
  3373  	slurp, err := ioutil.ReadAll(res.Body)
  3374  	if err != nil {
  3375  		t.Fatal(err)
  3376  	}
  3377  	logf("consumed body")
  3378  	if string(slurp) != resBody || res.StatusCode != 200 {
  3379  		t.Fatalf("Got %q, %v; want %q, 200 OK", slurp, res.Status, resBody)
  3380  	}
  3381  	res.Body.Close()
  3382  
  3383  	if noHooks {
  3384  		// Done at this point. Just testing a full HTTP
  3385  		// requests can happen with a trace pointing to a zero
  3386  		// ClientTrace, full of nil func pointers.
  3387  		return
  3388  	}
  3389  
  3390  	mu.Lock()
  3391  	got := buf.String()
  3392  	mu.Unlock()
  3393  
  3394  	wantOnce := func(sub string) {
  3395  		if strings.Count(got, sub) != 1 {
  3396  			t.Errorf("expected substring %q exactly once in output.", sub)
  3397  		}
  3398  	}
  3399  	wantOnceOrMore := func(sub string) {
  3400  		if strings.Count(got, sub) == 0 {
  3401  			t.Errorf("expected substring %q at least once in output.", sub)
  3402  		}
  3403  	}
  3404  	wantOnce("Getting conn for dns-is-faked.golang:" + port)
  3405  	wantOnce("DNS start: {Host:dns-is-faked.golang}")
  3406  	wantOnce("DNS done: {Addrs:[{IP:" + ip + " Zone:}] Err:<nil> Coalesced:false}")
  3407  	wantOnce("got conn: {")
  3408  	wantOnceOrMore("Connecting to tcp " + addrStr)
  3409  	wantOnceOrMore("connected to tcp " + addrStr + " = <nil>")
  3410  	wantOnce("Reused:false WasIdle:false IdleTime:0s")
  3411  	wantOnce("first response byte")
  3412  	if h2 {
  3413  		wantOnce("tls handshake start")
  3414  		wantOnce("tls handshake done")
  3415  	} else {
  3416  		wantOnce("PutIdleConn = <nil>")
  3417  	}
  3418  	wantOnce("Wait100Continue")
  3419  	wantOnce("Got100Continue")
  3420  	wantOnce("WroteRequest: {Err:<nil>}")
  3421  	if strings.Contains(got, " to udp ") {
  3422  		t.Errorf("should not see UDP (DNS) connections")
  3423  	}
  3424  	if t.Failed() {
  3425  		t.Errorf("Output:\n%s", got)
  3426  	}
  3427  }
  3428  
  3429  func TestTransportEventTraceRealDNS(t *testing.T) {
  3430  	if testing.Short() && testenv.Builder() == "" {
  3431  		// Skip this test in short mode (the default for
  3432  		// all.bash), in case the user is using a shady/ISP
  3433  		// DNS server hijacking queries.
  3434  		// See issues 16732, 16716.
  3435  		// Our builders use 8.8.8.8, though, which correctly
  3436  		// returns NXDOMAIN, so still run this test there.
  3437  		t.Skip("skipping in short mode")
  3438  	}
  3439  	defer afterTest(t)
  3440  	tr := &Transport{}
  3441  	defer tr.CloseIdleConnections()
  3442  	c := &Client{Transport: tr}
  3443  
  3444  	var mu sync.Mutex // guards buf
  3445  	var buf bytes.Buffer
  3446  	logf := func(format string, args ...interface{}) {
  3447  		mu.Lock()
  3448  		defer mu.Unlock()
  3449  		fmt.Fprintf(&buf, format, args...)
  3450  		buf.WriteByte('\n')
  3451  	}
  3452  
  3453  	req, _ := NewRequest("GET", "http://dns-should-not-resolve.golang:80", nil)
  3454  	trace := &httptrace.ClientTrace{
  3455  		DNSStart:     func(e httptrace.DNSStartInfo) { logf("DNSStart: %+v", e) },
  3456  		DNSDone:      func(e httptrace.DNSDoneInfo) { logf("DNSDone: %+v", e) },
  3457  		ConnectStart: func(network, addr string) { logf("ConnectStart: %s %s", network, addr) },
  3458  		ConnectDone:  func(network, addr string, err error) { logf("ConnectDone: %s %s %v", network, addr, err) },
  3459  	}
  3460  	req = req.WithContext(httptrace.WithClientTrace(context.Background(), trace))
  3461  
  3462  	resp, err := c.Do(req)
  3463  	if err == nil {
  3464  		resp.Body.Close()
  3465  		t.Fatal("expected error during DNS lookup")
  3466  	}
  3467  
  3468  	mu.Lock()
  3469  	got := buf.String()
  3470  	mu.Unlock()
  3471  
  3472  	wantSub := func(sub string) {
  3473  		if !strings.Contains(got, sub) {
  3474  			t.Errorf("expected substring %q in output.", sub)
  3475  		}
  3476  	}
  3477  	wantSub("DNSStart: {Host:dns-should-not-resolve.golang}")
  3478  	wantSub("DNSDone: {Addrs:[] Err:")
  3479  	if strings.Contains(got, "ConnectStart") || strings.Contains(got, "ConnectDone") {
  3480  		t.Errorf("should not see Connect events")
  3481  	}
  3482  	if t.Failed() {
  3483  		t.Errorf("Output:\n%s", got)
  3484  	}
  3485  }
  3486  
  3487  // Issue 14353: port can only contain digits.
  3488  func TestTransportRejectsAlphaPort(t *testing.T) {
  3489  	res, err := Get("http://dummy.tld:123foo/bar")
  3490  	if err == nil {
  3491  		res.Body.Close()
  3492  		t.Fatal("unexpected success")
  3493  	}
  3494  	ue, ok := err.(*url.Error)
  3495  	if !ok {
  3496  		t.Fatalf("got %#v; want *url.Error", err)
  3497  	}
  3498  	got := ue.Err.Error()
  3499  	want := `invalid URL port "123foo"`
  3500  	if got != want {
  3501  		t.Errorf("got error %q; want %q", got, want)
  3502  	}
  3503  }
  3504  
  3505  // Test the httptrace.TLSHandshake{Start,Done} hooks with a https http1
  3506  // connections. The http2 test is done in TestTransportEventTrace_h2
  3507  func TestTLSHandshakeTrace(t *testing.T) {
  3508  	defer afterTest(t)
  3509  	s := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
  3510  	defer s.Close()
  3511  
  3512  	var mu sync.Mutex
  3513  	var start, done bool
  3514  	trace := &httptrace.ClientTrace{
  3515  		TLSHandshakeStart: func() {
  3516  			mu.Lock()
  3517  			defer mu.Unlock()
  3518  			start = true
  3519  		},
  3520  		TLSHandshakeDone: func(s tls.ConnectionState, err error) {
  3521  			mu.Lock()
  3522  			defer mu.Unlock()
  3523  			done = true
  3524  			if err != nil {
  3525  				t.Fatal("Expected error to be nil but was:", err)
  3526  			}
  3527  		},
  3528  	}
  3529  
  3530  	tr := &Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
  3531  	defer tr.CloseIdleConnections()
  3532  	c := &Client{Transport: tr}
  3533  	req, err := NewRequest("GET", s.URL, nil)
  3534  	if err != nil {
  3535  		t.Fatal("Unable to construct test request:", err)
  3536  	}
  3537  	req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
  3538  
  3539  	r, err := c.Do(req)
  3540  	if err != nil {
  3541  		t.Fatal("Unexpected error making request:", err)
  3542  	}
  3543  	r.Body.Close()
  3544  	mu.Lock()
  3545  	defer mu.Unlock()
  3546  	if !start {
  3547  		t.Fatal("Expected TLSHandshakeStart to be called, but wasn't")
  3548  	}
  3549  	if !done {
  3550  		t.Fatal("Expected TLSHandshakeDone to be called, but wasnt't")
  3551  	}
  3552  }
  3553  
  3554  func TestTransportMaxIdleConns(t *testing.T) {
  3555  	defer afterTest(t)
  3556  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3557  		// No body for convenience.
  3558  	}))
  3559  	defer ts.Close()
  3560  	tr := &Transport{
  3561  		MaxIdleConns: 4,
  3562  	}
  3563  	defer tr.CloseIdleConnections()
  3564  
  3565  	ip, port, err := net.SplitHostPort(ts.Listener.Addr().String())
  3566  	if err != nil {
  3567  		t.Fatal(err)
  3568  	}
  3569  	c := &Client{Transport: tr}
  3570  	ctx := context.WithValue(context.Background(), nettrace.LookupIPAltResolverKey{}, func(ctx context.Context, host string) ([]net.IPAddr, error) {
  3571  		return []net.IPAddr{{IP: net.ParseIP(ip)}}, nil
  3572  	})
  3573  
  3574  	hitHost := func(n int) {
  3575  		req, _ := NewRequest("GET", fmt.Sprintf("http://host-%d.dns-is-faked.golang:"+port, n), nil)
  3576  		req = req.WithContext(ctx)
  3577  		res, err := c.Do(req)
  3578  		if err != nil {
  3579  			t.Fatal(err)
  3580  		}
  3581  		res.Body.Close()
  3582  	}
  3583  	for i := 0; i < 4; i++ {
  3584  		hitHost(i)
  3585  	}
  3586  	want := []string{
  3587  		"|http|host-0.dns-is-faked.golang:" + port,
  3588  		"|http|host-1.dns-is-faked.golang:" + port,
  3589  		"|http|host-2.dns-is-faked.golang:" + port,
  3590  		"|http|host-3.dns-is-faked.golang:" + port,
  3591  	}
  3592  	if got := tr.IdleConnKeysForTesting(); !reflect.DeepEqual(got, want) {
  3593  		t.Fatalf("idle conn keys mismatch.\n got: %q\nwant: %q\n", got, want)
  3594  	}
  3595  
  3596  	// Now hitting the 5th host should kick out the first host:
  3597  	hitHost(4)
  3598  	want = []string{
  3599  		"|http|host-1.dns-is-faked.golang:" + port,
  3600  		"|http|host-2.dns-is-faked.golang:" + port,
  3601  		"|http|host-3.dns-is-faked.golang:" + port,
  3602  		"|http|host-4.dns-is-faked.golang:" + port,
  3603  	}
  3604  	if got := tr.IdleConnKeysForTesting(); !reflect.DeepEqual(got, want) {
  3605  		t.Fatalf("idle conn keys mismatch after 5th host.\n got: %q\nwant: %q\n", got, want)
  3606  	}
  3607  }
  3608  
  3609  func TestTransportIdleConnTimeout_h1(t *testing.T) { testTransportIdleConnTimeout(t, h1Mode) }
  3610  func TestTransportIdleConnTimeout_h2(t *testing.T) { testTransportIdleConnTimeout(t, h2Mode) }
  3611  func testTransportIdleConnTimeout(t *testing.T, h2 bool) {
  3612  	if testing.Short() {
  3613  		t.Skip("skipping in short mode")
  3614  	}
  3615  	defer afterTest(t)
  3616  
  3617  	const timeout = 1 * time.Second
  3618  
  3619  	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
  3620  		// No body for convenience.
  3621  	}))
  3622  	defer cst.close()
  3623  	tr := cst.tr
  3624  	tr.IdleConnTimeout = timeout
  3625  	defer tr.CloseIdleConnections()
  3626  	c := &Client{Transport: tr}
  3627  
  3628  	idleConns := func() []string {
  3629  		if h2 {
  3630  			return tr.IdleConnStrsForTesting_h2()
  3631  		} else {
  3632  			return tr.IdleConnStrsForTesting()
  3633  		}
  3634  	}
  3635  
  3636  	var conn string
  3637  	doReq := func(n int) {
  3638  		req, _ := NewRequest("GET", cst.ts.URL, nil)
  3639  		req = req.WithContext(httptrace.WithClientTrace(context.Background(), &httptrace.ClientTrace{
  3640  			PutIdleConn: func(err error) {
  3641  				if err != nil {
  3642  					t.Errorf("failed to keep idle conn: %v", err)
  3643  				}
  3644  			},
  3645  		}))
  3646  		res, err := c.Do(req)
  3647  		if err != nil {
  3648  			t.Fatal(err)
  3649  		}
  3650  		res.Body.Close()
  3651  		conns := idleConns()
  3652  		if len(conns) != 1 {
  3653  			t.Fatalf("req %v: unexpected number of idle conns: %q", n, conns)
  3654  		}
  3655  		if conn == "" {
  3656  			conn = conns[0]
  3657  		}
  3658  		if conn != conns[0] {
  3659  			t.Fatalf("req %v: cached connection changed; expected the same one throughout the test", n)
  3660  		}
  3661  	}
  3662  	for i := 0; i < 3; i++ {
  3663  		doReq(i)
  3664  		time.Sleep(timeout / 2)
  3665  	}
  3666  	time.Sleep(timeout * 3 / 2)
  3667  	if got := idleConns(); len(got) != 0 {
  3668  		t.Errorf("idle conns = %q; want none", got)
  3669  	}
  3670  }
  3671  
  3672  // Issue 16208: Go 1.7 crashed after Transport.IdleConnTimeout if an
  3673  // HTTP/2 connection was established but but its caller no longer
  3674  // wanted it. (Assuming the connection cache was enabled, which it is
  3675  // by default)
  3676  //
  3677  // This test reproduced the crash by setting the IdleConnTimeout low
  3678  // (to make the test reasonable) and then making a request which is
  3679  // canceled by the DialTLS hook, which then also waits to return the
  3680  // real connection until after the RoundTrip saw the error.  Then we
  3681  // know the successful tls.Dial from DialTLS will need to go into the
  3682  // idle pool. Then we give it a of time to explode.
  3683  func TestIdleConnH2Crash(t *testing.T) {
  3684  	setParallel(t)
  3685  	cst := newClientServerTest(t, h2Mode, HandlerFunc(func(w ResponseWriter, r *Request) {
  3686  		// nothing
  3687  	}))
  3688  	defer cst.close()
  3689  
  3690  	ctx, cancel := context.WithCancel(context.Background())
  3691  	defer cancel()
  3692  
  3693  	sawDoErr := make(chan bool, 1)
  3694  	testDone := make(chan struct{})
  3695  	defer close(testDone)
  3696  
  3697  	cst.tr.IdleConnTimeout = 5 * time.Millisecond
  3698  	cst.tr.DialTLS = func(network, addr string) (net.Conn, error) {
  3699  		c, err := tls.Dial(network, addr, &tls.Config{
  3700  			InsecureSkipVerify: true,
  3701  			NextProtos:         []string{"h2"},
  3702  		})
  3703  		if err != nil {
  3704  			t.Error(err)
  3705  			return nil, err
  3706  		}
  3707  		if cs := c.ConnectionState(); cs.NegotiatedProtocol != "h2" {
  3708  			t.Errorf("protocol = %q; want %q", cs.NegotiatedProtocol, "h2")
  3709  			c.Close()
  3710  			return nil, errors.New("bogus")
  3711  		}
  3712  
  3713  		cancel()
  3714  
  3715  		failTimer := time.NewTimer(5 * time.Second)
  3716  		defer failTimer.Stop()
  3717  		select {
  3718  		case <-sawDoErr:
  3719  		case <-testDone:
  3720  		case <-failTimer.C:
  3721  			t.Error("timeout in DialTLS, waiting too long for cst.c.Do to fail")
  3722  		}
  3723  		return c, nil
  3724  	}
  3725  
  3726  	req, _ := NewRequest("GET", cst.ts.URL, nil)
  3727  	req = req.WithContext(ctx)
  3728  	res, err := cst.c.Do(req)
  3729  	if err == nil {
  3730  		res.Body.Close()
  3731  		t.Fatal("unexpected success")
  3732  	}
  3733  	sawDoErr <- true
  3734  
  3735  	// Wait for the explosion.
  3736  	time.Sleep(cst.tr.IdleConnTimeout * 10)
  3737  }
  3738  
  3739  type funcConn struct {
  3740  	net.Conn
  3741  	read  func([]byte) (int, error)
  3742  	write func([]byte) (int, error)
  3743  }
  3744  
  3745  func (c funcConn) Read(p []byte) (int, error)  { return c.read(p) }
  3746  func (c funcConn) Write(p []byte) (int, error) { return c.write(p) }
  3747  func (c funcConn) Close() error                { return nil }
  3748  
  3749  // Issue 16465: Transport.RoundTrip should return the raw net.Conn.Read error from Peek
  3750  // back to the caller.
  3751  func TestTransportReturnsPeekError(t *testing.T) {
  3752  	errValue := errors.New("specific error value")
  3753  
  3754  	wrote := make(chan struct{})
  3755  	var wroteOnce sync.Once
  3756  
  3757  	tr := &Transport{
  3758  		Dial: func(network, addr string) (net.Conn, error) {
  3759  			c := funcConn{
  3760  				read: func([]byte) (int, error) {
  3761  					<-wrote
  3762  					return 0, errValue
  3763  				},
  3764  				write: func(p []byte) (int, error) {
  3765  					wroteOnce.Do(func() { close(wrote) })
  3766  					return len(p), nil
  3767  				},
  3768  			}
  3769  			return c, nil
  3770  		},
  3771  	}
  3772  	_, err := tr.RoundTrip(httptest.NewRequest("GET", "http://fake.tld/", nil))
  3773  	if err != errValue {
  3774  		t.Errorf("error = %#v; want %v", err, errValue)
  3775  	}
  3776  }
  3777  
  3778  // Issue 13835: international domain names should work
  3779  func TestTransportIDNA_h1(t *testing.T) { testTransportIDNA(t, h1Mode) }
  3780  func TestTransportIDNA_h2(t *testing.T) { testTransportIDNA(t, h2Mode) }
  3781  func testTransportIDNA(t *testing.T, h2 bool) {
  3782  	defer afterTest(t)
  3783  
  3784  	const uniDomain = "гофер.го"
  3785  	const punyDomain = "xn--c1ae0ajs.xn--c1aw"
  3786  
  3787  	var port string
  3788  	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
  3789  		want := punyDomain + ":" + port
  3790  		if r.Host != want {
  3791  			t.Errorf("Host header = %q; want %q", r.Host, want)
  3792  		}
  3793  		if h2 {
  3794  			if r.TLS == nil {
  3795  				t.Errorf("r.TLS == nil")
  3796  			} else if r.TLS.ServerName != punyDomain {
  3797  				t.Errorf("TLS.ServerName = %q; want %q", r.TLS.ServerName, punyDomain)
  3798  			}
  3799  		}
  3800  		w.Header().Set("Hit-Handler", "1")
  3801  	}))
  3802  	defer cst.close()
  3803  
  3804  	ip, port, err := net.SplitHostPort(cst.ts.Listener.Addr().String())
  3805  	if err != nil {
  3806  		t.Fatal(err)
  3807  	}
  3808  
  3809  	// Install a fake DNS server.
  3810  	ctx := context.WithValue(context.Background(), nettrace.LookupIPAltResolverKey{}, func(ctx context.Context, host string) ([]net.IPAddr, error) {
  3811  		if host != punyDomain {
  3812  			t.Errorf("got DNS host lookup for %q; want %q", host, punyDomain)
  3813  			return nil, nil
  3814  		}
  3815  		return []net.IPAddr{{IP: net.ParseIP(ip)}}, nil
  3816  	})
  3817  
  3818  	req, _ := NewRequest("GET", cst.scheme()+"://"+uniDomain+":"+port, nil)
  3819  	trace := &httptrace.ClientTrace{
  3820  		GetConn: func(hostPort string) {
  3821  			want := net.JoinHostPort(punyDomain, port)
  3822  			if hostPort != want {
  3823  				t.Errorf("getting conn for %q; want %q", hostPort, want)
  3824  			}
  3825  		},
  3826  		DNSStart: func(e httptrace.DNSStartInfo) {
  3827  			if e.Host != punyDomain {
  3828  				t.Errorf("DNSStart Host = %q; want %q", e.Host, punyDomain)
  3829  			}
  3830  		},
  3831  	}
  3832  	req = req.WithContext(httptrace.WithClientTrace(ctx, trace))
  3833  
  3834  	res, err := cst.tr.RoundTrip(req)
  3835  	if err != nil {
  3836  		t.Fatal(err)
  3837  	}
  3838  	defer res.Body.Close()
  3839  	if res.Header.Get("Hit-Handler") != "1" {
  3840  		out, err := httputil.DumpResponse(res, true)
  3841  		if err != nil {
  3842  			t.Fatal(err)
  3843  		}
  3844  		t.Errorf("Response body wasn't from Handler. Got:\n%s\n", out)
  3845  	}
  3846  }
  3847  
  3848  // Issue 13290: send User-Agent in proxy CONNECT
  3849  func TestTransportProxyConnectHeader(t *testing.T) {
  3850  	defer afterTest(t)
  3851  	reqc := make(chan *Request, 1)
  3852  	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
  3853  		if r.Method != "CONNECT" {
  3854  			t.Errorf("method = %q; want CONNECT", r.Method)
  3855  		}
  3856  		reqc <- r
  3857  		c, _, err := w.(Hijacker).Hijack()
  3858  		if err != nil {
  3859  			t.Errorf("Hijack: %v", err)
  3860  			return
  3861  		}
  3862  		c.Close()
  3863  	}))
  3864  	defer ts.Close()
  3865  	tr := &Transport{
  3866  		ProxyConnectHeader: Header{
  3867  			"User-Agent": {"foo"},
  3868  			"Other":      {"bar"},
  3869  		},
  3870  		Proxy: func(r *Request) (*url.URL, error) {
  3871  			return url.Parse(ts.URL)
  3872  		},
  3873  	}
  3874  	defer tr.CloseIdleConnections()
  3875  	c := &Client{Transport: tr}
  3876  	res, err := c.Get("https://dummy.tld/") // https to force a CONNECT
  3877  	if err == nil {
  3878  		res.Body.Close()
  3879  		t.Errorf("unexpected success")
  3880  	}
  3881  	select {
  3882  	case <-time.After(3 * time.Second):
  3883  		t.Fatal("timeout")
  3884  	case r := <-reqc:
  3885  		if got, want := r.Header.Get("User-Agent"), "foo"; got != want {
  3886  			t.Errorf("CONNECT request User-Agent = %q; want %q", got, want)
  3887  		}
  3888  		if got, want := r.Header.Get("Other"), "bar"; got != want {
  3889  			t.Errorf("CONNECT request Other = %q; want %q", got, want)
  3890  		}
  3891  	}
  3892  }
  3893  
  3894  var errFakeRoundTrip = errors.New("fake roundtrip")
  3895  
  3896  type funcRoundTripper func()
  3897  
  3898  func (fn funcRoundTripper) RoundTrip(*Request) (*Response, error) {
  3899  	fn()
  3900  	return nil, errFakeRoundTrip
  3901  }
  3902  
  3903  func wantBody(res *Response, err error, want string) error {
  3904  	if err != nil {
  3905  		return err
  3906  	}
  3907  	slurp, err := ioutil.ReadAll(res.Body)
  3908  	if err != nil {
  3909  		return fmt.Errorf("error reading body: %v", err)
  3910  	}
  3911  	if string(slurp) != want {
  3912  		return fmt.Errorf("body = %q; want %q", slurp, want)
  3913  	}
  3914  	if err := res.Body.Close(); err != nil {
  3915  		return fmt.Errorf("body Close = %v", err)
  3916  	}
  3917  	return nil
  3918  }
  3919  
  3920  func newLocalListener(t *testing.T) net.Listener {
  3921  	ln, err := net.Listen("tcp", "127.0.0.1:0")
  3922  	if err != nil {
  3923  		ln, err = net.Listen("tcp6", "[::1]:0")
  3924  	}
  3925  	if err != nil {
  3926  		t.Fatal(err)
  3927  	}
  3928  	return ln
  3929  }
  3930  
  3931  type countCloseReader struct {
  3932  	n *int
  3933  	io.Reader
  3934  }
  3935  
  3936  func (cr countCloseReader) Close() error {
  3937  	(*cr.n)++
  3938  	return nil
  3939  }
  3940  
  3941  // rgz is a gzip quine that uncompresses to itself.
  3942  var rgz = []byte{
  3943  	0x1f, 0x8b, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,
  3944  	0x00, 0x00, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73,
  3945  	0x69, 0x76, 0x65, 0x00, 0x92, 0xef, 0xe6, 0xe0,
  3946  	0x60, 0x00, 0x83, 0xa2, 0xd4, 0xe4, 0xd2, 0xa2,
  3947  	0xe2, 0xcc, 0xb2, 0x54, 0x06, 0x00, 0x00, 0x17,
  3948  	0x00, 0xe8, 0xff, 0x92, 0xef, 0xe6, 0xe0, 0x60,
  3949  	0x00, 0x83, 0xa2, 0xd4, 0xe4, 0xd2, 0xa2, 0xe2,
  3950  	0xcc, 0xb2, 0x54, 0x06, 0x00, 0x00, 0x17, 0x00,
  3951  	0xe8, 0xff, 0x42, 0x12, 0x46, 0x16, 0x06, 0x00,
  3952  	0x05, 0x00, 0xfa, 0xff, 0x42, 0x12, 0x46, 0x16,
  3953  	0x06, 0x00, 0x05, 0x00, 0xfa, 0xff, 0x00, 0x05,
  3954  	0x00, 0xfa, 0xff, 0x00, 0x14, 0x00, 0xeb, 0xff,
  3955  	0x42, 0x12, 0x46, 0x16, 0x06, 0x00, 0x05, 0x00,
  3956  	0xfa, 0xff, 0x00, 0x05, 0x00, 0xfa, 0xff, 0x00,
  3957  	0x14, 0x00, 0xeb, 0xff, 0x42, 0x88, 0x21, 0xc4,
  3958  	0x00, 0x00, 0x14, 0x00, 0xeb, 0xff, 0x42, 0x88,
  3959  	0x21, 0xc4, 0x00, 0x00, 0x14, 0x00, 0xeb, 0xff,
  3960  	0x42, 0x88, 0x21, 0xc4, 0x00, 0x00, 0x14, 0x00,
  3961  	0xeb, 0xff, 0x42, 0x88, 0x21, 0xc4, 0x00, 0x00,
  3962  	0x14, 0x00, 0xeb, 0xff, 0x42, 0x88, 0x21, 0xc4,
  3963  	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
  3964  	0x00, 0xff, 0xff, 0x00, 0x17, 0x00, 0xe8, 0xff,
  3965  	0x42, 0x88, 0x21, 0xc4, 0x00, 0x00, 0x00, 0x00,
  3966  	0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
  3967  	0x17, 0x00, 0xe8, 0xff, 0x42, 0x12, 0x46, 0x16,
  3968  	0x06, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x08,
  3969  	0x00, 0xf7, 0xff, 0x3d, 0xb1, 0x20, 0x85, 0xfa,
  3970  	0x00, 0x00, 0x00, 0x42, 0x12, 0x46, 0x16, 0x06,
  3971  	0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x08, 0x00,
  3972  	0xf7, 0xff, 0x3d, 0xb1, 0x20, 0x85, 0xfa, 0x00,
  3973  	0x00, 0x00, 0x3d, 0xb1, 0x20, 0x85, 0xfa, 0x00,
  3974  	0x00, 0x00,
  3975  }