Home | History | Annotate | Download | only in http
      1 // Copyright 2010 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 // End-to-end serving tests
      6 
      7 package http_test
      8 
      9 import (
     10 	"bufio"
     11 	"bytes"
     12 	"compress/gzip"
     13 	"context"
     14 	"crypto/tls"
     15 	"encoding/json"
     16 	"errors"
     17 	"fmt"
     18 	"internal/testenv"
     19 	"io"
     20 	"io/ioutil"
     21 	"log"
     22 	"math/rand"
     23 	"net"
     24 	. "net/http"
     25 	"net/http/httptest"
     26 	"net/http/httputil"
     27 	"net/http/internal"
     28 	"net/url"
     29 	"os"
     30 	"os/exec"
     31 	"reflect"
     32 	"runtime"
     33 	"runtime/debug"
     34 	"sort"
     35 	"strconv"
     36 	"strings"
     37 	"sync"
     38 	"sync/atomic"
     39 	"syscall"
     40 	"testing"
     41 	"time"
     42 )
     43 
     44 type dummyAddr string
     45 type oneConnListener struct {
     46 	conn net.Conn
     47 }
     48 
     49 func (l *oneConnListener) Accept() (c net.Conn, err error) {
     50 	c = l.conn
     51 	if c == nil {
     52 		err = io.EOF
     53 		return
     54 	}
     55 	err = nil
     56 	l.conn = nil
     57 	return
     58 }
     59 
     60 func (l *oneConnListener) Close() error {
     61 	return nil
     62 }
     63 
     64 func (l *oneConnListener) Addr() net.Addr {
     65 	return dummyAddr("test-address")
     66 }
     67 
     68 func (a dummyAddr) Network() string {
     69 	return string(a)
     70 }
     71 
     72 func (a dummyAddr) String() string {
     73 	return string(a)
     74 }
     75 
     76 type noopConn struct{}
     77 
     78 func (noopConn) LocalAddr() net.Addr                { return dummyAddr("local-addr") }
     79 func (noopConn) RemoteAddr() net.Addr               { return dummyAddr("remote-addr") }
     80 func (noopConn) SetDeadline(t time.Time) error      { return nil }
     81 func (noopConn) SetReadDeadline(t time.Time) error  { return nil }
     82 func (noopConn) SetWriteDeadline(t time.Time) error { return nil }
     83 
     84 type rwTestConn struct {
     85 	io.Reader
     86 	io.Writer
     87 	noopConn
     88 
     89 	closeFunc func() error // called if non-nil
     90 	closec    chan bool    // else, if non-nil, send value to it on close
     91 }
     92 
     93 func (c *rwTestConn) Close() error {
     94 	if c.closeFunc != nil {
     95 		return c.closeFunc()
     96 	}
     97 	select {
     98 	case c.closec <- true:
     99 	default:
    100 	}
    101 	return nil
    102 }
    103 
    104 type testConn struct {
    105 	readMu   sync.Mutex // for TestHandlerBodyClose
    106 	readBuf  bytes.Buffer
    107 	writeBuf bytes.Buffer
    108 	closec   chan bool // if non-nil, send value to it on close
    109 	noopConn
    110 }
    111 
    112 func (c *testConn) Read(b []byte) (int, error) {
    113 	c.readMu.Lock()
    114 	defer c.readMu.Unlock()
    115 	return c.readBuf.Read(b)
    116 }
    117 
    118 func (c *testConn) Write(b []byte) (int, error) {
    119 	return c.writeBuf.Write(b)
    120 }
    121 
    122 func (c *testConn) Close() error {
    123 	select {
    124 	case c.closec <- true:
    125 	default:
    126 	}
    127 	return nil
    128 }
    129 
    130 // reqBytes treats req as a request (with \n delimiters) and returns it with \r\n delimiters,
    131 // ending in \r\n\r\n
    132 func reqBytes(req string) []byte {
    133 	return []byte(strings.Replace(strings.TrimSpace(req), "\n", "\r\n", -1) + "\r\n\r\n")
    134 }
    135 
    136 type handlerTest struct {
    137 	handler Handler
    138 }
    139 
    140 func newHandlerTest(h Handler) handlerTest {
    141 	return handlerTest{h}
    142 }
    143 
    144 func (ht handlerTest) rawResponse(req string) string {
    145 	reqb := reqBytes(req)
    146 	var output bytes.Buffer
    147 	conn := &rwTestConn{
    148 		Reader: bytes.NewReader(reqb),
    149 		Writer: &output,
    150 		closec: make(chan bool, 1),
    151 	}
    152 	ln := &oneConnListener{conn: conn}
    153 	go Serve(ln, ht.handler)
    154 	<-conn.closec
    155 	return output.String()
    156 }
    157 
    158 func TestConsumingBodyOnNextConn(t *testing.T) {
    159 	t.Parallel()
    160 	defer afterTest(t)
    161 	conn := new(testConn)
    162 	for i := 0; i < 2; i++ {
    163 		conn.readBuf.Write([]byte(
    164 			"POST / HTTP/1.1\r\n" +
    165 				"Host: test\r\n" +
    166 				"Content-Length: 11\r\n" +
    167 				"\r\n" +
    168 				"foo=1&bar=1"))
    169 	}
    170 
    171 	reqNum := 0
    172 	ch := make(chan *Request)
    173 	servech := make(chan error)
    174 	listener := &oneConnListener{conn}
    175 	handler := func(res ResponseWriter, req *Request) {
    176 		reqNum++
    177 		ch <- req
    178 	}
    179 
    180 	go func() {
    181 		servech <- Serve(listener, HandlerFunc(handler))
    182 	}()
    183 
    184 	var req *Request
    185 	req = <-ch
    186 	if req == nil {
    187 		t.Fatal("Got nil first request.")
    188 	}
    189 	if req.Method != "POST" {
    190 		t.Errorf("For request #1's method, got %q; expected %q",
    191 			req.Method, "POST")
    192 	}
    193 
    194 	req = <-ch
    195 	if req == nil {
    196 		t.Fatal("Got nil first request.")
    197 	}
    198 	if req.Method != "POST" {
    199 		t.Errorf("For request #2's method, got %q; expected %q",
    200 			req.Method, "POST")
    201 	}
    202 
    203 	if serveerr := <-servech; serveerr != io.EOF {
    204 		t.Errorf("Serve returned %q; expected EOF", serveerr)
    205 	}
    206 }
    207 
    208 type stringHandler string
    209 
    210 func (s stringHandler) ServeHTTP(w ResponseWriter, r *Request) {
    211 	w.Header().Set("Result", string(s))
    212 }
    213 
    214 var handlers = []struct {
    215 	pattern string
    216 	msg     string
    217 }{
    218 	{"/", "Default"},
    219 	{"/someDir/", "someDir"},
    220 	{"/#/", "hash"},
    221 	{"someHost.com/someDir/", "someHost.com/someDir"},
    222 }
    223 
    224 var vtests = []struct {
    225 	url      string
    226 	expected string
    227 }{
    228 	{"http://localhost/someDir/apage", "someDir"},
    229 	{"http://localhost/%23/apage", "hash"},
    230 	{"http://localhost/otherDir/apage", "Default"},
    231 	{"http://someHost.com/someDir/apage", "someHost.com/someDir"},
    232 	{"http://otherHost.com/someDir/apage", "someDir"},
    233 	{"http://otherHost.com/aDir/apage", "Default"},
    234 	// redirections for trees
    235 	{"http://localhost/someDir", "/someDir/"},
    236 	{"http://localhost/%23", "/%23/"},
    237 	{"http://someHost.com/someDir", "/someDir/"},
    238 }
    239 
    240 func TestHostHandlers(t *testing.T) {
    241 	setParallel(t)
    242 	defer afterTest(t)
    243 	mux := NewServeMux()
    244 	for _, h := range handlers {
    245 		mux.Handle(h.pattern, stringHandler(h.msg))
    246 	}
    247 	ts := httptest.NewServer(mux)
    248 	defer ts.Close()
    249 
    250 	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
    251 	if err != nil {
    252 		t.Fatal(err)
    253 	}
    254 	defer conn.Close()
    255 	cc := httputil.NewClientConn(conn, nil)
    256 	for _, vt := range vtests {
    257 		var r *Response
    258 		var req Request
    259 		if req.URL, err = url.Parse(vt.url); err != nil {
    260 			t.Errorf("cannot parse url: %v", err)
    261 			continue
    262 		}
    263 		if err := cc.Write(&req); err != nil {
    264 			t.Errorf("writing request: %v", err)
    265 			continue
    266 		}
    267 		r, err := cc.Read(&req)
    268 		if err != nil {
    269 			t.Errorf("reading response: %v", err)
    270 			continue
    271 		}
    272 		switch r.StatusCode {
    273 		case StatusOK:
    274 			s := r.Header.Get("Result")
    275 			if s != vt.expected {
    276 				t.Errorf("Get(%q) = %q, want %q", vt.url, s, vt.expected)
    277 			}
    278 		case StatusMovedPermanently:
    279 			s := r.Header.Get("Location")
    280 			if s != vt.expected {
    281 				t.Errorf("Get(%q) = %q, want %q", vt.url, s, vt.expected)
    282 			}
    283 		default:
    284 			t.Errorf("Get(%q) unhandled status code %d", vt.url, r.StatusCode)
    285 		}
    286 	}
    287 }
    288 
    289 var serveMuxRegister = []struct {
    290 	pattern string
    291 	h       Handler
    292 }{
    293 	{"/dir/", serve(200)},
    294 	{"/search", serve(201)},
    295 	{"codesearch.google.com/search", serve(202)},
    296 	{"codesearch.google.com/", serve(203)},
    297 	{"example.com/", HandlerFunc(checkQueryStringHandler)},
    298 }
    299 
    300 // serve returns a handler that sends a response with the given code.
    301 func serve(code int) HandlerFunc {
    302 	return func(w ResponseWriter, r *Request) {
    303 		w.WriteHeader(code)
    304 	}
    305 }
    306 
    307 // checkQueryStringHandler checks if r.URL.RawQuery has the same value
    308 // as the URL excluding the scheme and the query string and sends 200
    309 // response code if it is, 500 otherwise.
    310 func checkQueryStringHandler(w ResponseWriter, r *Request) {
    311 	u := *r.URL
    312 	u.Scheme = "http"
    313 	u.Host = r.Host
    314 	u.RawQuery = ""
    315 	if "http://"+r.URL.RawQuery == u.String() {
    316 		w.WriteHeader(200)
    317 	} else {
    318 		w.WriteHeader(500)
    319 	}
    320 }
    321 
    322 var serveMuxTests = []struct {
    323 	method  string
    324 	host    string
    325 	path    string
    326 	code    int
    327 	pattern string
    328 }{
    329 	{"GET", "google.com", "/", 404, ""},
    330 	{"GET", "google.com", "/dir", 301, "/dir/"},
    331 	{"GET", "google.com", "/dir/", 200, "/dir/"},
    332 	{"GET", "google.com", "/dir/file", 200, "/dir/"},
    333 	{"GET", "google.com", "/search", 201, "/search"},
    334 	{"GET", "google.com", "/search/", 404, ""},
    335 	{"GET", "google.com", "/search/foo", 404, ""},
    336 	{"GET", "codesearch.google.com", "/search", 202, "codesearch.google.com/search"},
    337 	{"GET", "codesearch.google.com", "/search/", 203, "codesearch.google.com/"},
    338 	{"GET", "codesearch.google.com", "/search/foo", 203, "codesearch.google.com/"},
    339 	{"GET", "codesearch.google.com", "/", 203, "codesearch.google.com/"},
    340 	{"GET", "images.google.com", "/search", 201, "/search"},
    341 	{"GET", "images.google.com", "/search/", 404, ""},
    342 	{"GET", "images.google.com", "/search/foo", 404, ""},
    343 	{"GET", "google.com", "/../search", 301, "/search"},
    344 	{"GET", "google.com", "/dir/..", 301, ""},
    345 	{"GET", "google.com", "/dir/..", 301, ""},
    346 	{"GET", "google.com", "/dir/./file", 301, "/dir/"},
    347 
    348 	// The /foo -> /foo/ redirect applies to CONNECT requests
    349 	// but the path canonicalization does not.
    350 	{"CONNECT", "google.com", "/dir", 301, "/dir/"},
    351 	{"CONNECT", "google.com", "/../search", 404, ""},
    352 	{"CONNECT", "google.com", "/dir/..", 200, "/dir/"},
    353 	{"CONNECT", "google.com", "/dir/..", 200, "/dir/"},
    354 	{"CONNECT", "google.com", "/dir/./file", 200, "/dir/"},
    355 }
    356 
    357 func TestServeMuxHandler(t *testing.T) {
    358 	setParallel(t)
    359 	mux := NewServeMux()
    360 	for _, e := range serveMuxRegister {
    361 		mux.Handle(e.pattern, e.h)
    362 	}
    363 
    364 	for _, tt := range serveMuxTests {
    365 		r := &Request{
    366 			Method: tt.method,
    367 			Host:   tt.host,
    368 			URL: &url.URL{
    369 				Path: tt.path,
    370 			},
    371 		}
    372 		h, pattern := mux.Handler(r)
    373 		rr := httptest.NewRecorder()
    374 		h.ServeHTTP(rr, r)
    375 		if pattern != tt.pattern || rr.Code != tt.code {
    376 			t.Errorf("%s %s %s = %d, %q, want %d, %q", tt.method, tt.host, tt.path, rr.Code, pattern, tt.code, tt.pattern)
    377 		}
    378 	}
    379 }
    380 
    381 var serveMuxTests2 = []struct {
    382 	method  string
    383 	host    string
    384 	url     string
    385 	code    int
    386 	redirOk bool
    387 }{
    388 	{"GET", "google.com", "/", 404, false},
    389 	{"GET", "example.com", "/test/?example.com/test/", 200, false},
    390 	{"GET", "example.com", "test/?example.com/test/", 200, true},
    391 }
    392 
    393 // TestServeMuxHandlerRedirects tests that automatic redirects generated by
    394 // mux.Handler() shouldn't clear the request's query string.
    395 func TestServeMuxHandlerRedirects(t *testing.T) {
    396 	setParallel(t)
    397 	mux := NewServeMux()
    398 	for _, e := range serveMuxRegister {
    399 		mux.Handle(e.pattern, e.h)
    400 	}
    401 
    402 	for _, tt := range serveMuxTests2 {
    403 		tries := 1 // expect at most 1 redirection if redirOk is true.
    404 		turl := tt.url
    405 		for {
    406 			u, e := url.Parse(turl)
    407 			if e != nil {
    408 				t.Fatal(e)
    409 			}
    410 			r := &Request{
    411 				Method: tt.method,
    412 				Host:   tt.host,
    413 				URL:    u,
    414 			}
    415 			h, _ := mux.Handler(r)
    416 			rr := httptest.NewRecorder()
    417 			h.ServeHTTP(rr, r)
    418 			if rr.Code != 301 {
    419 				if rr.Code != tt.code {
    420 					t.Errorf("%s %s %s = %d, want %d", tt.method, tt.host, tt.url, rr.Code, tt.code)
    421 				}
    422 				break
    423 			}
    424 			if !tt.redirOk {
    425 				t.Errorf("%s %s %s, unexpected redirect", tt.method, tt.host, tt.url)
    426 				break
    427 			}
    428 			turl = rr.HeaderMap.Get("Location")
    429 			tries--
    430 		}
    431 		if tries < 0 {
    432 			t.Errorf("%s %s %s, too many redirects", tt.method, tt.host, tt.url)
    433 		}
    434 	}
    435 }
    436 
    437 // Tests for https://golang.org/issue/900
    438 func TestMuxRedirectLeadingSlashes(t *testing.T) {
    439 	setParallel(t)
    440 	paths := []string{"//foo.txt", "///foo.txt", "/../../foo.txt"}
    441 	for _, path := range paths {
    442 		req, err := ReadRequest(bufio.NewReader(strings.NewReader("GET " + path + " HTTP/1.1\r\nHost: test\r\n\r\n")))
    443 		if err != nil {
    444 			t.Errorf("%s", err)
    445 		}
    446 		mux := NewServeMux()
    447 		resp := httptest.NewRecorder()
    448 
    449 		mux.ServeHTTP(resp, req)
    450 
    451 		if loc, expected := resp.Header().Get("Location"), "/foo.txt"; loc != expected {
    452 			t.Errorf("Expected Location header set to %q; got %q", expected, loc)
    453 			return
    454 		}
    455 
    456 		if code, expected := resp.Code, StatusMovedPermanently; code != expected {
    457 			t.Errorf("Expected response code of StatusMovedPermanently; got %d", code)
    458 			return
    459 		}
    460 	}
    461 }
    462 
    463 func TestServerTimeouts(t *testing.T) {
    464 	setParallel(t)
    465 	defer afterTest(t)
    466 	reqNum := 0
    467 	ts := httptest.NewUnstartedServer(HandlerFunc(func(res ResponseWriter, req *Request) {
    468 		reqNum++
    469 		fmt.Fprintf(res, "req=%d", reqNum)
    470 	}))
    471 	ts.Config.ReadTimeout = 250 * time.Millisecond
    472 	ts.Config.WriteTimeout = 250 * time.Millisecond
    473 	ts.Start()
    474 	defer ts.Close()
    475 
    476 	// Hit the HTTP server successfully.
    477 	tr := &Transport{DisableKeepAlives: true} // they interfere with this test
    478 	defer tr.CloseIdleConnections()
    479 	c := &Client{Transport: tr}
    480 	r, err := c.Get(ts.URL)
    481 	if err != nil {
    482 		t.Fatalf("http Get #1: %v", err)
    483 	}
    484 	got, err := ioutil.ReadAll(r.Body)
    485 	expected := "req=1"
    486 	if string(got) != expected || err != nil {
    487 		t.Errorf("Unexpected response for request #1; got %q ,%v; expected %q, nil",
    488 			string(got), err, expected)
    489 	}
    490 
    491 	// Slow client that should timeout.
    492 	t1 := time.Now()
    493 	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
    494 	if err != nil {
    495 		t.Fatalf("Dial: %v", err)
    496 	}
    497 	buf := make([]byte, 1)
    498 	n, err := conn.Read(buf)
    499 	conn.Close()
    500 	latency := time.Since(t1)
    501 	if n != 0 || err != io.EOF {
    502 		t.Errorf("Read = %v, %v, wanted %v, %v", n, err, 0, io.EOF)
    503 	}
    504 	if latency < 200*time.Millisecond /* fudge from 250 ms above */ {
    505 		t.Errorf("got EOF after %s, want >= %s", latency, 200*time.Millisecond)
    506 	}
    507 
    508 	// Hit the HTTP server successfully again, verifying that the
    509 	// previous slow connection didn't run our handler.  (that we
    510 	// get "req=2", not "req=3")
    511 	r, err = c.Get(ts.URL)
    512 	if err != nil {
    513 		t.Fatalf("http Get #2: %v", err)
    514 	}
    515 	got, err = ioutil.ReadAll(r.Body)
    516 	expected = "req=2"
    517 	if string(got) != expected || err != nil {
    518 		t.Errorf("Get #2 got %q, %v, want %q, nil", string(got), err, expected)
    519 	}
    520 
    521 	if !testing.Short() {
    522 		conn, err := net.Dial("tcp", ts.Listener.Addr().String())
    523 		if err != nil {
    524 			t.Fatalf("Dial: %v", err)
    525 		}
    526 		defer conn.Close()
    527 		go io.Copy(ioutil.Discard, conn)
    528 		for i := 0; i < 5; i++ {
    529 			_, err := conn.Write([]byte("GET / HTTP/1.1\r\nHost: foo\r\n\r\n"))
    530 			if err != nil {
    531 				t.Fatalf("on write %d: %v", i, err)
    532 			}
    533 			time.Sleep(ts.Config.ReadTimeout / 2)
    534 		}
    535 	}
    536 }
    537 
    538 // Test that the HTTP/2 server handles Server.WriteTimeout (Issue 18437)
    539 func TestHTTP2WriteDeadlineExtendedOnNewRequest(t *testing.T) {
    540 	if testing.Short() {
    541 		t.Skip("skipping in short mode")
    542 	}
    543 	setParallel(t)
    544 	defer afterTest(t)
    545 	ts := httptest.NewUnstartedServer(HandlerFunc(func(res ResponseWriter, req *Request) {}))
    546 	ts.Config.WriteTimeout = 250 * time.Millisecond
    547 	ts.TLS = &tls.Config{NextProtos: []string{"h2"}}
    548 	ts.StartTLS()
    549 	defer ts.Close()
    550 
    551 	tr := newTLSTransport(t, ts)
    552 	defer tr.CloseIdleConnections()
    553 	if err := ExportHttp2ConfigureTransport(tr); err != nil {
    554 		t.Fatal(err)
    555 	}
    556 	c := &Client{Transport: tr}
    557 
    558 	for i := 1; i <= 3; i++ {
    559 		req, err := NewRequest("GET", ts.URL, nil)
    560 		if err != nil {
    561 			t.Fatal(err)
    562 		}
    563 
    564 		// fail test if no response after 1 second
    565 		ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
    566 		defer cancel()
    567 		req = req.WithContext(ctx)
    568 
    569 		r, err := c.Do(req)
    570 		select {
    571 		case <-ctx.Done():
    572 			if ctx.Err() == context.DeadlineExceeded {
    573 				t.Fatalf("http2 Get #%d response timed out", i)
    574 			}
    575 		default:
    576 		}
    577 		if err != nil {
    578 			t.Fatalf("http2 Get #%d: %v", i, err)
    579 		}
    580 		r.Body.Close()
    581 		if r.ProtoMajor != 2 {
    582 			t.Fatalf("http2 Get expected HTTP/2.0, got %q", r.Proto)
    583 		}
    584 		time.Sleep(ts.Config.WriteTimeout / 2)
    585 	}
    586 }
    587 
    588 // golang.org/issue/4741 -- setting only a write timeout that triggers
    589 // shouldn't cause a handler to block forever on reads (next HTTP
    590 // request) that will never happen.
    591 func TestOnlyWriteTimeout(t *testing.T) {
    592 	setParallel(t)
    593 	defer afterTest(t)
    594 	var conn net.Conn
    595 	var afterTimeoutErrc = make(chan error, 1)
    596 	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, req *Request) {
    597 		buf := make([]byte, 512<<10)
    598 		_, err := w.Write(buf)
    599 		if err != nil {
    600 			t.Errorf("handler Write error: %v", err)
    601 			return
    602 		}
    603 		conn.SetWriteDeadline(time.Now().Add(-30 * time.Second))
    604 		_, err = w.Write(buf)
    605 		afterTimeoutErrc <- err
    606 	}))
    607 	ts.Listener = trackLastConnListener{ts.Listener, &conn}
    608 	ts.Start()
    609 	defer ts.Close()
    610 
    611 	tr := &Transport{DisableKeepAlives: false}
    612 	defer tr.CloseIdleConnections()
    613 	c := &Client{Transport: tr}
    614 
    615 	errc := make(chan error)
    616 	go func() {
    617 		res, err := c.Get(ts.URL)
    618 		if err != nil {
    619 			errc <- err
    620 			return
    621 		}
    622 		_, err = io.Copy(ioutil.Discard, res.Body)
    623 		errc <- err
    624 	}()
    625 	select {
    626 	case err := <-errc:
    627 		if err == nil {
    628 			t.Errorf("expected an error from Get request")
    629 		}
    630 	case <-time.After(5 * time.Second):
    631 		t.Fatal("timeout waiting for Get error")
    632 	}
    633 	if err := <-afterTimeoutErrc; err == nil {
    634 		t.Error("expected write error after timeout")
    635 	}
    636 }
    637 
    638 // trackLastConnListener tracks the last net.Conn that was accepted.
    639 type trackLastConnListener struct {
    640 	net.Listener
    641 	last *net.Conn // destination
    642 }
    643 
    644 func (l trackLastConnListener) Accept() (c net.Conn, err error) {
    645 	c, err = l.Listener.Accept()
    646 	*l.last = c
    647 	return
    648 }
    649 
    650 // TestIdentityResponse verifies that a handler can unset
    651 func TestIdentityResponse(t *testing.T) {
    652 	setParallel(t)
    653 	defer afterTest(t)
    654 	handler := HandlerFunc(func(rw ResponseWriter, req *Request) {
    655 		rw.Header().Set("Content-Length", "3")
    656 		rw.Header().Set("Transfer-Encoding", req.FormValue("te"))
    657 		switch {
    658 		case req.FormValue("overwrite") == "1":
    659 			_, err := rw.Write([]byte("foo TOO LONG"))
    660 			if err != ErrContentLength {
    661 				t.Errorf("expected ErrContentLength; got %v", err)
    662 			}
    663 		case req.FormValue("underwrite") == "1":
    664 			rw.Header().Set("Content-Length", "500")
    665 			rw.Write([]byte("too short"))
    666 		default:
    667 			rw.Write([]byte("foo"))
    668 		}
    669 	})
    670 
    671 	ts := httptest.NewServer(handler)
    672 	defer ts.Close()
    673 
    674 	c := &Client{Transport: new(Transport)}
    675 	defer closeClient(c)
    676 
    677 	// Note: this relies on the assumption (which is true) that
    678 	// Get sends HTTP/1.1 or greater requests. Otherwise the
    679 	// server wouldn't have the choice to send back chunked
    680 	// responses.
    681 	for _, te := range []string{"", "identity"} {
    682 		url := ts.URL + "/?te=" + te
    683 		res, err := c.Get(url)
    684 		if err != nil {
    685 			t.Fatalf("error with Get of %s: %v", url, err)
    686 		}
    687 		if cl, expected := res.ContentLength, int64(3); cl != expected {
    688 			t.Errorf("for %s expected res.ContentLength of %d; got %d", url, expected, cl)
    689 		}
    690 		if cl, expected := res.Header.Get("Content-Length"), "3"; cl != expected {
    691 			t.Errorf("for %s expected Content-Length header of %q; got %q", url, expected, cl)
    692 		}
    693 		if tl, expected := len(res.TransferEncoding), 0; tl != expected {
    694 			t.Errorf("for %s expected len(res.TransferEncoding) of %d; got %d (%v)",
    695 				url, expected, tl, res.TransferEncoding)
    696 		}
    697 		res.Body.Close()
    698 	}
    699 
    700 	// Verify that ErrContentLength is returned
    701 	url := ts.URL + "/?overwrite=1"
    702 	res, err := c.Get(url)
    703 	if err != nil {
    704 		t.Fatalf("error with Get of %s: %v", url, err)
    705 	}
    706 	res.Body.Close()
    707 
    708 	// Verify that the connection is closed when the declared Content-Length
    709 	// is larger than what the handler wrote.
    710 	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
    711 	if err != nil {
    712 		t.Fatalf("error dialing: %v", err)
    713 	}
    714 	_, err = conn.Write([]byte("GET /?underwrite=1 HTTP/1.1\r\nHost: foo\r\n\r\n"))
    715 	if err != nil {
    716 		t.Fatalf("error writing: %v", err)
    717 	}
    718 
    719 	// The ReadAll will hang for a failing test, so use a Timer to
    720 	// fail explicitly.
    721 	goTimeout(t, 2*time.Second, func() {
    722 		got, _ := ioutil.ReadAll(conn)
    723 		expectedSuffix := "\r\n\r\ntoo short"
    724 		if !strings.HasSuffix(string(got), expectedSuffix) {
    725 			t.Errorf("Expected output to end with %q; got response body %q",
    726 				expectedSuffix, string(got))
    727 		}
    728 	})
    729 }
    730 
    731 func testTCPConnectionCloses(t *testing.T, req string, h Handler) {
    732 	setParallel(t)
    733 	defer afterTest(t)
    734 	s := httptest.NewServer(h)
    735 	defer s.Close()
    736 
    737 	conn, err := net.Dial("tcp", s.Listener.Addr().String())
    738 	if err != nil {
    739 		t.Fatal("dial error:", err)
    740 	}
    741 	defer conn.Close()
    742 
    743 	_, err = fmt.Fprint(conn, req)
    744 	if err != nil {
    745 		t.Fatal("print error:", err)
    746 	}
    747 
    748 	r := bufio.NewReader(conn)
    749 	res, err := ReadResponse(r, &Request{Method: "GET"})
    750 	if err != nil {
    751 		t.Fatal("ReadResponse error:", err)
    752 	}
    753 
    754 	didReadAll := make(chan bool, 1)
    755 	go func() {
    756 		select {
    757 		case <-time.After(5 * time.Second):
    758 			t.Error("body not closed after 5s")
    759 			return
    760 		case <-didReadAll:
    761 		}
    762 	}()
    763 
    764 	_, err = ioutil.ReadAll(r)
    765 	if err != nil {
    766 		t.Fatal("read error:", err)
    767 	}
    768 	didReadAll <- true
    769 
    770 	if !res.Close {
    771 		t.Errorf("Response.Close = false; want true")
    772 	}
    773 }
    774 
    775 func testTCPConnectionStaysOpen(t *testing.T, req string, handler Handler) {
    776 	setParallel(t)
    777 	defer afterTest(t)
    778 	ts := httptest.NewServer(handler)
    779 	defer ts.Close()
    780 	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
    781 	if err != nil {
    782 		t.Fatal(err)
    783 	}
    784 	defer conn.Close()
    785 	br := bufio.NewReader(conn)
    786 	for i := 0; i < 2; i++ {
    787 		if _, err := io.WriteString(conn, req); err != nil {
    788 			t.Fatal(err)
    789 		}
    790 		res, err := ReadResponse(br, nil)
    791 		if err != nil {
    792 			t.Fatalf("res %d: %v", i+1, err)
    793 		}
    794 		if _, err := io.Copy(ioutil.Discard, res.Body); err != nil {
    795 			t.Fatalf("res %d body copy: %v", i+1, err)
    796 		}
    797 		res.Body.Close()
    798 	}
    799 }
    800 
    801 // TestServeHTTP10Close verifies that HTTP/1.0 requests won't be kept alive.
    802 func TestServeHTTP10Close(t *testing.T) {
    803 	testTCPConnectionCloses(t, "GET / HTTP/1.0\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
    804 		ServeFile(w, r, "testdata/file")
    805 	}))
    806 }
    807 
    808 // TestClientCanClose verifies that clients can also force a connection to close.
    809 func TestClientCanClose(t *testing.T) {
    810 	testTCPConnectionCloses(t, "GET / HTTP/1.1\r\nHost: foo\r\nConnection: close\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
    811 		// Nothing.
    812 	}))
    813 }
    814 
    815 // TestHandlersCanSetConnectionClose verifies that handlers can force a connection to close,
    816 // even for HTTP/1.1 requests.
    817 func TestHandlersCanSetConnectionClose11(t *testing.T) {
    818 	testTCPConnectionCloses(t, "GET / HTTP/1.1\r\nHost: foo\r\n\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
    819 		w.Header().Set("Connection", "close")
    820 	}))
    821 }
    822 
    823 func TestHandlersCanSetConnectionClose10(t *testing.T) {
    824 	testTCPConnectionCloses(t, "GET / HTTP/1.0\r\nConnection: keep-alive\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
    825 		w.Header().Set("Connection", "close")
    826 	}))
    827 }
    828 
    829 func TestHTTP2UpgradeClosesConnection(t *testing.T) {
    830 	testTCPConnectionCloses(t, "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
    831 		// Nothing. (if not hijacked, the server should close the connection
    832 		// afterwards)
    833 	}))
    834 }
    835 
    836 func send204(w ResponseWriter, r *Request) { w.WriteHeader(204) }
    837 func send304(w ResponseWriter, r *Request) { w.WriteHeader(304) }
    838 
    839 // Issue 15647: 204 responses can't have bodies, so HTTP/1.0 keep-alive conns should stay open.
    840 func TestHTTP10KeepAlive204Response(t *testing.T) {
    841 	testTCPConnectionStaysOpen(t, "GET / HTTP/1.0\r\nConnection: keep-alive\r\n\r\n", HandlerFunc(send204))
    842 }
    843 
    844 func TestHTTP11KeepAlive204Response(t *testing.T) {
    845 	testTCPConnectionStaysOpen(t, "GET / HTTP/1.1\r\nHost: foo\r\n\r\n", HandlerFunc(send204))
    846 }
    847 
    848 func TestHTTP10KeepAlive304Response(t *testing.T) {
    849 	testTCPConnectionStaysOpen(t,
    850 		"GET / HTTP/1.0\r\nConnection: keep-alive\r\nIf-Modified-Since: Mon, 02 Jan 2006 15:04:05 GMT\r\n\r\n",
    851 		HandlerFunc(send304))
    852 }
    853 
    854 // Issue 15703
    855 func TestKeepAliveFinalChunkWithEOF(t *testing.T) {
    856 	setParallel(t)
    857 	defer afterTest(t)
    858 	cst := newClientServerTest(t, false /* h1 */, HandlerFunc(func(w ResponseWriter, r *Request) {
    859 		w.(Flusher).Flush() // force chunked encoding
    860 		w.Write([]byte("{\"Addr\": \"" + r.RemoteAddr + "\"}"))
    861 	}))
    862 	defer cst.close()
    863 	type data struct {
    864 		Addr string
    865 	}
    866 	var addrs [2]data
    867 	for i := range addrs {
    868 		res, err := cst.c.Get(cst.ts.URL)
    869 		if err != nil {
    870 			t.Fatal(err)
    871 		}
    872 		if err := json.NewDecoder(res.Body).Decode(&addrs[i]); err != nil {
    873 			t.Fatal(err)
    874 		}
    875 		if addrs[i].Addr == "" {
    876 			t.Fatal("no address")
    877 		}
    878 		res.Body.Close()
    879 	}
    880 	if addrs[0] != addrs[1] {
    881 		t.Fatalf("connection not reused")
    882 	}
    883 }
    884 
    885 func TestSetsRemoteAddr_h1(t *testing.T) { testSetsRemoteAddr(t, h1Mode) }
    886 func TestSetsRemoteAddr_h2(t *testing.T) { testSetsRemoteAddr(t, h2Mode) }
    887 
    888 func testSetsRemoteAddr(t *testing.T, h2 bool) {
    889 	setParallel(t)
    890 	defer afterTest(t)
    891 	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
    892 		fmt.Fprintf(w, "%s", r.RemoteAddr)
    893 	}))
    894 	defer cst.close()
    895 
    896 	res, err := cst.c.Get(cst.ts.URL)
    897 	if err != nil {
    898 		t.Fatalf("Get error: %v", err)
    899 	}
    900 	body, err := ioutil.ReadAll(res.Body)
    901 	if err != nil {
    902 		t.Fatalf("ReadAll error: %v", err)
    903 	}
    904 	ip := string(body)
    905 	if !strings.HasPrefix(ip, "127.0.0.1:") && !strings.HasPrefix(ip, "[::1]:") {
    906 		t.Fatalf("Expected local addr; got %q", ip)
    907 	}
    908 }
    909 
    910 type blockingRemoteAddrListener struct {
    911 	net.Listener
    912 	conns chan<- net.Conn
    913 }
    914 
    915 func (l *blockingRemoteAddrListener) Accept() (net.Conn, error) {
    916 	c, err := l.Listener.Accept()
    917 	if err != nil {
    918 		return nil, err
    919 	}
    920 	brac := &blockingRemoteAddrConn{
    921 		Conn:  c,
    922 		addrs: make(chan net.Addr, 1),
    923 	}
    924 	l.conns <- brac
    925 	return brac, nil
    926 }
    927 
    928 type blockingRemoteAddrConn struct {
    929 	net.Conn
    930 	addrs chan net.Addr
    931 }
    932 
    933 func (c *blockingRemoteAddrConn) RemoteAddr() net.Addr {
    934 	return <-c.addrs
    935 }
    936 
    937 // Issue 12943
    938 func TestServerAllowsBlockingRemoteAddr(t *testing.T) {
    939 	setParallel(t)
    940 	defer afterTest(t)
    941 	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {
    942 		fmt.Fprintf(w, "RA:%s", r.RemoteAddr)
    943 	}))
    944 	conns := make(chan net.Conn)
    945 	ts.Listener = &blockingRemoteAddrListener{
    946 		Listener: ts.Listener,
    947 		conns:    conns,
    948 	}
    949 	ts.Start()
    950 	defer ts.Close()
    951 
    952 	tr := &Transport{DisableKeepAlives: true}
    953 	defer tr.CloseIdleConnections()
    954 	c := &Client{Transport: tr, Timeout: time.Second}
    955 
    956 	fetch := func(response chan string) {
    957 		resp, err := c.Get(ts.URL)
    958 		if err != nil {
    959 			t.Error(err)
    960 			response <- ""
    961 			return
    962 		}
    963 		defer resp.Body.Close()
    964 		body, err := ioutil.ReadAll(resp.Body)
    965 		if err != nil {
    966 			t.Error(err)
    967 			response <- ""
    968 			return
    969 		}
    970 		response <- string(body)
    971 	}
    972 
    973 	// Start a request. The server will block on getting conn.RemoteAddr.
    974 	response1c := make(chan string, 1)
    975 	go fetch(response1c)
    976 
    977 	// Wait for the server to accept it; grab the connection.
    978 	conn1 := <-conns
    979 
    980 	// Start another request and grab its connection
    981 	response2c := make(chan string, 1)
    982 	go fetch(response2c)
    983 	var conn2 net.Conn
    984 
    985 	select {
    986 	case conn2 = <-conns:
    987 	case <-time.After(time.Second):
    988 		t.Fatal("Second Accept didn't happen")
    989 	}
    990 
    991 	// Send a response on connection 2.
    992 	conn2.(*blockingRemoteAddrConn).addrs <- &net.TCPAddr{
    993 		IP: net.ParseIP("12.12.12.12"), Port: 12}
    994 
    995 	// ... and see it
    996 	response2 := <-response2c
    997 	if g, e := response2, "RA:12.12.12.12:12"; g != e {
    998 		t.Fatalf("response 2 addr = %q; want %q", g, e)
    999 	}
   1000 
   1001 	// Finish the first response.
   1002 	conn1.(*blockingRemoteAddrConn).addrs <- &net.TCPAddr{
   1003 		IP: net.ParseIP("21.21.21.21"), Port: 21}
   1004 
   1005 	// ... and see it
   1006 	response1 := <-response1c
   1007 	if g, e := response1, "RA:21.21.21.21:21"; g != e {
   1008 		t.Fatalf("response 1 addr = %q; want %q", g, e)
   1009 	}
   1010 }
   1011 
   1012 func TestIdentityResponseHeaders(t *testing.T) {
   1013 	// Not parallel; changes log output.
   1014 	defer afterTest(t)
   1015 	log.SetOutput(ioutil.Discard) // is noisy otherwise
   1016 	defer log.SetOutput(os.Stderr)
   1017 
   1018 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   1019 		w.Header().Set("Transfer-Encoding", "identity")
   1020 		w.(Flusher).Flush()
   1021 		fmt.Fprintf(w, "I am an identity response.")
   1022 	}))
   1023 	defer ts.Close()
   1024 
   1025 	c := &Client{Transport: new(Transport)}
   1026 	defer closeClient(c)
   1027 
   1028 	res, err := c.Get(ts.URL)
   1029 	if err != nil {
   1030 		t.Fatalf("Get error: %v", err)
   1031 	}
   1032 	defer res.Body.Close()
   1033 
   1034 	if g, e := res.TransferEncoding, []string(nil); !reflect.DeepEqual(g, e) {
   1035 		t.Errorf("expected TransferEncoding of %v; got %v", e, g)
   1036 	}
   1037 	if _, haveCL := res.Header["Content-Length"]; haveCL {
   1038 		t.Errorf("Unexpected Content-Length")
   1039 	}
   1040 	if !res.Close {
   1041 		t.Errorf("expected Connection: close; got %v", res.Close)
   1042 	}
   1043 }
   1044 
   1045 // TestHeadResponses verifies that all MIME type sniffing and Content-Length
   1046 // counting of GET requests also happens on HEAD requests.
   1047 func TestHeadResponses_h1(t *testing.T) { testHeadResponses(t, h1Mode) }
   1048 func TestHeadResponses_h2(t *testing.T) { testHeadResponses(t, h2Mode) }
   1049 
   1050 func testHeadResponses(t *testing.T, h2 bool) {
   1051 	setParallel(t)
   1052 	defer afterTest(t)
   1053 	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
   1054 		_, err := w.Write([]byte("<html>"))
   1055 		if err != nil {
   1056 			t.Errorf("ResponseWriter.Write: %v", err)
   1057 		}
   1058 
   1059 		// Also exercise the ReaderFrom path
   1060 		_, err = io.Copy(w, strings.NewReader("789a"))
   1061 		if err != nil {
   1062 			t.Errorf("Copy(ResponseWriter, ...): %v", err)
   1063 		}
   1064 	}))
   1065 	defer cst.close()
   1066 	res, err := cst.c.Head(cst.ts.URL)
   1067 	if err != nil {
   1068 		t.Error(err)
   1069 	}
   1070 	if len(res.TransferEncoding) > 0 {
   1071 		t.Errorf("expected no TransferEncoding; got %v", res.TransferEncoding)
   1072 	}
   1073 	if ct := res.Header.Get("Content-Type"); ct != "text/html; charset=utf-8" {
   1074 		t.Errorf("Content-Type: %q; want text/html; charset=utf-8", ct)
   1075 	}
   1076 	if v := res.ContentLength; v != 10 {
   1077 		t.Errorf("Content-Length: %d; want 10", v)
   1078 	}
   1079 	body, err := ioutil.ReadAll(res.Body)
   1080 	if err != nil {
   1081 		t.Error(err)
   1082 	}
   1083 	if len(body) > 0 {
   1084 		t.Errorf("got unexpected body %q", string(body))
   1085 	}
   1086 }
   1087 
   1088 func TestTLSHandshakeTimeout(t *testing.T) {
   1089 	setParallel(t)
   1090 	defer afterTest(t)
   1091 	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
   1092 	errc := make(chanWriter, 10) // but only expecting 1
   1093 	ts.Config.ReadTimeout = 250 * time.Millisecond
   1094 	ts.Config.ErrorLog = log.New(errc, "", 0)
   1095 	ts.StartTLS()
   1096 	defer ts.Close()
   1097 	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
   1098 	if err != nil {
   1099 		t.Fatalf("Dial: %v", err)
   1100 	}
   1101 	defer conn.Close()
   1102 	goTimeout(t, 10*time.Second, func() {
   1103 		var buf [1]byte
   1104 		n, err := conn.Read(buf[:])
   1105 		if err == nil || n != 0 {
   1106 			t.Errorf("Read = %d, %v; want an error and no bytes", n, err)
   1107 		}
   1108 	})
   1109 	select {
   1110 	case v := <-errc:
   1111 		if !strings.Contains(v, "timeout") && !strings.Contains(v, "TLS handshake") {
   1112 			t.Errorf("expected a TLS handshake timeout error; got %q", v)
   1113 		}
   1114 	case <-time.After(5 * time.Second):
   1115 		t.Errorf("timeout waiting for logged error")
   1116 	}
   1117 }
   1118 
   1119 func TestTLSServer(t *testing.T) {
   1120 	setParallel(t)
   1121 	defer afterTest(t)
   1122 	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   1123 		if r.TLS != nil {
   1124 			w.Header().Set("X-TLS-Set", "true")
   1125 			if r.TLS.HandshakeComplete {
   1126 				w.Header().Set("X-TLS-HandshakeComplete", "true")
   1127 			}
   1128 		}
   1129 	}))
   1130 	ts.Config.ErrorLog = log.New(ioutil.Discard, "", 0)
   1131 	defer ts.Close()
   1132 
   1133 	// Connect an idle TCP connection to this server before we run
   1134 	// our real tests. This idle connection used to block forever
   1135 	// in the TLS handshake, preventing future connections from
   1136 	// being accepted. It may prevent future accidental blocking
   1137 	// in newConn.
   1138 	idleConn, err := net.Dial("tcp", ts.Listener.Addr().String())
   1139 	if err != nil {
   1140 		t.Fatalf("Dial: %v", err)
   1141 	}
   1142 	defer idleConn.Close()
   1143 	goTimeout(t, 10*time.Second, func() {
   1144 		if !strings.HasPrefix(ts.URL, "https://") {
   1145 			t.Errorf("expected test TLS server to start with https://, got %q", ts.URL)
   1146 			return
   1147 		}
   1148 		noVerifyTransport := &Transport{
   1149 			TLSClientConfig: &tls.Config{
   1150 				InsecureSkipVerify: true,
   1151 			},
   1152 		}
   1153 		client := &Client{Transport: noVerifyTransport}
   1154 		res, err := client.Get(ts.URL)
   1155 		if err != nil {
   1156 			t.Error(err)
   1157 			return
   1158 		}
   1159 		if res == nil {
   1160 			t.Errorf("got nil Response")
   1161 			return
   1162 		}
   1163 		defer res.Body.Close()
   1164 		if res.Header.Get("X-TLS-Set") != "true" {
   1165 			t.Errorf("expected X-TLS-Set response header")
   1166 			return
   1167 		}
   1168 		if res.Header.Get("X-TLS-HandshakeComplete") != "true" {
   1169 			t.Errorf("expected X-TLS-HandshakeComplete header")
   1170 		}
   1171 	})
   1172 }
   1173 
   1174 // Issue 15908
   1175 func TestAutomaticHTTP2_Serve_NoTLSConfig(t *testing.T) {
   1176 	testAutomaticHTTP2_Serve(t, nil, true)
   1177 }
   1178 
   1179 func TestAutomaticHTTP2_Serve_NonH2TLSConfig(t *testing.T) {
   1180 	testAutomaticHTTP2_Serve(t, &tls.Config{}, false)
   1181 }
   1182 
   1183 func TestAutomaticHTTP2_Serve_H2TLSConfig(t *testing.T) {
   1184 	testAutomaticHTTP2_Serve(t, &tls.Config{NextProtos: []string{"h2"}}, true)
   1185 }
   1186 
   1187 func testAutomaticHTTP2_Serve(t *testing.T, tlsConf *tls.Config, wantH2 bool) {
   1188 	setParallel(t)
   1189 	defer afterTest(t)
   1190 	ln := newLocalListener(t)
   1191 	ln.Close() // immediately (not a defer!)
   1192 	var s Server
   1193 	s.TLSConfig = tlsConf
   1194 	if err := s.Serve(ln); err == nil {
   1195 		t.Fatal("expected an error")
   1196 	}
   1197 	gotH2 := s.TLSNextProto["h2"] != nil
   1198 	if gotH2 != wantH2 {
   1199 		t.Errorf("http2 configured = %v; want %v", gotH2, wantH2)
   1200 	}
   1201 }
   1202 
   1203 func TestAutomaticHTTP2_Serve_WithTLSConfig(t *testing.T) {
   1204 	setParallel(t)
   1205 	defer afterTest(t)
   1206 	ln := newLocalListener(t)
   1207 	ln.Close() // immediately (not a defer!)
   1208 	var s Server
   1209 	// Set the TLSConfig. In reality, this would be the
   1210 	// *tls.Config given to tls.NewListener.
   1211 	s.TLSConfig = &tls.Config{
   1212 		NextProtos: []string{"h2"},
   1213 	}
   1214 	if err := s.Serve(ln); err == nil {
   1215 		t.Fatal("expected an error")
   1216 	}
   1217 	on := s.TLSNextProto["h2"] != nil
   1218 	if !on {
   1219 		t.Errorf("http2 wasn't automatically enabled")
   1220 	}
   1221 }
   1222 
   1223 func TestAutomaticHTTP2_ListenAndServe(t *testing.T) {
   1224 	cert, err := tls.X509KeyPair(internal.LocalhostCert, internal.LocalhostKey)
   1225 	if err != nil {
   1226 		t.Fatal(err)
   1227 	}
   1228 	testAutomaticHTTP2_ListenAndServe(t, &tls.Config{
   1229 		Certificates: []tls.Certificate{cert},
   1230 	})
   1231 }
   1232 
   1233 func TestAutomaticHTTP2_ListenAndServe_GetCertificate(t *testing.T) {
   1234 	cert, err := tls.X509KeyPair(internal.LocalhostCert, internal.LocalhostKey)
   1235 	if err != nil {
   1236 		t.Fatal(err)
   1237 	}
   1238 	testAutomaticHTTP2_ListenAndServe(t, &tls.Config{
   1239 		GetCertificate: func(clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) {
   1240 			return &cert, nil
   1241 		},
   1242 	})
   1243 }
   1244 
   1245 func testAutomaticHTTP2_ListenAndServe(t *testing.T, tlsConf *tls.Config) {
   1246 	// Not parallel: uses global test hooks.
   1247 	defer afterTest(t)
   1248 	defer SetTestHookServerServe(nil)
   1249 	var ok bool
   1250 	var s *Server
   1251 	const maxTries = 5
   1252 	var ln net.Listener
   1253 Try:
   1254 	for try := 0; try < maxTries; try++ {
   1255 		ln = newLocalListener(t)
   1256 		addr := ln.Addr().String()
   1257 		ln.Close()
   1258 		t.Logf("Got %v", addr)
   1259 		lnc := make(chan net.Listener, 1)
   1260 		SetTestHookServerServe(func(s *Server, ln net.Listener) {
   1261 			lnc <- ln
   1262 		})
   1263 		s = &Server{
   1264 			Addr:      addr,
   1265 			TLSConfig: tlsConf,
   1266 		}
   1267 		errc := make(chan error, 1)
   1268 		go func() { errc <- s.ListenAndServeTLS("", "") }()
   1269 		select {
   1270 		case err := <-errc:
   1271 			t.Logf("On try #%v: %v", try+1, err)
   1272 			continue
   1273 		case ln = <-lnc:
   1274 			ok = true
   1275 			t.Logf("Listening on %v", ln.Addr().String())
   1276 			break Try
   1277 		}
   1278 	}
   1279 	if !ok {
   1280 		t.Fatalf("Failed to start up after %d tries", maxTries)
   1281 	}
   1282 	defer ln.Close()
   1283 	c, err := tls.Dial("tcp", ln.Addr().String(), &tls.Config{
   1284 		InsecureSkipVerify: true,
   1285 		NextProtos:         []string{"h2", "http/1.1"},
   1286 	})
   1287 	if err != nil {
   1288 		t.Fatal(err)
   1289 	}
   1290 	defer c.Close()
   1291 	if got, want := c.ConnectionState().NegotiatedProtocol, "h2"; got != want {
   1292 		t.Errorf("NegotiatedProtocol = %q; want %q", got, want)
   1293 	}
   1294 	if got, want := c.ConnectionState().NegotiatedProtocolIsMutual, true; got != want {
   1295 		t.Errorf("NegotiatedProtocolIsMutual = %v; want %v", got, want)
   1296 	}
   1297 }
   1298 
   1299 type serverExpectTest struct {
   1300 	contentLength    int // of request body
   1301 	chunked          bool
   1302 	expectation      string // e.g. "100-continue"
   1303 	readBody         bool   // whether handler should read the body (if false, sends StatusUnauthorized)
   1304 	expectedResponse string // expected substring in first line of http response
   1305 }
   1306 
   1307 func expectTest(contentLength int, expectation string, readBody bool, expectedResponse string) serverExpectTest {
   1308 	return serverExpectTest{
   1309 		contentLength:    contentLength,
   1310 		expectation:      expectation,
   1311 		readBody:         readBody,
   1312 		expectedResponse: expectedResponse,
   1313 	}
   1314 }
   1315 
   1316 var serverExpectTests = []serverExpectTest{
   1317 	// Normal 100-continues, case-insensitive.
   1318 	expectTest(100, "100-continue", true, "100 Continue"),
   1319 	expectTest(100, "100-cOntInUE", true, "100 Continue"),
   1320 
   1321 	// No 100-continue.
   1322 	expectTest(100, "", true, "200 OK"),
   1323 
   1324 	// 100-continue but requesting client to deny us,
   1325 	// so it never reads the body.
   1326 	expectTest(100, "100-continue", false, "401 Unauthorized"),
   1327 	// Likewise without 100-continue:
   1328 	expectTest(100, "", false, "401 Unauthorized"),
   1329 
   1330 	// Non-standard expectations are failures
   1331 	expectTest(0, "a-pony", false, "417 Expectation Failed"),
   1332 
   1333 	// Expect-100 requested but no body (is apparently okay: Issue 7625)
   1334 	expectTest(0, "100-continue", true, "200 OK"),
   1335 	// Expect-100 requested but handler doesn't read the body
   1336 	expectTest(0, "100-continue", false, "401 Unauthorized"),
   1337 	// Expect-100 continue with no body, but a chunked body.
   1338 	{
   1339 		expectation:      "100-continue",
   1340 		readBody:         true,
   1341 		chunked:          true,
   1342 		expectedResponse: "100 Continue",
   1343 	},
   1344 }
   1345 
   1346 // Tests that the server responds to the "Expect" request header
   1347 // correctly.
   1348 // http2 test: TestServer_Response_Automatic100Continue
   1349 func TestServerExpect(t *testing.T) {
   1350 	setParallel(t)
   1351 	defer afterTest(t)
   1352 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   1353 		// Note using r.FormValue("readbody") because for POST
   1354 		// requests that would read from r.Body, which we only
   1355 		// conditionally want to do.
   1356 		if strings.Contains(r.URL.RawQuery, "readbody=true") {
   1357 			ioutil.ReadAll(r.Body)
   1358 			w.Write([]byte("Hi"))
   1359 		} else {
   1360 			w.WriteHeader(StatusUnauthorized)
   1361 		}
   1362 	}))
   1363 	defer ts.Close()
   1364 
   1365 	runTest := func(test serverExpectTest) {
   1366 		conn, err := net.Dial("tcp", ts.Listener.Addr().String())
   1367 		if err != nil {
   1368 			t.Fatalf("Dial: %v", err)
   1369 		}
   1370 		defer conn.Close()
   1371 
   1372 		// Only send the body immediately if we're acting like an HTTP client
   1373 		// that doesn't send 100-continue expectations.
   1374 		writeBody := test.contentLength != 0 && strings.ToLower(test.expectation) != "100-continue"
   1375 
   1376 		go func() {
   1377 			contentLen := fmt.Sprintf("Content-Length: %d", test.contentLength)
   1378 			if test.chunked {
   1379 				contentLen = "Transfer-Encoding: chunked"
   1380 			}
   1381 			_, err := fmt.Fprintf(conn, "POST /?readbody=%v HTTP/1.1\r\n"+
   1382 				"Connection: close\r\n"+
   1383 				"%s\r\n"+
   1384 				"Expect: %s\r\nHost: foo\r\n\r\n",
   1385 				test.readBody, contentLen, test.expectation)
   1386 			if err != nil {
   1387 				t.Errorf("On test %#v, error writing request headers: %v", test, err)
   1388 				return
   1389 			}
   1390 			if writeBody {
   1391 				var targ io.WriteCloser = struct {
   1392 					io.Writer
   1393 					io.Closer
   1394 				}{
   1395 					conn,
   1396 					ioutil.NopCloser(nil),
   1397 				}
   1398 				if test.chunked {
   1399 					targ = httputil.NewChunkedWriter(conn)
   1400 				}
   1401 				body := strings.Repeat("A", test.contentLength)
   1402 				_, err = fmt.Fprint(targ, body)
   1403 				if err == nil {
   1404 					err = targ.Close()
   1405 				}
   1406 				if err != nil {
   1407 					if !test.readBody {
   1408 						// Server likely already hung up on us.
   1409 						// See larger comment below.
   1410 						t.Logf("On test %#v, acceptable error writing request body: %v", test, err)
   1411 						return
   1412 					}
   1413 					t.Errorf("On test %#v, error writing request body: %v", test, err)
   1414 				}
   1415 			}
   1416 		}()
   1417 		bufr := bufio.NewReader(conn)
   1418 		line, err := bufr.ReadString('\n')
   1419 		if err != nil {
   1420 			if writeBody && !test.readBody {
   1421 				// This is an acceptable failure due to a possible TCP race:
   1422 				// We were still writing data and the server hung up on us. A TCP
   1423 				// implementation may send a RST if our request body data was known
   1424 				// to be lost, which may trigger our reads to fail.
   1425 				// See RFC 1122 page 88.
   1426 				t.Logf("On test %#v, acceptable error from ReadString: %v", test, err)
   1427 				return
   1428 			}
   1429 			t.Fatalf("On test %#v, ReadString: %v", test, err)
   1430 		}
   1431 		if !strings.Contains(line, test.expectedResponse) {
   1432 			t.Errorf("On test %#v, got first line = %q; want %q", test, line, test.expectedResponse)
   1433 		}
   1434 	}
   1435 
   1436 	for _, test := range serverExpectTests {
   1437 		runTest(test)
   1438 	}
   1439 }
   1440 
   1441 // Under a ~256KB (maxPostHandlerReadBytes) threshold, the server
   1442 // should consume client request bodies that a handler didn't read.
   1443 func TestServerUnreadRequestBodyLittle(t *testing.T) {
   1444 	setParallel(t)
   1445 	defer afterTest(t)
   1446 	conn := new(testConn)
   1447 	body := strings.Repeat("x", 100<<10)
   1448 	conn.readBuf.Write([]byte(fmt.Sprintf(
   1449 		"POST / HTTP/1.1\r\n"+
   1450 			"Host: test\r\n"+
   1451 			"Content-Length: %d\r\n"+
   1452 			"\r\n", len(body))))
   1453 	conn.readBuf.Write([]byte(body))
   1454 
   1455 	done := make(chan bool)
   1456 
   1457 	readBufLen := func() int {
   1458 		conn.readMu.Lock()
   1459 		defer conn.readMu.Unlock()
   1460 		return conn.readBuf.Len()
   1461 	}
   1462 
   1463 	ls := &oneConnListener{conn}
   1464 	go Serve(ls, HandlerFunc(func(rw ResponseWriter, req *Request) {
   1465 		defer close(done)
   1466 		if bufLen := readBufLen(); bufLen < len(body)/2 {
   1467 			t.Errorf("on request, read buffer length is %d; expected about 100 KB", bufLen)
   1468 		}
   1469 		rw.WriteHeader(200)
   1470 		rw.(Flusher).Flush()
   1471 		if g, e := readBufLen(), 0; g != e {
   1472 			t.Errorf("after WriteHeader, read buffer length is %d; want %d", g, e)
   1473 		}
   1474 		if c := rw.Header().Get("Connection"); c != "" {
   1475 			t.Errorf(`Connection header = %q; want ""`, c)
   1476 		}
   1477 	}))
   1478 	<-done
   1479 }
   1480 
   1481 // Over a ~256KB (maxPostHandlerReadBytes) threshold, the server
   1482 // should ignore client request bodies that a handler didn't read
   1483 // and close the connection.
   1484 func TestServerUnreadRequestBodyLarge(t *testing.T) {
   1485 	setParallel(t)
   1486 	if testing.Short() && testenv.Builder() == "" {
   1487 		t.Log("skipping in short mode")
   1488 	}
   1489 	conn := new(testConn)
   1490 	body := strings.Repeat("x", 1<<20)
   1491 	conn.readBuf.Write([]byte(fmt.Sprintf(
   1492 		"POST / HTTP/1.1\r\n"+
   1493 			"Host: test\r\n"+
   1494 			"Content-Length: %d\r\n"+
   1495 			"\r\n", len(body))))
   1496 	conn.readBuf.Write([]byte(body))
   1497 	conn.closec = make(chan bool, 1)
   1498 
   1499 	ls := &oneConnListener{conn}
   1500 	go Serve(ls, HandlerFunc(func(rw ResponseWriter, req *Request) {
   1501 		if conn.readBuf.Len() < len(body)/2 {
   1502 			t.Errorf("on request, read buffer length is %d; expected about 1MB", conn.readBuf.Len())
   1503 		}
   1504 		rw.WriteHeader(200)
   1505 		rw.(Flusher).Flush()
   1506 		if conn.readBuf.Len() < len(body)/2 {
   1507 			t.Errorf("post-WriteHeader, read buffer length is %d; expected about 1MB", conn.readBuf.Len())
   1508 		}
   1509 	}))
   1510 	<-conn.closec
   1511 
   1512 	if res := conn.writeBuf.String(); !strings.Contains(res, "Connection: close") {
   1513 		t.Errorf("Expected a Connection: close header; got response: %s", res)
   1514 	}
   1515 }
   1516 
   1517 type handlerBodyCloseTest struct {
   1518 	bodySize     int
   1519 	bodyChunked  bool
   1520 	reqConnClose bool
   1521 
   1522 	wantEOFSearch bool // should Handler's Body.Close do Reads, looking for EOF?
   1523 	wantNextReq   bool // should it find the next request on the same conn?
   1524 }
   1525 
   1526 func (t handlerBodyCloseTest) connectionHeader() string {
   1527 	if t.reqConnClose {
   1528 		return "Connection: close\r\n"
   1529 	}
   1530 	return ""
   1531 }
   1532 
   1533 var handlerBodyCloseTests = [...]handlerBodyCloseTest{
   1534 	// Small enough to slurp past to the next request +
   1535 	// has Content-Length.
   1536 	0: {
   1537 		bodySize:      20 << 10,
   1538 		bodyChunked:   false,
   1539 		reqConnClose:  false,
   1540 		wantEOFSearch: true,
   1541 		wantNextReq:   true,
   1542 	},
   1543 
   1544 	// Small enough to slurp past to the next request +
   1545 	// is chunked.
   1546 	1: {
   1547 		bodySize:      20 << 10,
   1548 		bodyChunked:   true,
   1549 		reqConnClose:  false,
   1550 		wantEOFSearch: true,
   1551 		wantNextReq:   true,
   1552 	},
   1553 
   1554 	// Small enough to slurp past to the next request +
   1555 	// has Content-Length +
   1556 	// declares Connection: close (so pointless to read more).
   1557 	2: {
   1558 		bodySize:      20 << 10,
   1559 		bodyChunked:   false,
   1560 		reqConnClose:  true,
   1561 		wantEOFSearch: false,
   1562 		wantNextReq:   false,
   1563 	},
   1564 
   1565 	// Small enough to slurp past to the next request +
   1566 	// declares Connection: close,
   1567 	// but chunked, so it might have trailers.
   1568 	// TODO: maybe skip this search if no trailers were declared
   1569 	// in the headers.
   1570 	3: {
   1571 		bodySize:      20 << 10,
   1572 		bodyChunked:   true,
   1573 		reqConnClose:  true,
   1574 		wantEOFSearch: true,
   1575 		wantNextReq:   false,
   1576 	},
   1577 
   1578 	// Big with Content-Length, so give up immediately if we know it's too big.
   1579 	4: {
   1580 		bodySize:      1 << 20,
   1581 		bodyChunked:   false, // has a Content-Length
   1582 		reqConnClose:  false,
   1583 		wantEOFSearch: false,
   1584 		wantNextReq:   false,
   1585 	},
   1586 
   1587 	// Big chunked, so read a bit before giving up.
   1588 	5: {
   1589 		bodySize:      1 << 20,
   1590 		bodyChunked:   true,
   1591 		reqConnClose:  false,
   1592 		wantEOFSearch: true,
   1593 		wantNextReq:   false,
   1594 	},
   1595 
   1596 	// Big with Connection: close, but chunked, so search for trailers.
   1597 	// TODO: maybe skip this search if no trailers were declared
   1598 	// in the headers.
   1599 	6: {
   1600 		bodySize:      1 << 20,
   1601 		bodyChunked:   true,
   1602 		reqConnClose:  true,
   1603 		wantEOFSearch: true,
   1604 		wantNextReq:   false,
   1605 	},
   1606 
   1607 	// Big with Connection: close, so don't do any reads on Close.
   1608 	// With Content-Length.
   1609 	7: {
   1610 		bodySize:      1 << 20,
   1611 		bodyChunked:   false,
   1612 		reqConnClose:  true,
   1613 		wantEOFSearch: false,
   1614 		wantNextReq:   false,
   1615 	},
   1616 }
   1617 
   1618 func TestHandlerBodyClose(t *testing.T) {
   1619 	setParallel(t)
   1620 	if testing.Short() && testenv.Builder() == "" {
   1621 		t.Skip("skipping in -short mode")
   1622 	}
   1623 	for i, tt := range handlerBodyCloseTests {
   1624 		testHandlerBodyClose(t, i, tt)
   1625 	}
   1626 }
   1627 
   1628 func testHandlerBodyClose(t *testing.T, i int, tt handlerBodyCloseTest) {
   1629 	conn := new(testConn)
   1630 	body := strings.Repeat("x", tt.bodySize)
   1631 	if tt.bodyChunked {
   1632 		conn.readBuf.WriteString("POST / HTTP/1.1\r\n" +
   1633 			"Host: test\r\n" +
   1634 			tt.connectionHeader() +
   1635 			"Transfer-Encoding: chunked\r\n" +
   1636 			"\r\n")
   1637 		cw := internal.NewChunkedWriter(&conn.readBuf)
   1638 		io.WriteString(cw, body)
   1639 		cw.Close()
   1640 		conn.readBuf.WriteString("\r\n")
   1641 	} else {
   1642 		conn.readBuf.Write([]byte(fmt.Sprintf(
   1643 			"POST / HTTP/1.1\r\n"+
   1644 				"Host: test\r\n"+
   1645 				tt.connectionHeader()+
   1646 				"Content-Length: %d\r\n"+
   1647 				"\r\n", len(body))))
   1648 		conn.readBuf.Write([]byte(body))
   1649 	}
   1650 	if !tt.reqConnClose {
   1651 		conn.readBuf.WriteString("GET / HTTP/1.1\r\nHost: test\r\n\r\n")
   1652 	}
   1653 	conn.closec = make(chan bool, 1)
   1654 
   1655 	readBufLen := func() int {
   1656 		conn.readMu.Lock()
   1657 		defer conn.readMu.Unlock()
   1658 		return conn.readBuf.Len()
   1659 	}
   1660 
   1661 	ls := &oneConnListener{conn}
   1662 	var numReqs int
   1663 	var size0, size1 int
   1664 	go Serve(ls, HandlerFunc(func(rw ResponseWriter, req *Request) {
   1665 		numReqs++
   1666 		if numReqs == 1 {
   1667 			size0 = readBufLen()
   1668 			req.Body.Close()
   1669 			size1 = readBufLen()
   1670 		}
   1671 	}))
   1672 	<-conn.closec
   1673 	if numReqs < 1 || numReqs > 2 {
   1674 		t.Fatalf("%d. bug in test. unexpected number of requests = %d", i, numReqs)
   1675 	}
   1676 	didSearch := size0 != size1
   1677 	if didSearch != tt.wantEOFSearch {
   1678 		t.Errorf("%d. did EOF search = %v; want %v (size went from %d to %d)", i, didSearch, !didSearch, size0, size1)
   1679 	}
   1680 	if tt.wantNextReq && numReqs != 2 {
   1681 		t.Errorf("%d. numReq = %d; want 2", i, numReqs)
   1682 	}
   1683 }
   1684 
   1685 // testHandlerBodyConsumer represents a function injected into a test handler to
   1686 // vary work done on a request Body.
   1687 type testHandlerBodyConsumer struct {
   1688 	name string
   1689 	f    func(io.ReadCloser)
   1690 }
   1691 
   1692 var testHandlerBodyConsumers = []testHandlerBodyConsumer{
   1693 	{"nil", func(io.ReadCloser) {}},
   1694 	{"close", func(r io.ReadCloser) { r.Close() }},
   1695 	{"discard", func(r io.ReadCloser) { io.Copy(ioutil.Discard, r) }},
   1696 }
   1697 
   1698 func TestRequestBodyReadErrorClosesConnection(t *testing.T) {
   1699 	setParallel(t)
   1700 	defer afterTest(t)
   1701 	for _, handler := range testHandlerBodyConsumers {
   1702 		conn := new(testConn)
   1703 		conn.readBuf.WriteString("POST /public HTTP/1.1\r\n" +
   1704 			"Host: test\r\n" +
   1705 			"Transfer-Encoding: chunked\r\n" +
   1706 			"\r\n" +
   1707 			"hax\r\n" + // Invalid chunked encoding
   1708 			"GET /secret HTTP/1.1\r\n" +
   1709 			"Host: test\r\n" +
   1710 			"\r\n")
   1711 
   1712 		conn.closec = make(chan bool, 1)
   1713 		ls := &oneConnListener{conn}
   1714 		var numReqs int
   1715 		go Serve(ls, HandlerFunc(func(_ ResponseWriter, req *Request) {
   1716 			numReqs++
   1717 			if strings.Contains(req.URL.Path, "secret") {
   1718 				t.Error("Request for /secret encountered, should not have happened.")
   1719 			}
   1720 			handler.f(req.Body)
   1721 		}))
   1722 		<-conn.closec
   1723 		if numReqs != 1 {
   1724 			t.Errorf("Handler %v: got %d reqs; want 1", handler.name, numReqs)
   1725 		}
   1726 	}
   1727 }
   1728 
   1729 func TestInvalidTrailerClosesConnection(t *testing.T) {
   1730 	setParallel(t)
   1731 	defer afterTest(t)
   1732 	for _, handler := range testHandlerBodyConsumers {
   1733 		conn := new(testConn)
   1734 		conn.readBuf.WriteString("POST /public HTTP/1.1\r\n" +
   1735 			"Host: test\r\n" +
   1736 			"Trailer: hack\r\n" +
   1737 			"Transfer-Encoding: chunked\r\n" +
   1738 			"\r\n" +
   1739 			"3\r\n" +
   1740 			"hax\r\n" +
   1741 			"0\r\n" +
   1742 			"I'm not a valid trailer\r\n" +
   1743 			"GET /secret HTTP/1.1\r\n" +
   1744 			"Host: test\r\n" +
   1745 			"\r\n")
   1746 
   1747 		conn.closec = make(chan bool, 1)
   1748 		ln := &oneConnListener{conn}
   1749 		var numReqs int
   1750 		go Serve(ln, HandlerFunc(func(_ ResponseWriter, req *Request) {
   1751 			numReqs++
   1752 			if strings.Contains(req.URL.Path, "secret") {
   1753 				t.Errorf("Handler %s, Request for /secret encountered, should not have happened.", handler.name)
   1754 			}
   1755 			handler.f(req.Body)
   1756 		}))
   1757 		<-conn.closec
   1758 		if numReqs != 1 {
   1759 			t.Errorf("Handler %s: got %d reqs; want 1", handler.name, numReqs)
   1760 		}
   1761 	}
   1762 }
   1763 
   1764 // slowTestConn is a net.Conn that provides a means to simulate parts of a
   1765 // request being received piecemeal. Deadlines can be set and enforced in both
   1766 // Read and Write.
   1767 type slowTestConn struct {
   1768 	// over multiple calls to Read, time.Durations are slept, strings are read.
   1769 	script []interface{}
   1770 	closec chan bool
   1771 
   1772 	mu     sync.Mutex // guards rd/wd
   1773 	rd, wd time.Time  // read, write deadline
   1774 	noopConn
   1775 }
   1776 
   1777 func (c *slowTestConn) SetDeadline(t time.Time) error {
   1778 	c.SetReadDeadline(t)
   1779 	c.SetWriteDeadline(t)
   1780 	return nil
   1781 }
   1782 
   1783 func (c *slowTestConn) SetReadDeadline(t time.Time) error {
   1784 	c.mu.Lock()
   1785 	defer c.mu.Unlock()
   1786 	c.rd = t
   1787 	return nil
   1788 }
   1789 
   1790 func (c *slowTestConn) SetWriteDeadline(t time.Time) error {
   1791 	c.mu.Lock()
   1792 	defer c.mu.Unlock()
   1793 	c.wd = t
   1794 	return nil
   1795 }
   1796 
   1797 func (c *slowTestConn) Read(b []byte) (n int, err error) {
   1798 	c.mu.Lock()
   1799 	defer c.mu.Unlock()
   1800 restart:
   1801 	if !c.rd.IsZero() && time.Now().After(c.rd) {
   1802 		return 0, syscall.ETIMEDOUT
   1803 	}
   1804 	if len(c.script) == 0 {
   1805 		return 0, io.EOF
   1806 	}
   1807 
   1808 	switch cue := c.script[0].(type) {
   1809 	case time.Duration:
   1810 		if !c.rd.IsZero() {
   1811 			// If the deadline falls in the middle of our sleep window, deduct
   1812 			// part of the sleep, then return a timeout.
   1813 			if remaining := time.Until(c.rd); remaining < cue {
   1814 				c.script[0] = cue - remaining
   1815 				time.Sleep(remaining)
   1816 				return 0, syscall.ETIMEDOUT
   1817 			}
   1818 		}
   1819 		c.script = c.script[1:]
   1820 		time.Sleep(cue)
   1821 		goto restart
   1822 
   1823 	case string:
   1824 		n = copy(b, cue)
   1825 		// If cue is too big for the buffer, leave the end for the next Read.
   1826 		if len(cue) > n {
   1827 			c.script[0] = cue[n:]
   1828 		} else {
   1829 			c.script = c.script[1:]
   1830 		}
   1831 
   1832 	default:
   1833 		panic("unknown cue in slowTestConn script")
   1834 	}
   1835 
   1836 	return
   1837 }
   1838 
   1839 func (c *slowTestConn) Close() error {
   1840 	select {
   1841 	case c.closec <- true:
   1842 	default:
   1843 	}
   1844 	return nil
   1845 }
   1846 
   1847 func (c *slowTestConn) Write(b []byte) (int, error) {
   1848 	if !c.wd.IsZero() && time.Now().After(c.wd) {
   1849 		return 0, syscall.ETIMEDOUT
   1850 	}
   1851 	return len(b), nil
   1852 }
   1853 
   1854 func TestRequestBodyTimeoutClosesConnection(t *testing.T) {
   1855 	if testing.Short() {
   1856 		t.Skip("skipping in -short mode")
   1857 	}
   1858 	defer afterTest(t)
   1859 	for _, handler := range testHandlerBodyConsumers {
   1860 		conn := &slowTestConn{
   1861 			script: []interface{}{
   1862 				"POST /public HTTP/1.1\r\n" +
   1863 					"Host: test\r\n" +
   1864 					"Content-Length: 10000\r\n" +
   1865 					"\r\n",
   1866 				"foo bar baz",
   1867 				600 * time.Millisecond, // Request deadline should hit here
   1868 				"GET /secret HTTP/1.1\r\n" +
   1869 					"Host: test\r\n" +
   1870 					"\r\n",
   1871 			},
   1872 			closec: make(chan bool, 1),
   1873 		}
   1874 		ls := &oneConnListener{conn}
   1875 
   1876 		var numReqs int
   1877 		s := Server{
   1878 			Handler: HandlerFunc(func(_ ResponseWriter, req *Request) {
   1879 				numReqs++
   1880 				if strings.Contains(req.URL.Path, "secret") {
   1881 					t.Error("Request for /secret encountered, should not have happened.")
   1882 				}
   1883 				handler.f(req.Body)
   1884 			}),
   1885 			ReadTimeout: 400 * time.Millisecond,
   1886 		}
   1887 		go s.Serve(ls)
   1888 		<-conn.closec
   1889 
   1890 		if numReqs != 1 {
   1891 			t.Errorf("Handler %v: got %d reqs; want 1", handler.name, numReqs)
   1892 		}
   1893 	}
   1894 }
   1895 
   1896 func TestTimeoutHandler_h1(t *testing.T) { testTimeoutHandler(t, h1Mode) }
   1897 func TestTimeoutHandler_h2(t *testing.T) { testTimeoutHandler(t, h2Mode) }
   1898 func testTimeoutHandler(t *testing.T, h2 bool) {
   1899 	setParallel(t)
   1900 	defer afterTest(t)
   1901 	sendHi := make(chan bool, 1)
   1902 	writeErrors := make(chan error, 1)
   1903 	sayHi := HandlerFunc(func(w ResponseWriter, r *Request) {
   1904 		<-sendHi
   1905 		_, werr := w.Write([]byte("hi"))
   1906 		writeErrors <- werr
   1907 	})
   1908 	timeout := make(chan time.Time, 1) // write to this to force timeouts
   1909 	cst := newClientServerTest(t, h2, NewTestTimeoutHandler(sayHi, timeout))
   1910 	defer cst.close()
   1911 
   1912 	// Succeed without timing out:
   1913 	sendHi <- true
   1914 	res, err := cst.c.Get(cst.ts.URL)
   1915 	if err != nil {
   1916 		t.Error(err)
   1917 	}
   1918 	if g, e := res.StatusCode, StatusOK; g != e {
   1919 		t.Errorf("got res.StatusCode %d; expected %d", g, e)
   1920 	}
   1921 	body, _ := ioutil.ReadAll(res.Body)
   1922 	if g, e := string(body), "hi"; g != e {
   1923 		t.Errorf("got body %q; expected %q", g, e)
   1924 	}
   1925 	if g := <-writeErrors; g != nil {
   1926 		t.Errorf("got unexpected Write error on first request: %v", g)
   1927 	}
   1928 
   1929 	// Times out:
   1930 	timeout <- time.Time{}
   1931 	res, err = cst.c.Get(cst.ts.URL)
   1932 	if err != nil {
   1933 		t.Error(err)
   1934 	}
   1935 	if g, e := res.StatusCode, StatusServiceUnavailable; g != e {
   1936 		t.Errorf("got res.StatusCode %d; expected %d", g, e)
   1937 	}
   1938 	body, _ = ioutil.ReadAll(res.Body)
   1939 	if !strings.Contains(string(body), "<title>Timeout</title>") {
   1940 		t.Errorf("expected timeout body; got %q", string(body))
   1941 	}
   1942 
   1943 	// Now make the previously-timed out handler speak again,
   1944 	// which verifies the panic is handled:
   1945 	sendHi <- true
   1946 	if g, e := <-writeErrors, ErrHandlerTimeout; g != e {
   1947 		t.Errorf("expected Write error of %v; got %v", e, g)
   1948 	}
   1949 }
   1950 
   1951 // See issues 8209 and 8414.
   1952 func TestTimeoutHandlerRace(t *testing.T) {
   1953 	setParallel(t)
   1954 	defer afterTest(t)
   1955 
   1956 	delayHi := HandlerFunc(func(w ResponseWriter, r *Request) {
   1957 		ms, _ := strconv.Atoi(r.URL.Path[1:])
   1958 		if ms == 0 {
   1959 			ms = 1
   1960 		}
   1961 		for i := 0; i < ms; i++ {
   1962 			w.Write([]byte("hi"))
   1963 			time.Sleep(time.Millisecond)
   1964 		}
   1965 	})
   1966 
   1967 	ts := httptest.NewServer(TimeoutHandler(delayHi, 20*time.Millisecond, ""))
   1968 	defer ts.Close()
   1969 
   1970 	c := &Client{Transport: new(Transport)}
   1971 	defer closeClient(c)
   1972 
   1973 	var wg sync.WaitGroup
   1974 	gate := make(chan bool, 10)
   1975 	n := 50
   1976 	if testing.Short() {
   1977 		n = 10
   1978 		gate = make(chan bool, 3)
   1979 	}
   1980 	for i := 0; i < n; i++ {
   1981 		gate <- true
   1982 		wg.Add(1)
   1983 		go func() {
   1984 			defer wg.Done()
   1985 			defer func() { <-gate }()
   1986 			res, err := c.Get(fmt.Sprintf("%s/%d", ts.URL, rand.Intn(50)))
   1987 			if err == nil {
   1988 				io.Copy(ioutil.Discard, res.Body)
   1989 				res.Body.Close()
   1990 			}
   1991 		}()
   1992 	}
   1993 	wg.Wait()
   1994 }
   1995 
   1996 // See issues 8209 and 8414.
   1997 func TestTimeoutHandlerRaceHeader(t *testing.T) {
   1998 	setParallel(t)
   1999 	defer afterTest(t)
   2000 
   2001 	delay204 := HandlerFunc(func(w ResponseWriter, r *Request) {
   2002 		w.WriteHeader(204)
   2003 	})
   2004 
   2005 	ts := httptest.NewServer(TimeoutHandler(delay204, time.Nanosecond, ""))
   2006 	defer ts.Close()
   2007 
   2008 	var wg sync.WaitGroup
   2009 	gate := make(chan bool, 50)
   2010 	n := 500
   2011 	if testing.Short() {
   2012 		n = 10
   2013 	}
   2014 	c := &Client{Transport: new(Transport)}
   2015 	defer closeClient(c)
   2016 	for i := 0; i < n; i++ {
   2017 		gate <- true
   2018 		wg.Add(1)
   2019 		go func() {
   2020 			defer wg.Done()
   2021 			defer func() { <-gate }()
   2022 			res, err := c.Get(ts.URL)
   2023 			if err != nil {
   2024 				t.Error(err)
   2025 				return
   2026 			}
   2027 			defer res.Body.Close()
   2028 			io.Copy(ioutil.Discard, res.Body)
   2029 		}()
   2030 	}
   2031 	wg.Wait()
   2032 }
   2033 
   2034 // Issue 9162
   2035 func TestTimeoutHandlerRaceHeaderTimeout(t *testing.T) {
   2036 	setParallel(t)
   2037 	defer afterTest(t)
   2038 	sendHi := make(chan bool, 1)
   2039 	writeErrors := make(chan error, 1)
   2040 	sayHi := HandlerFunc(func(w ResponseWriter, r *Request) {
   2041 		w.Header().Set("Content-Type", "text/plain")
   2042 		<-sendHi
   2043 		_, werr := w.Write([]byte("hi"))
   2044 		writeErrors <- werr
   2045 	})
   2046 	timeout := make(chan time.Time, 1) // write to this to force timeouts
   2047 	cst := newClientServerTest(t, h1Mode, NewTestTimeoutHandler(sayHi, timeout))
   2048 	defer cst.close()
   2049 
   2050 	// Succeed without timing out:
   2051 	sendHi <- true
   2052 	res, err := cst.c.Get(cst.ts.URL)
   2053 	if err != nil {
   2054 		t.Error(err)
   2055 	}
   2056 	if g, e := res.StatusCode, StatusOK; g != e {
   2057 		t.Errorf("got res.StatusCode %d; expected %d", g, e)
   2058 	}
   2059 	body, _ := ioutil.ReadAll(res.Body)
   2060 	if g, e := string(body), "hi"; g != e {
   2061 		t.Errorf("got body %q; expected %q", g, e)
   2062 	}
   2063 	if g := <-writeErrors; g != nil {
   2064 		t.Errorf("got unexpected Write error on first request: %v", g)
   2065 	}
   2066 
   2067 	// Times out:
   2068 	timeout <- time.Time{}
   2069 	res, err = cst.c.Get(cst.ts.URL)
   2070 	if err != nil {
   2071 		t.Error(err)
   2072 	}
   2073 	if g, e := res.StatusCode, StatusServiceUnavailable; g != e {
   2074 		t.Errorf("got res.StatusCode %d; expected %d", g, e)
   2075 	}
   2076 	body, _ = ioutil.ReadAll(res.Body)
   2077 	if !strings.Contains(string(body), "<title>Timeout</title>") {
   2078 		t.Errorf("expected timeout body; got %q", string(body))
   2079 	}
   2080 
   2081 	// Now make the previously-timed out handler speak again,
   2082 	// which verifies the panic is handled:
   2083 	sendHi <- true
   2084 	if g, e := <-writeErrors, ErrHandlerTimeout; g != e {
   2085 		t.Errorf("expected Write error of %v; got %v", e, g)
   2086 	}
   2087 }
   2088 
   2089 // Issue 14568.
   2090 func TestTimeoutHandlerStartTimerWhenServing(t *testing.T) {
   2091 	if testing.Short() {
   2092 		t.Skip("skipping sleeping test in -short mode")
   2093 	}
   2094 	defer afterTest(t)
   2095 	var handler HandlerFunc = func(w ResponseWriter, _ *Request) {
   2096 		w.WriteHeader(StatusNoContent)
   2097 	}
   2098 	timeout := 300 * time.Millisecond
   2099 	ts := httptest.NewServer(TimeoutHandler(handler, timeout, ""))
   2100 	defer ts.Close()
   2101 
   2102 	c := &Client{Transport: new(Transport)}
   2103 	defer closeClient(c)
   2104 
   2105 	// Issue was caused by the timeout handler starting the timer when
   2106 	// was created, not when the request. So wait for more than the timeout
   2107 	// to ensure that's not the case.
   2108 	time.Sleep(2 * timeout)
   2109 	res, err := c.Get(ts.URL)
   2110 	if err != nil {
   2111 		t.Fatal(err)
   2112 	}
   2113 	defer res.Body.Close()
   2114 	if res.StatusCode != StatusNoContent {
   2115 		t.Errorf("got res.StatusCode %d, want %v", res.StatusCode, StatusNoContent)
   2116 	}
   2117 }
   2118 
   2119 // https://golang.org/issue/15948
   2120 func TestTimeoutHandlerEmptyResponse(t *testing.T) {
   2121 	setParallel(t)
   2122 	defer afterTest(t)
   2123 	var handler HandlerFunc = func(w ResponseWriter, _ *Request) {
   2124 		// No response.
   2125 	}
   2126 	timeout := 300 * time.Millisecond
   2127 	ts := httptest.NewServer(TimeoutHandler(handler, timeout, ""))
   2128 	defer ts.Close()
   2129 
   2130 	c := &Client{Transport: new(Transport)}
   2131 	defer closeClient(c)
   2132 
   2133 	res, err := c.Get(ts.URL)
   2134 	if err != nil {
   2135 		t.Fatal(err)
   2136 	}
   2137 	defer res.Body.Close()
   2138 	if res.StatusCode != StatusOK {
   2139 		t.Errorf("got res.StatusCode %d, want %v", res.StatusCode, StatusOK)
   2140 	}
   2141 }
   2142 
   2143 func TestRedirectBadPath(t *testing.T) {
   2144 	// This used to crash. It's not valid input (bad path), but it
   2145 	// shouldn't crash.
   2146 	rr := httptest.NewRecorder()
   2147 	req := &Request{
   2148 		Method: "GET",
   2149 		URL: &url.URL{
   2150 			Scheme: "http",
   2151 			Path:   "not-empty-but-no-leading-slash", // bogus
   2152 		},
   2153 	}
   2154 	Redirect(rr, req, "", 304)
   2155 	if rr.Code != 304 {
   2156 		t.Errorf("Code = %d; want 304", rr.Code)
   2157 	}
   2158 }
   2159 
   2160 // Test different URL formats and schemes
   2161 func TestRedirect(t *testing.T) {
   2162 	req, _ := NewRequest("GET", "http://example.com/qux/", nil)
   2163 
   2164 	var tests = []struct {
   2165 		in   string
   2166 		want string
   2167 	}{
   2168 		// normal http
   2169 		{"http://foobar.com/baz", "http://foobar.com/baz"},
   2170 		// normal https
   2171 		{"https://foobar.com/baz", "https://foobar.com/baz"},
   2172 		// custom scheme
   2173 		{"test://foobar.com/baz", "test://foobar.com/baz"},
   2174 		// schemeless
   2175 		{"//foobar.com/baz", "//foobar.com/baz"},
   2176 		// relative to the root
   2177 		{"/foobar.com/baz", "/foobar.com/baz"},
   2178 		// relative to the current path
   2179 		{"foobar.com/baz", "/qux/foobar.com/baz"},
   2180 		// relative to the current path (+ going upwards)
   2181 		{"../quux/foobar.com/baz", "/quux/foobar.com/baz"},
   2182 		// incorrect number of slashes
   2183 		{"///foobar.com/baz", "/foobar.com/baz"},
   2184 
   2185 		// Verifies we don't path.Clean() on the wrong parts in redirects:
   2186 		{"/foo?next=http://bar.com/", "/foo?next=http://bar.com/"},
   2187 		{"http://localhost:8080/_ah/login?continue=http://localhost:8080/",
   2188 			"http://localhost:8080/_ah/login?continue=http://localhost:8080/"},
   2189 
   2190 		{"/", "/%d1%84%d1%83%d0%b1%d0%b0%d1%80"},
   2191 		{"http://foo.com/", "http://foo.com/%d1%84%d1%83%d0%b1%d0%b0%d1%80"},
   2192 	}
   2193 
   2194 	for _, tt := range tests {
   2195 		rec := httptest.NewRecorder()
   2196 		Redirect(rec, req, tt.in, 302)
   2197 		if got := rec.Header().Get("Location"); got != tt.want {
   2198 			t.Errorf("Redirect(%q) generated Location header %q; want %q", tt.in, got, tt.want)
   2199 		}
   2200 	}
   2201 }
   2202 
   2203 // TestZeroLengthPostAndResponse exercises an optimization done by the Transport:
   2204 // when there is no body (either because the method doesn't permit a body, or an
   2205 // explicit Content-Length of zero is present), then the transport can re-use the
   2206 // connection immediately. But when it re-uses the connection, it typically closes
   2207 // the previous request's body, which is not optimal for zero-lengthed bodies,
   2208 // as the client would then see http.ErrBodyReadAfterClose and not 0, io.EOF.
   2209 func TestZeroLengthPostAndResponse_h1(t *testing.T) {
   2210 	testZeroLengthPostAndResponse(t, h1Mode)
   2211 }
   2212 func TestZeroLengthPostAndResponse_h2(t *testing.T) {
   2213 	testZeroLengthPostAndResponse(t, h2Mode)
   2214 }
   2215 
   2216 func testZeroLengthPostAndResponse(t *testing.T, h2 bool) {
   2217 	setParallel(t)
   2218 	defer afterTest(t)
   2219 	cst := newClientServerTest(t, h2, HandlerFunc(func(rw ResponseWriter, r *Request) {
   2220 		all, err := ioutil.ReadAll(r.Body)
   2221 		if err != nil {
   2222 			t.Fatalf("handler ReadAll: %v", err)
   2223 		}
   2224 		if len(all) != 0 {
   2225 			t.Errorf("handler got %d bytes; expected 0", len(all))
   2226 		}
   2227 		rw.Header().Set("Content-Length", "0")
   2228 	}))
   2229 	defer cst.close()
   2230 
   2231 	req, err := NewRequest("POST", cst.ts.URL, strings.NewReader(""))
   2232 	if err != nil {
   2233 		t.Fatal(err)
   2234 	}
   2235 	req.ContentLength = 0
   2236 
   2237 	var resp [5]*Response
   2238 	for i := range resp {
   2239 		resp[i], err = cst.c.Do(req)
   2240 		if err != nil {
   2241 			t.Fatalf("client post #%d: %v", i, err)
   2242 		}
   2243 	}
   2244 
   2245 	for i := range resp {
   2246 		all, err := ioutil.ReadAll(resp[i].Body)
   2247 		if err != nil {
   2248 			t.Fatalf("req #%d: client ReadAll: %v", i, err)
   2249 		}
   2250 		if len(all) != 0 {
   2251 			t.Errorf("req #%d: client got %d bytes; expected 0", i, len(all))
   2252 		}
   2253 	}
   2254 }
   2255 
   2256 func TestHandlerPanicNil_h1(t *testing.T) { testHandlerPanic(t, false, h1Mode, nil) }
   2257 func TestHandlerPanicNil_h2(t *testing.T) { testHandlerPanic(t, false, h2Mode, nil) }
   2258 
   2259 func TestHandlerPanic_h1(t *testing.T) {
   2260 	testHandlerPanic(t, false, h1Mode, "intentional death for testing")
   2261 }
   2262 func TestHandlerPanic_h2(t *testing.T) {
   2263 	testHandlerPanic(t, false, h2Mode, "intentional death for testing")
   2264 }
   2265 
   2266 func TestHandlerPanicWithHijack(t *testing.T) {
   2267 	// Only testing HTTP/1, and our http2 server doesn't support hijacking.
   2268 	testHandlerPanic(t, true, h1Mode, "intentional death for testing")
   2269 }
   2270 
   2271 func testHandlerPanic(t *testing.T, withHijack, h2 bool, panicValue interface{}) {
   2272 	defer afterTest(t)
   2273 	// Unlike the other tests that set the log output to ioutil.Discard
   2274 	// to quiet the output, this test uses a pipe. The pipe serves three
   2275 	// purposes:
   2276 	//
   2277 	//   1) The log.Print from the http server (generated by the caught
   2278 	//      panic) will go to the pipe instead of stderr, making the
   2279 	//      output quiet.
   2280 	//
   2281 	//   2) We read from the pipe to verify that the handler
   2282 	//      actually caught the panic and logged something.
   2283 	//
   2284 	//   3) The blocking Read call prevents this TestHandlerPanic
   2285 	//      function from exiting before the HTTP server handler
   2286 	//      finishes crashing. If this text function exited too
   2287 	//      early (and its defer log.SetOutput(os.Stderr) ran),
   2288 	//      then the crash output could spill into the next test.
   2289 	pr, pw := io.Pipe()
   2290 	log.SetOutput(pw)
   2291 	defer log.SetOutput(os.Stderr)
   2292 	defer pw.Close()
   2293 
   2294 	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
   2295 		if withHijack {
   2296 			rwc, _, err := w.(Hijacker).Hijack()
   2297 			if err != nil {
   2298 				t.Logf("unexpected error: %v", err)
   2299 			}
   2300 			defer rwc.Close()
   2301 		}
   2302 		panic(panicValue)
   2303 	}))
   2304 	defer cst.close()
   2305 
   2306 	// Do a blocking read on the log output pipe so its logging
   2307 	// doesn't bleed into the next test. But wait only 5 seconds
   2308 	// for it.
   2309 	done := make(chan bool, 1)
   2310 	go func() {
   2311 		buf := make([]byte, 4<<10)
   2312 		_, err := pr.Read(buf)
   2313 		pr.Close()
   2314 		if err != nil && err != io.EOF {
   2315 			t.Error(err)
   2316 		}
   2317 		done <- true
   2318 	}()
   2319 
   2320 	_, err := cst.c.Get(cst.ts.URL)
   2321 	if err == nil {
   2322 		t.Logf("expected an error")
   2323 	}
   2324 
   2325 	if panicValue == nil {
   2326 		return
   2327 	}
   2328 
   2329 	select {
   2330 	case <-done:
   2331 		return
   2332 	case <-time.After(5 * time.Second):
   2333 		t.Fatal("expected server handler to log an error")
   2334 	}
   2335 }
   2336 
   2337 type terrorWriter struct{ t *testing.T }
   2338 
   2339 func (w terrorWriter) Write(p []byte) (int, error) {
   2340 	w.t.Errorf("%s", p)
   2341 	return len(p), nil
   2342 }
   2343 
   2344 // Issue 16456: allow writing 0 bytes on hijacked conn to test hijack
   2345 // without any log spam.
   2346 func TestServerWriteHijackZeroBytes(t *testing.T) {
   2347 	defer afterTest(t)
   2348 	done := make(chan struct{})
   2349 	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   2350 		defer close(done)
   2351 		w.(Flusher).Flush()
   2352 		conn, _, err := w.(Hijacker).Hijack()
   2353 		if err != nil {
   2354 			t.Errorf("Hijack: %v", err)
   2355 			return
   2356 		}
   2357 		defer conn.Close()
   2358 		_, err = w.Write(nil)
   2359 		if err != ErrHijacked {
   2360 			t.Errorf("Write error = %v; want ErrHijacked", err)
   2361 		}
   2362 	}))
   2363 	ts.Config.ErrorLog = log.New(terrorWriter{t}, "Unexpected write: ", 0)
   2364 	ts.Start()
   2365 	defer ts.Close()
   2366 
   2367 	tr := &Transport{}
   2368 	defer tr.CloseIdleConnections()
   2369 	c := &Client{Transport: tr}
   2370 	res, err := c.Get(ts.URL)
   2371 	if err != nil {
   2372 		t.Fatal(err)
   2373 	}
   2374 	res.Body.Close()
   2375 	select {
   2376 	case <-done:
   2377 	case <-time.After(5 * time.Second):
   2378 		t.Fatal("timeout")
   2379 	}
   2380 }
   2381 
   2382 func TestServerNoDate_h1(t *testing.T)        { testServerNoHeader(t, h1Mode, "Date") }
   2383 func TestServerNoDate_h2(t *testing.T)        { testServerNoHeader(t, h2Mode, "Date") }
   2384 func TestServerNoContentType_h1(t *testing.T) { testServerNoHeader(t, h1Mode, "Content-Type") }
   2385 func TestServerNoContentType_h2(t *testing.T) { testServerNoHeader(t, h2Mode, "Content-Type") }
   2386 
   2387 func testServerNoHeader(t *testing.T, h2 bool, header string) {
   2388 	setParallel(t)
   2389 	defer afterTest(t)
   2390 	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
   2391 		w.Header()[header] = nil
   2392 		io.WriteString(w, "<html>foo</html>") // non-empty
   2393 	}))
   2394 	defer cst.close()
   2395 	res, err := cst.c.Get(cst.ts.URL)
   2396 	if err != nil {
   2397 		t.Fatal(err)
   2398 	}
   2399 	res.Body.Close()
   2400 	if got, ok := res.Header[header]; ok {
   2401 		t.Fatalf("Expected no %s header; got %q", header, got)
   2402 	}
   2403 }
   2404 
   2405 func TestStripPrefix(t *testing.T) {
   2406 	setParallel(t)
   2407 	defer afterTest(t)
   2408 	h := HandlerFunc(func(w ResponseWriter, r *Request) {
   2409 		w.Header().Set("X-Path", r.URL.Path)
   2410 	})
   2411 	ts := httptest.NewServer(StripPrefix("/foo", h))
   2412 	defer ts.Close()
   2413 
   2414 	c := &Client{Transport: new(Transport)}
   2415 	defer closeClient(c)
   2416 
   2417 	res, err := c.Get(ts.URL + "/foo/bar")
   2418 	if err != nil {
   2419 		t.Fatal(err)
   2420 	}
   2421 	if g, e := res.Header.Get("X-Path"), "/bar"; g != e {
   2422 		t.Errorf("test 1: got %s, want %s", g, e)
   2423 	}
   2424 	res.Body.Close()
   2425 
   2426 	res, err = Get(ts.URL + "/bar")
   2427 	if err != nil {
   2428 		t.Fatal(err)
   2429 	}
   2430 	if g, e := res.StatusCode, 404; g != e {
   2431 		t.Errorf("test 2: got status %v, want %v", g, e)
   2432 	}
   2433 	res.Body.Close()
   2434 }
   2435 
   2436 func TestRequestLimit_h1(t *testing.T) { testRequestLimit(t, h1Mode) }
   2437 func TestRequestLimit_h2(t *testing.T) { testRequestLimit(t, h2Mode) }
   2438 func testRequestLimit(t *testing.T, h2 bool) {
   2439 	setParallel(t)
   2440 	defer afterTest(t)
   2441 	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
   2442 		t.Fatalf("didn't expect to get request in Handler")
   2443 	}), optQuietLog)
   2444 	defer cst.close()
   2445 	req, _ := NewRequest("GET", cst.ts.URL, nil)
   2446 	var bytesPerHeader = len("header12345: val12345\r\n")
   2447 	for i := 0; i < ((DefaultMaxHeaderBytes+4096)/bytesPerHeader)+1; i++ {
   2448 		req.Header.Set(fmt.Sprintf("header%05d", i), fmt.Sprintf("val%05d", i))
   2449 	}
   2450 	res, err := cst.c.Do(req)
   2451 	if err != nil {
   2452 		// Some HTTP clients may fail on this undefined behavior (server replying and
   2453 		// closing the connection while the request is still being written), but
   2454 		// we do support it (at least currently), so we expect a response below.
   2455 		t.Fatalf("Do: %v", err)
   2456 	}
   2457 	defer res.Body.Close()
   2458 	if res.StatusCode != 431 {
   2459 		t.Fatalf("expected 431 response status; got: %d %s", res.StatusCode, res.Status)
   2460 	}
   2461 }
   2462 
   2463 type neverEnding byte
   2464 
   2465 func (b neverEnding) Read(p []byte) (n int, err error) {
   2466 	for i := range p {
   2467 		p[i] = byte(b)
   2468 	}
   2469 	return len(p), nil
   2470 }
   2471 
   2472 type countReader struct {
   2473 	r io.Reader
   2474 	n *int64
   2475 }
   2476 
   2477 func (cr countReader) Read(p []byte) (n int, err error) {
   2478 	n, err = cr.r.Read(p)
   2479 	atomic.AddInt64(cr.n, int64(n))
   2480 	return
   2481 }
   2482 
   2483 func TestRequestBodyLimit_h1(t *testing.T) { testRequestBodyLimit(t, h1Mode) }
   2484 func TestRequestBodyLimit_h2(t *testing.T) { testRequestBodyLimit(t, h2Mode) }
   2485 func testRequestBodyLimit(t *testing.T, h2 bool) {
   2486 	setParallel(t)
   2487 	defer afterTest(t)
   2488 	const limit = 1 << 20
   2489 	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
   2490 		r.Body = MaxBytesReader(w, r.Body, limit)
   2491 		n, err := io.Copy(ioutil.Discard, r.Body)
   2492 		if err == nil {
   2493 			t.Errorf("expected error from io.Copy")
   2494 		}
   2495 		if n != limit {
   2496 			t.Errorf("io.Copy = %d, want %d", n, limit)
   2497 		}
   2498 	}))
   2499 	defer cst.close()
   2500 
   2501 	nWritten := new(int64)
   2502 	req, _ := NewRequest("POST", cst.ts.URL, io.LimitReader(countReader{neverEnding('a'), nWritten}, limit*200))
   2503 
   2504 	// Send the POST, but don't care it succeeds or not. The
   2505 	// remote side is going to reply and then close the TCP
   2506 	// connection, and HTTP doesn't really define if that's
   2507 	// allowed or not. Some HTTP clients will get the response
   2508 	// and some (like ours, currently) will complain that the
   2509 	// request write failed, without reading the response.
   2510 	//
   2511 	// But that's okay, since what we're really testing is that
   2512 	// the remote side hung up on us before we wrote too much.
   2513 	_, _ = cst.c.Do(req)
   2514 
   2515 	if atomic.LoadInt64(nWritten) > limit*100 {
   2516 		t.Errorf("handler restricted the request body to %d bytes, but client managed to write %d",
   2517 			limit, nWritten)
   2518 	}
   2519 }
   2520 
   2521 // TestClientWriteShutdown tests that if the client shuts down the write
   2522 // side of their TCP connection, the server doesn't send a 400 Bad Request.
   2523 func TestClientWriteShutdown(t *testing.T) {
   2524 	if runtime.GOOS == "plan9" {
   2525 		t.Skip("skipping test; see https://golang.org/issue/7237")
   2526 	}
   2527 	defer afterTest(t)
   2528 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
   2529 	defer ts.Close()
   2530 	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
   2531 	if err != nil {
   2532 		t.Fatalf("Dial: %v", err)
   2533 	}
   2534 	err = conn.(*net.TCPConn).CloseWrite()
   2535 	if err != nil {
   2536 		t.Fatalf("CloseWrite: %v", err)
   2537 	}
   2538 	donec := make(chan bool)
   2539 	go func() {
   2540 		defer close(donec)
   2541 		bs, err := ioutil.ReadAll(conn)
   2542 		if err != nil {
   2543 			t.Errorf("ReadAll: %v", err)
   2544 		}
   2545 		got := string(bs)
   2546 		if got != "" {
   2547 			t.Errorf("read %q from server; want nothing", got)
   2548 		}
   2549 	}()
   2550 	select {
   2551 	case <-donec:
   2552 	case <-time.After(10 * time.Second):
   2553 		t.Fatalf("timeout")
   2554 	}
   2555 }
   2556 
   2557 // Tests that chunked server responses that write 1 byte at a time are
   2558 // buffered before chunk headers are added, not after chunk headers.
   2559 func TestServerBufferedChunking(t *testing.T) {
   2560 	conn := new(testConn)
   2561 	conn.readBuf.Write([]byte("GET / HTTP/1.1\r\nHost: foo\r\n\r\n"))
   2562 	conn.closec = make(chan bool, 1)
   2563 	ls := &oneConnListener{conn}
   2564 	go Serve(ls, HandlerFunc(func(rw ResponseWriter, req *Request) {
   2565 		rw.(Flusher).Flush() // force the Header to be sent, in chunking mode, not counting the length
   2566 		rw.Write([]byte{'x'})
   2567 		rw.Write([]byte{'y'})
   2568 		rw.Write([]byte{'z'})
   2569 	}))
   2570 	<-conn.closec
   2571 	if !bytes.HasSuffix(conn.writeBuf.Bytes(), []byte("\r\n\r\n3\r\nxyz\r\n0\r\n\r\n")) {
   2572 		t.Errorf("response didn't end with a single 3 byte 'xyz' chunk; got:\n%q",
   2573 			conn.writeBuf.Bytes())
   2574 	}
   2575 }
   2576 
   2577 // Tests that the server flushes its response headers out when it's
   2578 // ignoring the response body and waits a bit before forcefully
   2579 // closing the TCP connection, causing the client to get a RST.
   2580 // See https://golang.org/issue/3595
   2581 func TestServerGracefulClose(t *testing.T) {
   2582 	setParallel(t)
   2583 	defer afterTest(t)
   2584 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   2585 		Error(w, "bye", StatusUnauthorized)
   2586 	}))
   2587 	defer ts.Close()
   2588 
   2589 	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
   2590 	if err != nil {
   2591 		t.Fatal(err)
   2592 	}
   2593 	defer conn.Close()
   2594 	const bodySize = 5 << 20
   2595 	req := []byte(fmt.Sprintf("POST / HTTP/1.1\r\nHost: foo.com\r\nContent-Length: %d\r\n\r\n", bodySize))
   2596 	for i := 0; i < bodySize; i++ {
   2597 		req = append(req, 'x')
   2598 	}
   2599 	writeErr := make(chan error)
   2600 	go func() {
   2601 		_, err := conn.Write(req)
   2602 		writeErr <- err
   2603 	}()
   2604 	br := bufio.NewReader(conn)
   2605 	lineNum := 0
   2606 	for {
   2607 		line, err := br.ReadString('\n')
   2608 		if err == io.EOF {
   2609 			break
   2610 		}
   2611 		if err != nil {
   2612 			t.Fatalf("ReadLine: %v", err)
   2613 		}
   2614 		lineNum++
   2615 		if lineNum == 1 && !strings.Contains(line, "401 Unauthorized") {
   2616 			t.Errorf("Response line = %q; want a 401", line)
   2617 		}
   2618 	}
   2619 	// Wait for write to finish. This is a broken pipe on both
   2620 	// Darwin and Linux, but checking this isn't the point of
   2621 	// the test.
   2622 	<-writeErr
   2623 }
   2624 
   2625 func TestCaseSensitiveMethod_h1(t *testing.T) { testCaseSensitiveMethod(t, h1Mode) }
   2626 func TestCaseSensitiveMethod_h2(t *testing.T) { testCaseSensitiveMethod(t, h2Mode) }
   2627 func testCaseSensitiveMethod(t *testing.T, h2 bool) {
   2628 	defer afterTest(t)
   2629 	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
   2630 		if r.Method != "get" {
   2631 			t.Errorf(`Got method %q; want "get"`, r.Method)
   2632 		}
   2633 	}))
   2634 	defer cst.close()
   2635 	req, _ := NewRequest("get", cst.ts.URL, nil)
   2636 	res, err := cst.c.Do(req)
   2637 	if err != nil {
   2638 		t.Error(err)
   2639 		return
   2640 	}
   2641 
   2642 	res.Body.Close()
   2643 }
   2644 
   2645 // TestContentLengthZero tests that for both an HTTP/1.0 and HTTP/1.1
   2646 // request (both keep-alive), when a Handler never writes any
   2647 // response, the net/http package adds a "Content-Length: 0" response
   2648 // header.
   2649 func TestContentLengthZero(t *testing.T) {
   2650 	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {}))
   2651 	defer ts.Close()
   2652 
   2653 	for _, version := range []string{"HTTP/1.0", "HTTP/1.1"} {
   2654 		conn, err := net.Dial("tcp", ts.Listener.Addr().String())
   2655 		if err != nil {
   2656 			t.Fatalf("error dialing: %v", err)
   2657 		}
   2658 		_, err = fmt.Fprintf(conn, "GET / %v\r\nConnection: keep-alive\r\nHost: foo\r\n\r\n", version)
   2659 		if err != nil {
   2660 			t.Fatalf("error writing: %v", err)
   2661 		}
   2662 		req, _ := NewRequest("GET", "/", nil)
   2663 		res, err := ReadResponse(bufio.NewReader(conn), req)
   2664 		if err != nil {
   2665 			t.Fatalf("error reading response: %v", err)
   2666 		}
   2667 		if te := res.TransferEncoding; len(te) > 0 {
   2668 			t.Errorf("For version %q, Transfer-Encoding = %q; want none", version, te)
   2669 		}
   2670 		if cl := res.ContentLength; cl != 0 {
   2671 			t.Errorf("For version %q, Content-Length = %v; want 0", version, cl)
   2672 		}
   2673 		conn.Close()
   2674 	}
   2675 }
   2676 
   2677 func TestCloseNotifier(t *testing.T) {
   2678 	defer afterTest(t)
   2679 	gotReq := make(chan bool, 1)
   2680 	sawClose := make(chan bool, 1)
   2681 	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
   2682 		gotReq <- true
   2683 		cc := rw.(CloseNotifier).CloseNotify()
   2684 		<-cc
   2685 		sawClose <- true
   2686 	}))
   2687 	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
   2688 	if err != nil {
   2689 		t.Fatalf("error dialing: %v", err)
   2690 	}
   2691 	diec := make(chan bool)
   2692 	go func() {
   2693 		_, err = fmt.Fprintf(conn, "GET / HTTP/1.1\r\nConnection: keep-alive\r\nHost: foo\r\n\r\n")
   2694 		if err != nil {
   2695 			t.Error(err)
   2696 			return
   2697 		}
   2698 		<-diec
   2699 		conn.Close()
   2700 	}()
   2701 For:
   2702 	for {
   2703 		select {
   2704 		case <-gotReq:
   2705 			diec <- true
   2706 		case <-sawClose:
   2707 			break For
   2708 		case <-time.After(5 * time.Second):
   2709 			t.Fatal("timeout")
   2710 		}
   2711 	}
   2712 	ts.Close()
   2713 }
   2714 
   2715 // Tests that a pipelined request causes the first request's Handler's CloseNotify
   2716 // channel to fire. Previously it deadlocked.
   2717 //
   2718 // Issue 13165
   2719 func TestCloseNotifierPipelined(t *testing.T) {
   2720 	defer afterTest(t)
   2721 	gotReq := make(chan bool, 2)
   2722 	sawClose := make(chan bool, 2)
   2723 	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
   2724 		gotReq <- true
   2725 		cc := rw.(CloseNotifier).CloseNotify()
   2726 		<-cc
   2727 		sawClose <- true
   2728 	}))
   2729 	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
   2730 	if err != nil {
   2731 		t.Fatalf("error dialing: %v", err)
   2732 	}
   2733 	diec := make(chan bool, 1)
   2734 	go func() {
   2735 		const req = "GET / HTTP/1.1\r\nConnection: keep-alive\r\nHost: foo\r\n\r\n"
   2736 		_, err = io.WriteString(conn, req+req) // two requests
   2737 		if err != nil {
   2738 			t.Error(err)
   2739 			return
   2740 		}
   2741 		<-diec
   2742 		conn.Close()
   2743 	}()
   2744 	reqs := 0
   2745 	closes := 0
   2746 For:
   2747 	for {
   2748 		select {
   2749 		case <-gotReq:
   2750 			reqs++
   2751 			if reqs > 2 {
   2752 				t.Fatal("too many requests")
   2753 			} else if reqs > 1 {
   2754 				diec <- true
   2755 			}
   2756 		case <-sawClose:
   2757 			closes++
   2758 			if closes > 1 {
   2759 				break For
   2760 			}
   2761 		case <-time.After(5 * time.Second):
   2762 			ts.CloseClientConnections()
   2763 			t.Fatal("timeout")
   2764 		}
   2765 	}
   2766 	ts.Close()
   2767 }
   2768 
   2769 func TestCloseNotifierChanLeak(t *testing.T) {
   2770 	defer afterTest(t)
   2771 	req := reqBytes("GET / HTTP/1.0\nHost: golang.org")
   2772 	for i := 0; i < 20; i++ {
   2773 		var output bytes.Buffer
   2774 		conn := &rwTestConn{
   2775 			Reader: bytes.NewReader(req),
   2776 			Writer: &output,
   2777 			closec: make(chan bool, 1),
   2778 		}
   2779 		ln := &oneConnListener{conn: conn}
   2780 		handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
   2781 			// Ignore the return value and never read from
   2782 			// it, testing that we don't leak goroutines
   2783 			// on the sending side:
   2784 			_ = rw.(CloseNotifier).CloseNotify()
   2785 		})
   2786 		go Serve(ln, handler)
   2787 		<-conn.closec
   2788 	}
   2789 }
   2790 
   2791 // Tests that we can use CloseNotifier in one request, and later call Hijack
   2792 // on a second request on the same connection.
   2793 //
   2794 // It also tests that the connReader stitches together its background
   2795 // 1-byte read for CloseNotifier when CloseNotifier doesn't fire with
   2796 // the rest of the second HTTP later.
   2797 //
   2798 // Issue 9763.
   2799 // HTTP/1-only test. (http2 doesn't have Hijack)
   2800 func TestHijackAfterCloseNotifier(t *testing.T) {
   2801 	defer afterTest(t)
   2802 	script := make(chan string, 2)
   2803 	script <- "closenotify"
   2804 	script <- "hijack"
   2805 	close(script)
   2806 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   2807 		plan := <-script
   2808 		switch plan {
   2809 		default:
   2810 			panic("bogus plan; too many requests")
   2811 		case "closenotify":
   2812 			w.(CloseNotifier).CloseNotify() // discard result
   2813 			w.Header().Set("X-Addr", r.RemoteAddr)
   2814 		case "hijack":
   2815 			c, _, err := w.(Hijacker).Hijack()
   2816 			if err != nil {
   2817 				t.Errorf("Hijack in Handler: %v", err)
   2818 				return
   2819 			}
   2820 			if _, ok := c.(*net.TCPConn); !ok {
   2821 				// Verify it's not wrapped in some type.
   2822 				// Not strictly a go1 compat issue, but in practice it probably is.
   2823 				t.Errorf("type of hijacked conn is %T; want *net.TCPConn", c)
   2824 			}
   2825 			fmt.Fprintf(c, "HTTP/1.0 200 OK\r\nX-Addr: %v\r\nContent-Length: 0\r\n\r\n", r.RemoteAddr)
   2826 			c.Close()
   2827 			return
   2828 		}
   2829 	}))
   2830 	defer ts.Close()
   2831 	res1, err := Get(ts.URL)
   2832 	if err != nil {
   2833 		log.Fatal(err)
   2834 	}
   2835 	res2, err := Get(ts.URL)
   2836 	if err != nil {
   2837 		log.Fatal(err)
   2838 	}
   2839 	addr1 := res1.Header.Get("X-Addr")
   2840 	addr2 := res2.Header.Get("X-Addr")
   2841 	if addr1 == "" || addr1 != addr2 {
   2842 		t.Errorf("addr1, addr2 = %q, %q; want same", addr1, addr2)
   2843 	}
   2844 }
   2845 
   2846 func TestHijackBeforeRequestBodyRead(t *testing.T) {
   2847 	setParallel(t)
   2848 	defer afterTest(t)
   2849 	var requestBody = bytes.Repeat([]byte("a"), 1<<20)
   2850 	bodyOkay := make(chan bool, 1)
   2851 	gotCloseNotify := make(chan bool, 1)
   2852 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   2853 		defer close(bodyOkay) // caller will read false if nothing else
   2854 
   2855 		reqBody := r.Body
   2856 		r.Body = nil // to test that server.go doesn't use this value.
   2857 
   2858 		gone := w.(CloseNotifier).CloseNotify()
   2859 		slurp, err := ioutil.ReadAll(reqBody)
   2860 		if err != nil {
   2861 			t.Errorf("Body read: %v", err)
   2862 			return
   2863 		}
   2864 		if len(slurp) != len(requestBody) {
   2865 			t.Errorf("Backend read %d request body bytes; want %d", len(slurp), len(requestBody))
   2866 			return
   2867 		}
   2868 		if !bytes.Equal(slurp, requestBody) {
   2869 			t.Error("Backend read wrong request body.") // 1MB; omitting details
   2870 			return
   2871 		}
   2872 		bodyOkay <- true
   2873 		select {
   2874 		case <-gone:
   2875 			gotCloseNotify <- true
   2876 		case <-time.After(5 * time.Second):
   2877 			gotCloseNotify <- false
   2878 		}
   2879 	}))
   2880 	defer ts.Close()
   2881 
   2882 	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
   2883 	if err != nil {
   2884 		t.Fatal(err)
   2885 	}
   2886 	defer conn.Close()
   2887 
   2888 	fmt.Fprintf(conn, "POST / HTTP/1.1\r\nHost: foo\r\nContent-Length: %d\r\n\r\n%s",
   2889 		len(requestBody), requestBody)
   2890 	if !<-bodyOkay {
   2891 		// already failed.
   2892 		return
   2893 	}
   2894 	conn.Close()
   2895 	if !<-gotCloseNotify {
   2896 		t.Error("timeout waiting for CloseNotify")
   2897 	}
   2898 }
   2899 
   2900 func TestOptions(t *testing.T) {
   2901 	uric := make(chan string, 2) // only expect 1, but leave space for 2
   2902 	mux := NewServeMux()
   2903 	mux.HandleFunc("/", func(w ResponseWriter, r *Request) {
   2904 		uric <- r.RequestURI
   2905 	})
   2906 	ts := httptest.NewServer(mux)
   2907 	defer ts.Close()
   2908 
   2909 	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
   2910 	if err != nil {
   2911 		t.Fatal(err)
   2912 	}
   2913 	defer conn.Close()
   2914 
   2915 	// An OPTIONS * request should succeed.
   2916 	_, err = conn.Write([]byte("OPTIONS * HTTP/1.1\r\nHost: foo.com\r\n\r\n"))
   2917 	if err != nil {
   2918 		t.Fatal(err)
   2919 	}
   2920 	br := bufio.NewReader(conn)
   2921 	res, err := ReadResponse(br, &Request{Method: "OPTIONS"})
   2922 	if err != nil {
   2923 		t.Fatal(err)
   2924 	}
   2925 	if res.StatusCode != 200 {
   2926 		t.Errorf("Got non-200 response to OPTIONS *: %#v", res)
   2927 	}
   2928 
   2929 	// A GET * request on a ServeMux should fail.
   2930 	_, err = conn.Write([]byte("GET * HTTP/1.1\r\nHost: foo.com\r\n\r\n"))
   2931 	if err != nil {
   2932 		t.Fatal(err)
   2933 	}
   2934 	res, err = ReadResponse(br, &Request{Method: "GET"})
   2935 	if err != nil {
   2936 		t.Fatal(err)
   2937 	}
   2938 	if res.StatusCode != 400 {
   2939 		t.Errorf("Got non-400 response to GET *: %#v", res)
   2940 	}
   2941 
   2942 	res, err = Get(ts.URL + "/second")
   2943 	if err != nil {
   2944 		t.Fatal(err)
   2945 	}
   2946 	res.Body.Close()
   2947 	if got := <-uric; got != "/second" {
   2948 		t.Errorf("Handler saw request for %q; want /second", got)
   2949 	}
   2950 }
   2951 
   2952 // Tests regarding the ordering of Write, WriteHeader, Header, and
   2953 // Flush calls. In Go 1.0, rw.WriteHeader immediately flushed the
   2954 // (*response).header to the wire. In Go 1.1, the actual wire flush is
   2955 // delayed, so we could maybe tack on a Content-Length and better
   2956 // Content-Type after we see more (or all) of the output. To preserve
   2957 // compatibility with Go 1, we need to be careful to track which
   2958 // headers were live at the time of WriteHeader, so we write the same
   2959 // ones, even if the handler modifies them (~erroneously) after the
   2960 // first Write.
   2961 func TestHeaderToWire(t *testing.T) {
   2962 	tests := []struct {
   2963 		name    string
   2964 		handler func(ResponseWriter, *Request)
   2965 		check   func(output string) error
   2966 	}{
   2967 		{
   2968 			name: "write without Header",
   2969 			handler: func(rw ResponseWriter, r *Request) {
   2970 				rw.Write([]byte("hello world"))
   2971 			},
   2972 			check: func(got string) error {
   2973 				if !strings.Contains(got, "Content-Length:") {
   2974 					return errors.New("no content-length")
   2975 				}
   2976 				if !strings.Contains(got, "Content-Type: text/plain") {
   2977 					return errors.New("no content-type")
   2978 				}
   2979 				return nil
   2980 			},
   2981 		},
   2982 		{
   2983 			name: "Header mutation before write",
   2984 			handler: func(rw ResponseWriter, r *Request) {
   2985 				h := rw.Header()
   2986 				h.Set("Content-Type", "some/type")
   2987 				rw.Write([]byte("hello world"))
   2988 				h.Set("Too-Late", "bogus")
   2989 			},
   2990 			check: func(got string) error {
   2991 				if !strings.Contains(got, "Content-Length:") {
   2992 					return errors.New("no content-length")
   2993 				}
   2994 				if !strings.Contains(got, "Content-Type: some/type") {
   2995 					return errors.New("wrong content-type")
   2996 				}
   2997 				if strings.Contains(got, "Too-Late") {
   2998 					return errors.New("don't want too-late header")
   2999 				}
   3000 				return nil
   3001 			},
   3002 		},
   3003 		{
   3004 			name: "write then useless Header mutation",
   3005 			handler: func(rw ResponseWriter, r *Request) {
   3006 				rw.Write([]byte("hello world"))
   3007 				rw.Header().Set("Too-Late", "Write already wrote headers")
   3008 			},
   3009 			check: func(got string) error {
   3010 				if strings.Contains(got, "Too-Late") {
   3011 					return errors.New("header appeared from after WriteHeader")
   3012 				}
   3013 				return nil
   3014 			},
   3015 		},
   3016 		{
   3017 			name: "flush then write",
   3018 			handler: func(rw ResponseWriter, r *Request) {
   3019 				rw.(Flusher).Flush()
   3020 				rw.Write([]byte("post-flush"))
   3021 				rw.Header().Set("Too-Late", "Write already wrote headers")
   3022 			},
   3023 			check: func(got string) error {
   3024 				if !strings.Contains(got, "Transfer-Encoding: chunked") {
   3025 					return errors.New("not chunked")
   3026 				}
   3027 				if strings.Contains(got, "Too-Late") {
   3028 					return errors.New("header appeared from after WriteHeader")
   3029 				}
   3030 				return nil
   3031 			},
   3032 		},
   3033 		{
   3034 			name: "header then flush",
   3035 			handler: func(rw ResponseWriter, r *Request) {
   3036 				rw.Header().Set("Content-Type", "some/type")
   3037 				rw.(Flusher).Flush()
   3038 				rw.Write([]byte("post-flush"))
   3039 				rw.Header().Set("Too-Late", "Write already wrote headers")
   3040 			},
   3041 			check: func(got string) error {
   3042 				if !strings.Contains(got, "Transfer-Encoding: chunked") {
   3043 					return errors.New("not chunked")
   3044 				}
   3045 				if strings.Contains(got, "Too-Late") {
   3046 					return errors.New("header appeared from after WriteHeader")
   3047 				}
   3048 				if !strings.Contains(got, "Content-Type: some/type") {
   3049 					return errors.New("wrong content-type")
   3050 				}
   3051 				return nil
   3052 			},
   3053 		},
   3054 		{
   3055 			name: "sniff-on-first-write content-type",
   3056 			handler: func(rw ResponseWriter, r *Request) {
   3057 				rw.Write([]byte("<html><head></head><body>some html</body></html>"))
   3058 				rw.Header().Set("Content-Type", "x/wrong")
   3059 			},
   3060 			check: func(got string) error {
   3061 				if !strings.Contains(got, "Content-Type: text/html") {
   3062 					return errors.New("wrong content-type; want html")
   3063 				}
   3064 				return nil
   3065 			},
   3066 		},
   3067 		{
   3068 			name: "explicit content-type wins",
   3069 			handler: func(rw ResponseWriter, r *Request) {
   3070 				rw.Header().Set("Content-Type", "some/type")
   3071 				rw.Write([]byte("<html><head></head><body>some html</body></html>"))
   3072 			},
   3073 			check: func(got string) error {
   3074 				if !strings.Contains(got, "Content-Type: some/type") {
   3075 					return errors.New("wrong content-type; want html")
   3076 				}
   3077 				return nil
   3078 			},
   3079 		},
   3080 		{
   3081 			name: "empty handler",
   3082 			handler: func(rw ResponseWriter, r *Request) {
   3083 			},
   3084 			check: func(got string) error {
   3085 				if !strings.Contains(got, "Content-Type: text/plain") {
   3086 					return errors.New("wrong content-type; want text/plain")
   3087 				}
   3088 				if !strings.Contains(got, "Content-Length: 0") {
   3089 					return errors.New("want 0 content-length")
   3090 				}
   3091 				return nil
   3092 			},
   3093 		},
   3094 		{
   3095 			name: "only Header, no write",
   3096 			handler: func(rw ResponseWriter, r *Request) {
   3097 				rw.Header().Set("Some-Header", "some-value")
   3098 			},
   3099 			check: func(got string) error {
   3100 				if !strings.Contains(got, "Some-Header") {
   3101 					return errors.New("didn't get header")
   3102 				}
   3103 				return nil
   3104 			},
   3105 		},
   3106 		{
   3107 			name: "WriteHeader call",
   3108 			handler: func(rw ResponseWriter, r *Request) {
   3109 				rw.WriteHeader(404)
   3110 				rw.Header().Set("Too-Late", "some-value")
   3111 			},
   3112 			check: func(got string) error {
   3113 				if !strings.Contains(got, "404") {
   3114 					return errors.New("wrong status")
   3115 				}
   3116 				if strings.Contains(got, "Too-Late") {
   3117 					return errors.New("shouldn't have seen Too-Late")
   3118 				}
   3119 				return nil
   3120 			},
   3121 		},
   3122 	}
   3123 	for _, tc := range tests {
   3124 		ht := newHandlerTest(HandlerFunc(tc.handler))
   3125 		got := ht.rawResponse("GET / HTTP/1.1\nHost: golang.org")
   3126 		if err := tc.check(got); err != nil {
   3127 			t.Errorf("%s: %v\nGot response:\n%s", tc.name, err, got)
   3128 		}
   3129 	}
   3130 }
   3131 
   3132 // goTimeout runs f, failing t if f takes more than ns to complete.
   3133 func goTimeout(t *testing.T, d time.Duration, f func()) {
   3134 	ch := make(chan bool, 2)
   3135 	timer := time.AfterFunc(d, func() {
   3136 		t.Errorf("Timeout expired after %v", d)
   3137 		ch <- true
   3138 	})
   3139 	defer timer.Stop()
   3140 	go func() {
   3141 		defer func() { ch <- true }()
   3142 		f()
   3143 	}()
   3144 	<-ch
   3145 }
   3146 
   3147 type errorListener struct {
   3148 	errs []error
   3149 }
   3150 
   3151 func (l *errorListener) Accept() (c net.Conn, err error) {
   3152 	if len(l.errs) == 0 {
   3153 		return nil, io.EOF
   3154 	}
   3155 	err = l.errs[0]
   3156 	l.errs = l.errs[1:]
   3157 	return
   3158 }
   3159 
   3160 func (l *errorListener) Close() error {
   3161 	return nil
   3162 }
   3163 
   3164 func (l *errorListener) Addr() net.Addr {
   3165 	return dummyAddr("test-address")
   3166 }
   3167 
   3168 func TestAcceptMaxFds(t *testing.T) {
   3169 	setParallel(t)
   3170 
   3171 	ln := &errorListener{[]error{
   3172 		&net.OpError{
   3173 			Op:  "accept",
   3174 			Err: syscall.EMFILE,
   3175 		}}}
   3176 	server := &Server{
   3177 		Handler:  HandlerFunc(HandlerFunc(func(ResponseWriter, *Request) {})),
   3178 		ErrorLog: log.New(ioutil.Discard, "", 0), // noisy otherwise
   3179 	}
   3180 	err := server.Serve(ln)
   3181 	if err != io.EOF {
   3182 		t.Errorf("got error %v, want EOF", err)
   3183 	}
   3184 }
   3185 
   3186 func TestWriteAfterHijack(t *testing.T) {
   3187 	req := reqBytes("GET / HTTP/1.1\nHost: golang.org")
   3188 	var buf bytes.Buffer
   3189 	wrotec := make(chan bool, 1)
   3190 	conn := &rwTestConn{
   3191 		Reader: bytes.NewReader(req),
   3192 		Writer: &buf,
   3193 		closec: make(chan bool, 1),
   3194 	}
   3195 	handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
   3196 		conn, bufrw, err := rw.(Hijacker).Hijack()
   3197 		if err != nil {
   3198 			t.Error(err)
   3199 			return
   3200 		}
   3201 		go func() {
   3202 			bufrw.Write([]byte("[hijack-to-bufw]"))
   3203 			bufrw.Flush()
   3204 			conn.Write([]byte("[hijack-to-conn]"))
   3205 			conn.Close()
   3206 			wrotec <- true
   3207 		}()
   3208 	})
   3209 	ln := &oneConnListener{conn: conn}
   3210 	go Serve(ln, handler)
   3211 	<-conn.closec
   3212 	<-wrotec
   3213 	if g, w := buf.String(), "[hijack-to-bufw][hijack-to-conn]"; g != w {
   3214 		t.Errorf("wrote %q; want %q", g, w)
   3215 	}
   3216 }
   3217 
   3218 func TestDoubleHijack(t *testing.T) {
   3219 	req := reqBytes("GET / HTTP/1.1\nHost: golang.org")
   3220 	var buf bytes.Buffer
   3221 	conn := &rwTestConn{
   3222 		Reader: bytes.NewReader(req),
   3223 		Writer: &buf,
   3224 		closec: make(chan bool, 1),
   3225 	}
   3226 	handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
   3227 		conn, _, err := rw.(Hijacker).Hijack()
   3228 		if err != nil {
   3229 			t.Error(err)
   3230 			return
   3231 		}
   3232 		_, _, err = rw.(Hijacker).Hijack()
   3233 		if err == nil {
   3234 			t.Errorf("got err = nil;  want err != nil")
   3235 		}
   3236 		conn.Close()
   3237 	})
   3238 	ln := &oneConnListener{conn: conn}
   3239 	go Serve(ln, handler)
   3240 	<-conn.closec
   3241 }
   3242 
   3243 // https://golang.org/issue/5955
   3244 // Note that this does not test the "request too large"
   3245 // exit path from the http server. This is intentional;
   3246 // not sending Connection: close is just a minor wire
   3247 // optimization and is pointless if dealing with a
   3248 // badly behaved client.
   3249 func TestHTTP10ConnectionHeader(t *testing.T) {
   3250 	defer afterTest(t)
   3251 
   3252 	mux := NewServeMux()
   3253 	mux.Handle("/", HandlerFunc(func(ResponseWriter, *Request) {}))
   3254 	ts := httptest.NewServer(mux)
   3255 	defer ts.Close()
   3256 
   3257 	// net/http uses HTTP/1.1 for requests, so write requests manually
   3258 	tests := []struct {
   3259 		req    string   // raw http request
   3260 		expect []string // expected Connection header(s)
   3261 	}{
   3262 		{
   3263 			req:    "GET / HTTP/1.0\r\n\r\n",
   3264 			expect: nil,
   3265 		},
   3266 		{
   3267 			req:    "OPTIONS * HTTP/1.0\r\n\r\n",
   3268 			expect: nil,
   3269 		},
   3270 		{
   3271 			req:    "GET / HTTP/1.0\r\nConnection: keep-alive\r\n\r\n",
   3272 			expect: []string{"keep-alive"},
   3273 		},
   3274 	}
   3275 
   3276 	for _, tt := range tests {
   3277 		conn, err := net.Dial("tcp", ts.Listener.Addr().String())
   3278 		if err != nil {
   3279 			t.Fatal("dial err:", err)
   3280 		}
   3281 
   3282 		_, err = fmt.Fprint(conn, tt.req)
   3283 		if err != nil {
   3284 			t.Fatal("conn write err:", err)
   3285 		}
   3286 
   3287 		resp, err := ReadResponse(bufio.NewReader(conn), &Request{Method: "GET"})
   3288 		if err != nil {
   3289 			t.Fatal("ReadResponse err:", err)
   3290 		}
   3291 		conn.Close()
   3292 		resp.Body.Close()
   3293 
   3294 		got := resp.Header["Connection"]
   3295 		if !reflect.DeepEqual(got, tt.expect) {
   3296 			t.Errorf("wrong Connection headers for request %q. Got %q expect %q", tt.req, got, tt.expect)
   3297 		}
   3298 	}
   3299 }
   3300 
   3301 // See golang.org/issue/5660
   3302 func TestServerReaderFromOrder_h1(t *testing.T) { testServerReaderFromOrder(t, h1Mode) }
   3303 func TestServerReaderFromOrder_h2(t *testing.T) { testServerReaderFromOrder(t, h2Mode) }
   3304 func testServerReaderFromOrder(t *testing.T, h2 bool) {
   3305 	setParallel(t)
   3306 	defer afterTest(t)
   3307 	pr, pw := io.Pipe()
   3308 	const size = 3 << 20
   3309 	cst := newClientServerTest(t, h2, HandlerFunc(func(rw ResponseWriter, req *Request) {
   3310 		rw.Header().Set("Content-Type", "text/plain") // prevent sniffing path
   3311 		done := make(chan bool)
   3312 		go func() {
   3313 			io.Copy(rw, pr)
   3314 			close(done)
   3315 		}()
   3316 		time.Sleep(25 * time.Millisecond) // give Copy a chance to break things
   3317 		n, err := io.Copy(ioutil.Discard, req.Body)
   3318 		if err != nil {
   3319 			t.Errorf("handler Copy: %v", err)
   3320 			return
   3321 		}
   3322 		if n != size {
   3323 			t.Errorf("handler Copy = %d; want %d", n, size)
   3324 		}
   3325 		pw.Write([]byte("hi"))
   3326 		pw.Close()
   3327 		<-done
   3328 	}))
   3329 	defer cst.close()
   3330 
   3331 	req, err := NewRequest("POST", cst.ts.URL, io.LimitReader(neverEnding('a'), size))
   3332 	if err != nil {
   3333 		t.Fatal(err)
   3334 	}
   3335 	res, err := cst.c.Do(req)
   3336 	if err != nil {
   3337 		t.Fatal(err)
   3338 	}
   3339 	all, err := ioutil.ReadAll(res.Body)
   3340 	if err != nil {
   3341 		t.Fatal(err)
   3342 	}
   3343 	res.Body.Close()
   3344 	if string(all) != "hi" {
   3345 		t.Errorf("Body = %q; want hi", all)
   3346 	}
   3347 }
   3348 
   3349 // Issue 6157, Issue 6685
   3350 func TestCodesPreventingContentTypeAndBody(t *testing.T) {
   3351 	for _, code := range []int{StatusNotModified, StatusNoContent, StatusContinue} {
   3352 		ht := newHandlerTest(HandlerFunc(func(w ResponseWriter, r *Request) {
   3353 			if r.URL.Path == "/header" {
   3354 				w.Header().Set("Content-Length", "123")
   3355 			}
   3356 			w.WriteHeader(code)
   3357 			if r.URL.Path == "/more" {
   3358 				w.Write([]byte("stuff"))
   3359 			}
   3360 		}))
   3361 		for _, req := range []string{
   3362 			"GET / HTTP/1.0",
   3363 			"GET /header HTTP/1.0",
   3364 			"GET /more HTTP/1.0",
   3365 			"GET / HTTP/1.1\nHost: foo",
   3366 			"GET /header HTTP/1.1\nHost: foo",
   3367 			"GET /more HTTP/1.1\nHost: foo",
   3368 		} {
   3369 			got := ht.rawResponse(req)
   3370 			wantStatus := fmt.Sprintf("%d %s", code, StatusText(code))
   3371 			if !strings.Contains(got, wantStatus) {
   3372 				t.Errorf("Code %d: Wanted %q Modified for %q: %s", code, wantStatus, req, got)
   3373 			} else if strings.Contains(got, "Content-Length") {
   3374 				t.Errorf("Code %d: Got a Content-Length from %q: %s", code, req, got)
   3375 			} else if strings.Contains(got, "stuff") {
   3376 				t.Errorf("Code %d: Response contains a body from %q: %s", code, req, got)
   3377 			}
   3378 		}
   3379 	}
   3380 }
   3381 
   3382 func TestContentTypeOkayOn204(t *testing.T) {
   3383 	ht := newHandlerTest(HandlerFunc(func(w ResponseWriter, r *Request) {
   3384 		w.Header().Set("Content-Length", "123") // suppressed
   3385 		w.Header().Set("Content-Type", "foo/bar")
   3386 		w.WriteHeader(204)
   3387 	}))
   3388 	got := ht.rawResponse("GET / HTTP/1.1\nHost: foo")
   3389 	if !strings.Contains(got, "Content-Type: foo/bar") {
   3390 		t.Errorf("Response = %q; want Content-Type: foo/bar", got)
   3391 	}
   3392 	if strings.Contains(got, "Content-Length: 123") {
   3393 		t.Errorf("Response = %q; don't want a Content-Length", got)
   3394 	}
   3395 }
   3396 
   3397 // Issue 6995
   3398 // A server Handler can receive a Request, and then turn around and
   3399 // give a copy of that Request.Body out to the Transport (e.g. any
   3400 // proxy).  So then two people own that Request.Body (both the server
   3401 // and the http client), and both think they can close it on failure.
   3402 // Therefore, all incoming server requests Bodies need to be thread-safe.
   3403 func TestTransportAndServerSharedBodyRace_h1(t *testing.T) {
   3404 	testTransportAndServerSharedBodyRace(t, h1Mode)
   3405 }
   3406 func TestTransportAndServerSharedBodyRace_h2(t *testing.T) {
   3407 	testTransportAndServerSharedBodyRace(t, h2Mode)
   3408 }
   3409 func testTransportAndServerSharedBodyRace(t *testing.T, h2 bool) {
   3410 	setParallel(t)
   3411 	defer afterTest(t)
   3412 
   3413 	const bodySize = 1 << 20
   3414 
   3415 	// errorf is like t.Errorf, but also writes to println. When
   3416 	// this test fails, it hangs. This helps debugging and I've
   3417 	// added this enough times "temporarily".  It now gets added
   3418 	// full time.
   3419 	errorf := func(format string, args ...interface{}) {
   3420 		v := fmt.Sprintf(format, args...)
   3421 		println(v)
   3422 		t.Error(v)
   3423 	}
   3424 
   3425 	unblockBackend := make(chan bool)
   3426 	backend := newClientServerTest(t, h2, HandlerFunc(func(rw ResponseWriter, req *Request) {
   3427 		gone := rw.(CloseNotifier).CloseNotify()
   3428 		didCopy := make(chan interface{})
   3429 		go func() {
   3430 			n, err := io.CopyN(rw, req.Body, bodySize)
   3431 			didCopy <- []interface{}{n, err}
   3432 		}()
   3433 		isGone := false
   3434 	Loop:
   3435 		for {
   3436 			select {
   3437 			case <-didCopy:
   3438 				break Loop
   3439 			case <-gone:
   3440 				isGone = true
   3441 			case <-time.After(time.Second):
   3442 				println("1 second passes in backend, proxygone=", isGone)
   3443 			}
   3444 		}
   3445 		<-unblockBackend
   3446 	}))
   3447 	var quitTimer *time.Timer
   3448 	defer func() { quitTimer.Stop() }()
   3449 	defer backend.close()
   3450 
   3451 	backendRespc := make(chan *Response, 1)
   3452 	var proxy *clientServerTest
   3453 	proxy = newClientServerTest(t, h2, HandlerFunc(func(rw ResponseWriter, req *Request) {
   3454 		req2, _ := NewRequest("POST", backend.ts.URL, req.Body)
   3455 		req2.ContentLength = bodySize
   3456 		cancel := make(chan struct{})
   3457 		req2.Cancel = cancel
   3458 
   3459 		bresp, err := proxy.c.Do(req2)
   3460 		if err != nil {
   3461 			errorf("Proxy outbound request: %v", err)
   3462 			return
   3463 		}
   3464 		_, err = io.CopyN(ioutil.Discard, bresp.Body, bodySize/2)
   3465 		if err != nil {
   3466 			errorf("Proxy copy error: %v", err)
   3467 			return
   3468 		}
   3469 		backendRespc <- bresp // to close later
   3470 
   3471 		// Try to cause a race: Both the Transport and the proxy handler's Server
   3472 		// will try to read/close req.Body (aka req2.Body)
   3473 		if h2 {
   3474 			close(cancel)
   3475 		} else {
   3476 			proxy.c.Transport.(*Transport).CancelRequest(req2)
   3477 		}
   3478 		rw.Write([]byte("OK"))
   3479 	}))
   3480 	defer proxy.close()
   3481 	defer func() {
   3482 		// Before we shut down our two httptest.Servers, start a timer.
   3483 		// We choose 7 seconds because httptest.Server starts logging
   3484 		// warnings to stderr at 5 seconds. If we don't disarm this bomb
   3485 		// in 7 seconds (after the two httptest.Server.Close calls above),
   3486 		// then we explode with stacks.
   3487 		quitTimer = time.AfterFunc(7*time.Second, func() {
   3488 			debug.SetTraceback("ALL")
   3489 			stacks := make([]byte, 1<<20)
   3490 			stacks = stacks[:runtime.Stack(stacks, true)]
   3491 			fmt.Fprintf(os.Stderr, "%s", stacks)
   3492 			log.Fatalf("Timeout.")
   3493 		})
   3494 	}()
   3495 
   3496 	defer close(unblockBackend)
   3497 	req, _ := NewRequest("POST", proxy.ts.URL, io.LimitReader(neverEnding('a'), bodySize))
   3498 	res, err := proxy.c.Do(req)
   3499 	if err != nil {
   3500 		t.Fatalf("Original request: %v", err)
   3501 	}
   3502 
   3503 	// Cleanup, so we don't leak goroutines.
   3504 	res.Body.Close()
   3505 	select {
   3506 	case res := <-backendRespc:
   3507 		res.Body.Close()
   3508 	default:
   3509 		// We failed earlier. (e.g. on proxy.c.Do(req2))
   3510 	}
   3511 }
   3512 
   3513 // Test that a hanging Request.Body.Read from another goroutine can't
   3514 // cause the Handler goroutine's Request.Body.Close to block.
   3515 func TestRequestBodyCloseDoesntBlock(t *testing.T) {
   3516 	t.Skipf("Skipping known issue; see golang.org/issue/7121")
   3517 	if testing.Short() {
   3518 		t.Skip("skipping in -short mode")
   3519 	}
   3520 	defer afterTest(t)
   3521 
   3522 	readErrCh := make(chan error, 1)
   3523 	errCh := make(chan error, 2)
   3524 
   3525 	server := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
   3526 		go func(body io.Reader) {
   3527 			_, err := body.Read(make([]byte, 100))
   3528 			readErrCh <- err
   3529 		}(req.Body)
   3530 		time.Sleep(500 * time.Millisecond)
   3531 	}))
   3532 	defer server.Close()
   3533 
   3534 	closeConn := make(chan bool)
   3535 	defer close(closeConn)
   3536 	go func() {
   3537 		conn, err := net.Dial("tcp", server.Listener.Addr().String())
   3538 		if err != nil {
   3539 			errCh <- err
   3540 			return
   3541 		}
   3542 		defer conn.Close()
   3543 		_, err = conn.Write([]byte("POST / HTTP/1.1\r\nConnection: close\r\nHost: foo\r\nContent-Length: 100000\r\n\r\n"))
   3544 		if err != nil {
   3545 			errCh <- err
   3546 			return
   3547 		}
   3548 		// And now just block, making the server block on our
   3549 		// 100000 bytes of body that will never arrive.
   3550 		<-closeConn
   3551 	}()
   3552 	select {
   3553 	case err := <-readErrCh:
   3554 		if err == nil {
   3555 			t.Error("Read was nil. Expected error.")
   3556 		}
   3557 	case err := <-errCh:
   3558 		t.Error(err)
   3559 	case <-time.After(5 * time.Second):
   3560 		t.Error("timeout")
   3561 	}
   3562 }
   3563 
   3564 // test that ResponseWriter implements io.stringWriter.
   3565 func TestResponseWriterWriteString(t *testing.T) {
   3566 	okc := make(chan bool, 1)
   3567 	ht := newHandlerTest(HandlerFunc(func(w ResponseWriter, r *Request) {
   3568 		type stringWriter interface {
   3569 			WriteString(s string) (n int, err error)
   3570 		}
   3571 		_, ok := w.(stringWriter)
   3572 		okc <- ok
   3573 	}))
   3574 	ht.rawResponse("GET / HTTP/1.0")
   3575 	select {
   3576 	case ok := <-okc:
   3577 		if !ok {
   3578 			t.Error("ResponseWriter did not implement io.stringWriter")
   3579 		}
   3580 	default:
   3581 		t.Error("handler was never called")
   3582 	}
   3583 }
   3584 
   3585 func TestAppendTime(t *testing.T) {
   3586 	var b [len(TimeFormat)]byte
   3587 	t1 := time.Date(2013, 9, 21, 15, 41, 0, 0, time.FixedZone("CEST", 2*60*60))
   3588 	res := ExportAppendTime(b[:0], t1)
   3589 	t2, err := ParseTime(string(res))
   3590 	if err != nil {
   3591 		t.Fatalf("Error parsing time: %s", err)
   3592 	}
   3593 	if !t1.Equal(t2) {
   3594 		t.Fatalf("Times differ; expected: %v, got %v (%s)", t1, t2, string(res))
   3595 	}
   3596 }
   3597 
   3598 func TestServerConnState(t *testing.T) {
   3599 	setParallel(t)
   3600 	defer afterTest(t)
   3601 	handler := map[string]func(w ResponseWriter, r *Request){
   3602 		"/": func(w ResponseWriter, r *Request) {
   3603 			fmt.Fprintf(w, "Hello.")
   3604 		},
   3605 		"/close": func(w ResponseWriter, r *Request) {
   3606 			w.Header().Set("Connection", "close")
   3607 			fmt.Fprintf(w, "Hello.")
   3608 		},
   3609 		"/hijack": func(w ResponseWriter, r *Request) {
   3610 			c, _, _ := w.(Hijacker).Hijack()
   3611 			c.Write([]byte("HTTP/1.0 200 OK\r\nConnection: close\r\n\r\nHello."))
   3612 			c.Close()
   3613 		},
   3614 		"/hijack-panic": func(w ResponseWriter, r *Request) {
   3615 			c, _, _ := w.(Hijacker).Hijack()
   3616 			c.Write([]byte("HTTP/1.0 200 OK\r\nConnection: close\r\n\r\nHello."))
   3617 			c.Close()
   3618 			panic("intentional panic")
   3619 		},
   3620 	}
   3621 	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   3622 		handler[r.URL.Path](w, r)
   3623 	}))
   3624 	defer ts.Close()
   3625 
   3626 	var mu sync.Mutex // guard stateLog and connID
   3627 	var stateLog = map[int][]ConnState{}
   3628 	var connID = map[net.Conn]int{}
   3629 
   3630 	ts.Config.ErrorLog = log.New(ioutil.Discard, "", 0)
   3631 	ts.Config.ConnState = func(c net.Conn, state ConnState) {
   3632 		if c == nil {
   3633 			t.Errorf("nil conn seen in state %s", state)
   3634 			return
   3635 		}
   3636 		mu.Lock()
   3637 		defer mu.Unlock()
   3638 		id, ok := connID[c]
   3639 		if !ok {
   3640 			id = len(connID) + 1
   3641 			connID[c] = id
   3642 		}
   3643 		stateLog[id] = append(stateLog[id], state)
   3644 	}
   3645 	ts.Start()
   3646 
   3647 	tr := &Transport{}
   3648 	defer tr.CloseIdleConnections()
   3649 	c := &Client{Transport: tr}
   3650 
   3651 	mustGet := func(url string, headers ...string) {
   3652 		req, err := NewRequest("GET", url, nil)
   3653 		if err != nil {
   3654 			t.Fatal(err)
   3655 		}
   3656 		for len(headers) > 0 {
   3657 			req.Header.Add(headers[0], headers[1])
   3658 			headers = headers[2:]
   3659 		}
   3660 		res, err := c.Do(req)
   3661 		if err != nil {
   3662 			t.Errorf("Error fetching %s: %v", url, err)
   3663 			return
   3664 		}
   3665 		_, err = ioutil.ReadAll(res.Body)
   3666 		defer res.Body.Close()
   3667 		if err != nil {
   3668 			t.Errorf("Error reading %s: %v", url, err)
   3669 		}
   3670 	}
   3671 
   3672 	mustGet(ts.URL + "/")
   3673 	mustGet(ts.URL + "/close")
   3674 
   3675 	mustGet(ts.URL + "/")
   3676 	mustGet(ts.URL+"/", "Connection", "close")
   3677 
   3678 	mustGet(ts.URL + "/hijack")
   3679 	mustGet(ts.URL + "/hijack-panic")
   3680 
   3681 	// New->Closed
   3682 	{
   3683 		c, err := net.Dial("tcp", ts.Listener.Addr().String())
   3684 		if err != nil {
   3685 			t.Fatal(err)
   3686 		}
   3687 		c.Close()
   3688 	}
   3689 
   3690 	// New->Active->Closed
   3691 	{
   3692 		c, err := net.Dial("tcp", ts.Listener.Addr().String())
   3693 		if err != nil {
   3694 			t.Fatal(err)
   3695 		}
   3696 		if _, err := io.WriteString(c, "BOGUS REQUEST\r\n\r\n"); err != nil {
   3697 			t.Fatal(err)
   3698 		}
   3699 		c.Read(make([]byte, 1)) // block until server hangs up on us
   3700 		c.Close()
   3701 	}
   3702 
   3703 	// New->Idle->Closed
   3704 	{
   3705 		c, err := net.Dial("tcp", ts.Listener.Addr().String())
   3706 		if err != nil {
   3707 			t.Fatal(err)
   3708 		}
   3709 		if _, err := io.WriteString(c, "GET / HTTP/1.1\r\nHost: foo\r\n\r\n"); err != nil {
   3710 			t.Fatal(err)
   3711 		}
   3712 		res, err := ReadResponse(bufio.NewReader(c), nil)
   3713 		if err != nil {
   3714 			t.Fatal(err)
   3715 		}
   3716 		if _, err := io.Copy(ioutil.Discard, res.Body); err != nil {
   3717 			t.Fatal(err)
   3718 		}
   3719 		c.Close()
   3720 	}
   3721 
   3722 	want := map[int][]ConnState{
   3723 		1: {StateNew, StateActive, StateIdle, StateActive, StateClosed},
   3724 		2: {StateNew, StateActive, StateIdle, StateActive, StateClosed},
   3725 		3: {StateNew, StateActive, StateHijacked},
   3726 		4: {StateNew, StateActive, StateHijacked},
   3727 		5: {StateNew, StateClosed},
   3728 		6: {StateNew, StateActive, StateClosed},
   3729 		7: {StateNew, StateActive, StateIdle, StateClosed},
   3730 	}
   3731 	logString := func(m map[int][]ConnState) string {
   3732 		var b bytes.Buffer
   3733 		var keys []int
   3734 		for id := range m {
   3735 			keys = append(keys, id)
   3736 		}
   3737 		sort.Ints(keys)
   3738 		for _, id := range keys {
   3739 			fmt.Fprintf(&b, "Conn %d: ", id)
   3740 			for _, s := range m[id] {
   3741 				fmt.Fprintf(&b, "%s ", s)
   3742 			}
   3743 			b.WriteString("\n")
   3744 		}
   3745 		return b.String()
   3746 	}
   3747 
   3748 	for i := 0; i < 5; i++ {
   3749 		time.Sleep(time.Duration(i) * 50 * time.Millisecond)
   3750 		mu.Lock()
   3751 		match := reflect.DeepEqual(stateLog, want)
   3752 		mu.Unlock()
   3753 		if match {
   3754 			return
   3755 		}
   3756 	}
   3757 
   3758 	mu.Lock()
   3759 	t.Errorf("Unexpected events.\nGot log:\n%s\n   Want:\n%s\n", logString(stateLog), logString(want))
   3760 	mu.Unlock()
   3761 }
   3762 
   3763 func TestServerKeepAlivesEnabled(t *testing.T) {
   3764 	defer afterTest(t)
   3765 	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
   3766 	ts.Config.SetKeepAlivesEnabled(false)
   3767 	ts.Start()
   3768 	defer ts.Close()
   3769 	res, err := Get(ts.URL)
   3770 	if err != nil {
   3771 		t.Fatal(err)
   3772 	}
   3773 	defer res.Body.Close()
   3774 	if !res.Close {
   3775 		t.Errorf("Body.Close == false; want true")
   3776 	}
   3777 }
   3778 
   3779 // golang.org/issue/7856
   3780 func TestServerEmptyBodyRace_h1(t *testing.T) { testServerEmptyBodyRace(t, h1Mode) }
   3781 func TestServerEmptyBodyRace_h2(t *testing.T) { testServerEmptyBodyRace(t, h2Mode) }
   3782 func testServerEmptyBodyRace(t *testing.T, h2 bool) {
   3783 	setParallel(t)
   3784 	defer afterTest(t)
   3785 	var n int32
   3786 	cst := newClientServerTest(t, h2, HandlerFunc(func(rw ResponseWriter, req *Request) {
   3787 		atomic.AddInt32(&n, 1)
   3788 	}))
   3789 	defer cst.close()
   3790 	var wg sync.WaitGroup
   3791 	const reqs = 20
   3792 	for i := 0; i < reqs; i++ {
   3793 		wg.Add(1)
   3794 		go func() {
   3795 			defer wg.Done()
   3796 			res, err := cst.c.Get(cst.ts.URL)
   3797 			if err != nil {
   3798 				t.Error(err)
   3799 				return
   3800 			}
   3801 			defer res.Body.Close()
   3802 			_, err = io.Copy(ioutil.Discard, res.Body)
   3803 			if err != nil {
   3804 				t.Error(err)
   3805 				return
   3806 			}
   3807 		}()
   3808 	}
   3809 	wg.Wait()
   3810 	if got := atomic.LoadInt32(&n); got != reqs {
   3811 		t.Errorf("handler ran %d times; want %d", got, reqs)
   3812 	}
   3813 }
   3814 
   3815 func TestServerConnStateNew(t *testing.T) {
   3816 	sawNew := false // if the test is buggy, we'll race on this variable.
   3817 	srv := &Server{
   3818 		ConnState: func(c net.Conn, state ConnState) {
   3819 			if state == StateNew {
   3820 				sawNew = true // testing that this write isn't racy
   3821 			}
   3822 		},
   3823 		Handler: HandlerFunc(func(w ResponseWriter, r *Request) {}), // irrelevant
   3824 	}
   3825 	srv.Serve(&oneConnListener{
   3826 		conn: &rwTestConn{
   3827 			Reader: strings.NewReader("GET / HTTP/1.1\r\nHost: foo\r\n\r\n"),
   3828 			Writer: ioutil.Discard,
   3829 		},
   3830 	})
   3831 	if !sawNew { // testing that this read isn't racy
   3832 		t.Error("StateNew not seen")
   3833 	}
   3834 }
   3835 
   3836 type closeWriteTestConn struct {
   3837 	rwTestConn
   3838 	didCloseWrite bool
   3839 }
   3840 
   3841 func (c *closeWriteTestConn) CloseWrite() error {
   3842 	c.didCloseWrite = true
   3843 	return nil
   3844 }
   3845 
   3846 func TestCloseWrite(t *testing.T) {
   3847 	setParallel(t)
   3848 	var srv Server
   3849 	var testConn closeWriteTestConn
   3850 	c := ExportServerNewConn(&srv, &testConn)
   3851 	ExportCloseWriteAndWait(c)
   3852 	if !testConn.didCloseWrite {
   3853 		t.Error("didn't see CloseWrite call")
   3854 	}
   3855 }
   3856 
   3857 // This verifies that a handler can Flush and then Hijack.
   3858 //
   3859 // An similar test crashed once during development, but it was only
   3860 // testing this tangentially and temporarily until another TODO was
   3861 // fixed.
   3862 //
   3863 // So add an explicit test for this.
   3864 func TestServerFlushAndHijack(t *testing.T) {
   3865 	defer afterTest(t)
   3866 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   3867 		io.WriteString(w, "Hello, ")
   3868 		w.(Flusher).Flush()
   3869 		conn, buf, _ := w.(Hijacker).Hijack()
   3870 		buf.WriteString("6\r\nworld!\r\n0\r\n\r\n")
   3871 		if err := buf.Flush(); err != nil {
   3872 			t.Error(err)
   3873 		}
   3874 		if err := conn.Close(); err != nil {
   3875 			t.Error(err)
   3876 		}
   3877 	}))
   3878 	defer ts.Close()
   3879 	res, err := Get(ts.URL)
   3880 	if err != nil {
   3881 		t.Fatal(err)
   3882 	}
   3883 	defer res.Body.Close()
   3884 	all, err := ioutil.ReadAll(res.Body)
   3885 	if err != nil {
   3886 		t.Fatal(err)
   3887 	}
   3888 	if want := "Hello, world!"; string(all) != want {
   3889 		t.Errorf("Got %q; want %q", all, want)
   3890 	}
   3891 }
   3892 
   3893 // golang.org/issue/8534 -- the Server shouldn't reuse a connection
   3894 // for keep-alive after it's seen any Write error (e.g. a timeout) on
   3895 // that net.Conn.
   3896 //
   3897 // To test, verify we don't timeout or see fewer unique client
   3898 // addresses (== unique connections) than requests.
   3899 func TestServerKeepAliveAfterWriteError(t *testing.T) {
   3900 	if testing.Short() {
   3901 		t.Skip("skipping in -short mode")
   3902 	}
   3903 	defer afterTest(t)
   3904 	const numReq = 3
   3905 	addrc := make(chan string, numReq)
   3906 	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   3907 		addrc <- r.RemoteAddr
   3908 		time.Sleep(500 * time.Millisecond)
   3909 		w.(Flusher).Flush()
   3910 	}))
   3911 	ts.Config.WriteTimeout = 250 * time.Millisecond
   3912 	ts.Start()
   3913 	defer ts.Close()
   3914 
   3915 	errc := make(chan error, numReq)
   3916 	go func() {
   3917 		defer close(errc)
   3918 		for i := 0; i < numReq; i++ {
   3919 			res, err := Get(ts.URL)
   3920 			if res != nil {
   3921 				res.Body.Close()
   3922 			}
   3923 			errc <- err
   3924 		}
   3925 	}()
   3926 
   3927 	timeout := time.NewTimer(numReq * 2 * time.Second) // 4x overkill
   3928 	defer timeout.Stop()
   3929 	addrSeen := map[string]bool{}
   3930 	numOkay := 0
   3931 	for {
   3932 		select {
   3933 		case v := <-addrc:
   3934 			addrSeen[v] = true
   3935 		case err, ok := <-errc:
   3936 			if !ok {
   3937 				if len(addrSeen) != numReq {
   3938 					t.Errorf("saw %d unique client addresses; want %d", len(addrSeen), numReq)
   3939 				}
   3940 				if numOkay != 0 {
   3941 					t.Errorf("got %d successful client requests; want 0", numOkay)
   3942 				}
   3943 				return
   3944 			}
   3945 			if err == nil {
   3946 				numOkay++
   3947 			}
   3948 		case <-timeout.C:
   3949 			t.Fatal("timeout waiting for requests to complete")
   3950 		}
   3951 	}
   3952 }
   3953 
   3954 // Issue 9987: shouldn't add automatic Content-Length (or
   3955 // Content-Type) if a Transfer-Encoding was set by the handler.
   3956 func TestNoContentLengthIfTransferEncoding(t *testing.T) {
   3957 	defer afterTest(t)
   3958 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   3959 		w.Header().Set("Transfer-Encoding", "foo")
   3960 		io.WriteString(w, "<html>")
   3961 	}))
   3962 	defer ts.Close()
   3963 	c, err := net.Dial("tcp", ts.Listener.Addr().String())
   3964 	if err != nil {
   3965 		t.Fatalf("Dial: %v", err)
   3966 	}
   3967 	defer c.Close()
   3968 	if _, err := io.WriteString(c, "GET / HTTP/1.1\r\nHost: foo\r\n\r\n"); err != nil {
   3969 		t.Fatal(err)
   3970 	}
   3971 	bs := bufio.NewScanner(c)
   3972 	var got bytes.Buffer
   3973 	for bs.Scan() {
   3974 		if strings.TrimSpace(bs.Text()) == "" {
   3975 			break
   3976 		}
   3977 		got.WriteString(bs.Text())
   3978 		got.WriteByte('\n')
   3979 	}
   3980 	if err := bs.Err(); err != nil {
   3981 		t.Fatal(err)
   3982 	}
   3983 	if strings.Contains(got.String(), "Content-Length") {
   3984 		t.Errorf("Unexpected Content-Length in response headers: %s", got.String())
   3985 	}
   3986 	if strings.Contains(got.String(), "Content-Type") {
   3987 		t.Errorf("Unexpected Content-Type in response headers: %s", got.String())
   3988 	}
   3989 }
   3990 
   3991 // tolerate extra CRLF(s) before Request-Line on subsequent requests on a conn
   3992 // Issue 10876.
   3993 func TestTolerateCRLFBeforeRequestLine(t *testing.T) {
   3994 	req := []byte("POST / HTTP/1.1\r\nHost: golang.org\r\nContent-Length: 3\r\n\r\nABC" +
   3995 		"\r\n\r\n" + // <-- this stuff is bogus, but we'll ignore it
   3996 		"GET / HTTP/1.1\r\nHost: golang.org\r\n\r\n")
   3997 	var buf bytes.Buffer
   3998 	conn := &rwTestConn{
   3999 		Reader: bytes.NewReader(req),
   4000 		Writer: &buf,
   4001 		closec: make(chan bool, 1),
   4002 	}
   4003 	ln := &oneConnListener{conn: conn}
   4004 	numReq := 0
   4005 	go Serve(ln, HandlerFunc(func(rw ResponseWriter, r *Request) {
   4006 		numReq++
   4007 	}))
   4008 	<-conn.closec
   4009 	if numReq != 2 {
   4010 		t.Errorf("num requests = %d; want 2", numReq)
   4011 		t.Logf("Res: %s", buf.Bytes())
   4012 	}
   4013 }
   4014 
   4015 func TestIssue13893_Expect100(t *testing.T) {
   4016 	// test that the Server doesn't filter out Expect headers.
   4017 	req := reqBytes(`PUT /readbody HTTP/1.1
   4018 User-Agent: PycURL/7.22.0
   4019 Host: 127.0.0.1:9000
   4020 Accept: */*
   4021 Expect: 100-continue
   4022 Content-Length: 10
   4023 
   4024 HelloWorld
   4025 
   4026 `)
   4027 	var buf bytes.Buffer
   4028 	conn := &rwTestConn{
   4029 		Reader: bytes.NewReader(req),
   4030 		Writer: &buf,
   4031 		closec: make(chan bool, 1),
   4032 	}
   4033 	ln := &oneConnListener{conn: conn}
   4034 	go Serve(ln, HandlerFunc(func(w ResponseWriter, r *Request) {
   4035 		if _, ok := r.Header["Expect"]; !ok {
   4036 			t.Error("Expect header should not be filtered out")
   4037 		}
   4038 	}))
   4039 	<-conn.closec
   4040 }
   4041 
   4042 func TestIssue11549_Expect100(t *testing.T) {
   4043 	req := reqBytes(`PUT /readbody HTTP/1.1
   4044 User-Agent: PycURL/7.22.0
   4045 Host: 127.0.0.1:9000
   4046 Accept: */*
   4047 Expect: 100-continue
   4048 Content-Length: 10
   4049 
   4050 HelloWorldPUT /noreadbody HTTP/1.1
   4051 User-Agent: PycURL/7.22.0
   4052 Host: 127.0.0.1:9000
   4053 Accept: */*
   4054 Expect: 100-continue
   4055 Content-Length: 10
   4056 
   4057 GET /should-be-ignored HTTP/1.1
   4058 Host: foo
   4059 
   4060 `)
   4061 	var buf bytes.Buffer
   4062 	conn := &rwTestConn{
   4063 		Reader: bytes.NewReader(req),
   4064 		Writer: &buf,
   4065 		closec: make(chan bool, 1),
   4066 	}
   4067 	ln := &oneConnListener{conn: conn}
   4068 	numReq := 0
   4069 	go Serve(ln, HandlerFunc(func(w ResponseWriter, r *Request) {
   4070 		numReq++
   4071 		if r.URL.Path == "/readbody" {
   4072 			ioutil.ReadAll(r.Body)
   4073 		}
   4074 		io.WriteString(w, "Hello world!")
   4075 	}))
   4076 	<-conn.closec
   4077 	if numReq != 2 {
   4078 		t.Errorf("num requests = %d; want 2", numReq)
   4079 	}
   4080 	if !strings.Contains(buf.String(), "Connection: close\r\n") {
   4081 		t.Errorf("expected 'Connection: close' in response; got: %s", buf.String())
   4082 	}
   4083 }
   4084 
   4085 // If a Handler finishes and there's an unread request body,
   4086 // verify the server try to do implicit read on it before replying.
   4087 func TestHandlerFinishSkipBigContentLengthRead(t *testing.T) {
   4088 	setParallel(t)
   4089 	conn := &testConn{closec: make(chan bool)}
   4090 	conn.readBuf.Write([]byte(fmt.Sprintf(
   4091 		"POST / HTTP/1.1\r\n" +
   4092 			"Host: test\r\n" +
   4093 			"Content-Length: 9999999999\r\n" +
   4094 			"\r\n" + strings.Repeat("a", 1<<20))))
   4095 
   4096 	ls := &oneConnListener{conn}
   4097 	var inHandlerLen int
   4098 	go Serve(ls, HandlerFunc(func(rw ResponseWriter, req *Request) {
   4099 		inHandlerLen = conn.readBuf.Len()
   4100 		rw.WriteHeader(404)
   4101 	}))
   4102 	<-conn.closec
   4103 	afterHandlerLen := conn.readBuf.Len()
   4104 
   4105 	if afterHandlerLen != inHandlerLen {
   4106 		t.Errorf("unexpected implicit read. Read buffer went from %d -> %d", inHandlerLen, afterHandlerLen)
   4107 	}
   4108 }
   4109 
   4110 func TestHandlerSetsBodyNil_h1(t *testing.T) { testHandlerSetsBodyNil(t, h1Mode) }
   4111 func TestHandlerSetsBodyNil_h2(t *testing.T) { testHandlerSetsBodyNil(t, h2Mode) }
   4112 func testHandlerSetsBodyNil(t *testing.T, h2 bool) {
   4113 	defer afterTest(t)
   4114 	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
   4115 		r.Body = nil
   4116 		fmt.Fprintf(w, "%v", r.RemoteAddr)
   4117 	}))
   4118 	defer cst.close()
   4119 	get := func() string {
   4120 		res, err := cst.c.Get(cst.ts.URL)
   4121 		if err != nil {
   4122 			t.Fatal(err)
   4123 		}
   4124 		defer res.Body.Close()
   4125 		slurp, err := ioutil.ReadAll(res.Body)
   4126 		if err != nil {
   4127 			t.Fatal(err)
   4128 		}
   4129 		return string(slurp)
   4130 	}
   4131 	a, b := get(), get()
   4132 	if a != b {
   4133 		t.Errorf("Failed to reuse connections between requests: %v vs %v", a, b)
   4134 	}
   4135 }
   4136 
   4137 // Test that we validate the Host header.
   4138 // Issue 11206 (invalid bytes in Host) and 13624 (Host present in HTTP/1.1)
   4139 func TestServerValidatesHostHeader(t *testing.T) {
   4140 	tests := []struct {
   4141 		proto string
   4142 		host  string
   4143 		want  int
   4144 	}{
   4145 		{"HTTP/0.9", "", 400},
   4146 
   4147 		{"HTTP/1.1", "", 400},
   4148 		{"HTTP/1.1", "Host: \r\n", 200},
   4149 		{"HTTP/1.1", "Host: 1.2.3.4\r\n", 200},
   4150 		{"HTTP/1.1", "Host: foo.com\r\n", 200},
   4151 		{"HTTP/1.1", "Host: foo-bar_baz.com\r\n", 200},
   4152 		{"HTTP/1.1", "Host: foo.com:80\r\n", 200},
   4153 		{"HTTP/1.1", "Host: ::1\r\n", 200},
   4154 		{"HTTP/1.1", "Host: [::1]\r\n", 200}, // questionable without port, but accept it
   4155 		{"HTTP/1.1", "Host: [::1]:80\r\n", 200},
   4156 		{"HTTP/1.1", "Host: [::1%25en0]:80\r\n", 200},
   4157 		{"HTTP/1.1", "Host: 1.2.3.4\r\n", 200},
   4158 		{"HTTP/1.1", "Host: \x06\r\n", 400},
   4159 		{"HTTP/1.1", "Host: \xff\r\n", 400},
   4160 		{"HTTP/1.1", "Host: {\r\n", 400},
   4161 		{"HTTP/1.1", "Host: }\r\n", 400},
   4162 		{"HTTP/1.1", "Host: first\r\nHost: second\r\n", 400},
   4163 
   4164 		// HTTP/1.0 can lack a host header, but if present
   4165 		// must play by the rules too:
   4166 		{"HTTP/1.0", "", 200},
   4167 		{"HTTP/1.0", "Host: first\r\nHost: second\r\n", 400},
   4168 		{"HTTP/1.0", "Host: \xff\r\n", 400},
   4169 
   4170 		// Make an exception for HTTP upgrade requests:
   4171 		{"PRI * HTTP/2.0", "", 200},
   4172 
   4173 		// But not other HTTP/2 stuff:
   4174 		{"PRI / HTTP/2.0", "", 400},
   4175 		{"GET / HTTP/2.0", "", 400},
   4176 		{"GET / HTTP/3.0", "", 400},
   4177 	}
   4178 	for _, tt := range tests {
   4179 		conn := &testConn{closec: make(chan bool, 1)}
   4180 		methodTarget := "GET / "
   4181 		if !strings.HasPrefix(tt.proto, "HTTP/") {
   4182 			methodTarget = ""
   4183 		}
   4184 		io.WriteString(&conn.readBuf, methodTarget+tt.proto+"\r\n"+tt.host+"\r\n")
   4185 
   4186 		ln := &oneConnListener{conn}
   4187 		srv := Server{
   4188 			ErrorLog: quietLog,
   4189 			Handler:  HandlerFunc(func(ResponseWriter, *Request) {}),
   4190 		}
   4191 		go srv.Serve(ln)
   4192 		<-conn.closec
   4193 		res, err := ReadResponse(bufio.NewReader(&conn.writeBuf), nil)
   4194 		if err != nil {
   4195 			t.Errorf("For %s %q, ReadResponse: %v", tt.proto, tt.host, res)
   4196 			continue
   4197 		}
   4198 		if res.StatusCode != tt.want {
   4199 			t.Errorf("For %s %q, Status = %d; want %d", tt.proto, tt.host, res.StatusCode, tt.want)
   4200 		}
   4201 	}
   4202 }
   4203 
   4204 func TestServerHandlersCanHandleH2PRI(t *testing.T) {
   4205 	const upgradeResponse = "upgrade here"
   4206 	defer afterTest(t)
   4207 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   4208 		conn, br, err := w.(Hijacker).Hijack()
   4209 		defer conn.Close()
   4210 		if r.Method != "PRI" || r.RequestURI != "*" {
   4211 			t.Errorf("Got method/target %q %q; want PRI *", r.Method, r.RequestURI)
   4212 			return
   4213 		}
   4214 		if !r.Close {
   4215 			t.Errorf("Request.Close = true; want false")
   4216 		}
   4217 		const want = "SM\r\n\r\n"
   4218 		buf := make([]byte, len(want))
   4219 		n, err := io.ReadFull(br, buf)
   4220 		if err != nil || string(buf[:n]) != want {
   4221 			t.Errorf("Read = %v, %v (%q), want %q", n, err, buf[:n], want)
   4222 			return
   4223 		}
   4224 		io.WriteString(conn, upgradeResponse)
   4225 	}))
   4226 	defer ts.Close()
   4227 
   4228 	c, err := net.Dial("tcp", ts.Listener.Addr().String())
   4229 	if err != nil {
   4230 		t.Fatalf("Dial: %v", err)
   4231 	}
   4232 	defer c.Close()
   4233 	io.WriteString(c, "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n")
   4234 	slurp, err := ioutil.ReadAll(c)
   4235 	if err != nil {
   4236 		t.Fatal(err)
   4237 	}
   4238 	if string(slurp) != upgradeResponse {
   4239 		t.Errorf("Handler response = %q; want %q", slurp, upgradeResponse)
   4240 	}
   4241 }
   4242 
   4243 // Test that we validate the valid bytes in HTTP/1 headers.
   4244 // Issue 11207.
   4245 func TestServerValidatesHeaders(t *testing.T) {
   4246 	setParallel(t)
   4247 	tests := []struct {
   4248 		header string
   4249 		want   int
   4250 	}{
   4251 		{"", 200},
   4252 		{"Foo: bar\r\n", 200},
   4253 		{"X-Foo: bar\r\n", 200},
   4254 		{"Foo: a space\r\n", 200},
   4255 
   4256 		{"A space: foo\r\n", 400},                            // space in header
   4257 		{"foo\xffbar: foo\r\n", 400},                         // binary in header
   4258 		{"foo\x00bar: foo\r\n", 400},                         // binary in header
   4259 		{"Foo: " + strings.Repeat("x", 1<<21) + "\r\n", 431}, // header too large
   4260 
   4261 		{"foo: foo foo\r\n", 200},    // LWS space is okay
   4262 		{"foo: foo\tfoo\r\n", 200},   // LWS tab is okay
   4263 		{"foo: foo\x00foo\r\n", 400}, // CTL 0x00 in value is bad
   4264 		{"foo: foo\x7ffoo\r\n", 400}, // CTL 0x7f in value is bad
   4265 		{"foo: foo\xfffoo\r\n", 200}, // non-ASCII high octets in value are fine
   4266 	}
   4267 	for _, tt := range tests {
   4268 		conn := &testConn{closec: make(chan bool, 1)}
   4269 		io.WriteString(&conn.readBuf, "GET / HTTP/1.1\r\nHost: foo\r\n"+tt.header+"\r\n")
   4270 
   4271 		ln := &oneConnListener{conn}
   4272 		srv := Server{
   4273 			ErrorLog: quietLog,
   4274 			Handler:  HandlerFunc(func(ResponseWriter, *Request) {}),
   4275 		}
   4276 		go srv.Serve(ln)
   4277 		<-conn.closec
   4278 		res, err := ReadResponse(bufio.NewReader(&conn.writeBuf), nil)
   4279 		if err != nil {
   4280 			t.Errorf("For %q, ReadResponse: %v", tt.header, res)
   4281 			continue
   4282 		}
   4283 		if res.StatusCode != tt.want {
   4284 			t.Errorf("For %q, Status = %d; want %d", tt.header, res.StatusCode, tt.want)
   4285 		}
   4286 	}
   4287 }
   4288 
   4289 func TestServerRequestContextCancel_ServeHTTPDone_h1(t *testing.T) {
   4290 	testServerRequestContextCancel_ServeHTTPDone(t, h1Mode)
   4291 }
   4292 func TestServerRequestContextCancel_ServeHTTPDone_h2(t *testing.T) {
   4293 	testServerRequestContextCancel_ServeHTTPDone(t, h2Mode)
   4294 }
   4295 func testServerRequestContextCancel_ServeHTTPDone(t *testing.T, h2 bool) {
   4296 	setParallel(t)
   4297 	defer afterTest(t)
   4298 	ctxc := make(chan context.Context, 1)
   4299 	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
   4300 		ctx := r.Context()
   4301 		select {
   4302 		case <-ctx.Done():
   4303 			t.Error("should not be Done in ServeHTTP")
   4304 		default:
   4305 		}
   4306 		ctxc <- ctx
   4307 	}))
   4308 	defer cst.close()
   4309 	res, err := cst.c.Get(cst.ts.URL)
   4310 	if err != nil {
   4311 		t.Fatal(err)
   4312 	}
   4313 	res.Body.Close()
   4314 	ctx := <-ctxc
   4315 	select {
   4316 	case <-ctx.Done():
   4317 	default:
   4318 		t.Error("context should be done after ServeHTTP completes")
   4319 	}
   4320 }
   4321 
   4322 // Tests that the Request.Context available to the Handler is canceled
   4323 // if the peer closes their TCP connection. This requires that the server
   4324 // is always blocked in a Read call so it notices the EOF from the client.
   4325 // See issues 15927 and 15224.
   4326 func TestServerRequestContextCancel_ConnClose(t *testing.T) {
   4327 	setParallel(t)
   4328 	defer afterTest(t)
   4329 	inHandler := make(chan struct{})
   4330 	handlerDone := make(chan struct{})
   4331 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   4332 		close(inHandler)
   4333 		select {
   4334 		case <-r.Context().Done():
   4335 		case <-time.After(3 * time.Second):
   4336 			t.Errorf("timeout waiting for context to be done")
   4337 		}
   4338 		close(handlerDone)
   4339 	}))
   4340 	defer ts.Close()
   4341 	c, err := net.Dial("tcp", ts.Listener.Addr().String())
   4342 	if err != nil {
   4343 		t.Fatal(err)
   4344 	}
   4345 	defer c.Close()
   4346 	io.WriteString(c, "GET / HTTP/1.1\r\nHost: foo\r\n\r\n")
   4347 	select {
   4348 	case <-inHandler:
   4349 	case <-time.After(3 * time.Second):
   4350 		t.Fatalf("timeout waiting to see ServeHTTP get called")
   4351 	}
   4352 	c.Close() // this should trigger the context being done
   4353 
   4354 	select {
   4355 	case <-handlerDone:
   4356 	case <-time.After(4 * time.Second):
   4357 		t.Fatalf("timeout waiting to see ServeHTTP exit")
   4358 	}
   4359 }
   4360 
   4361 func TestServerContext_ServerContextKey_h1(t *testing.T) {
   4362 	testServerContext_ServerContextKey(t, h1Mode)
   4363 }
   4364 func TestServerContext_ServerContextKey_h2(t *testing.T) {
   4365 	testServerContext_ServerContextKey(t, h2Mode)
   4366 }
   4367 func testServerContext_ServerContextKey(t *testing.T, h2 bool) {
   4368 	setParallel(t)
   4369 	defer afterTest(t)
   4370 	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
   4371 		ctx := r.Context()
   4372 		got := ctx.Value(ServerContextKey)
   4373 		if _, ok := got.(*Server); !ok {
   4374 			t.Errorf("context value = %T; want *http.Server", got)
   4375 		}
   4376 
   4377 		got = ctx.Value(LocalAddrContextKey)
   4378 		if addr, ok := got.(net.Addr); !ok {
   4379 			t.Errorf("local addr value = %T; want net.Addr", got)
   4380 		} else if fmt.Sprint(addr) != r.Host {
   4381 			t.Errorf("local addr = %v; want %v", addr, r.Host)
   4382 		}
   4383 	}))
   4384 	defer cst.close()
   4385 	res, err := cst.c.Get(cst.ts.URL)
   4386 	if err != nil {
   4387 		t.Fatal(err)
   4388 	}
   4389 	res.Body.Close()
   4390 }
   4391 
   4392 // https://golang.org/issue/15960
   4393 func TestHandlerSetTransferEncodingChunked(t *testing.T) {
   4394 	setParallel(t)
   4395 	defer afterTest(t)
   4396 	ht := newHandlerTest(HandlerFunc(func(w ResponseWriter, r *Request) {
   4397 		w.Header().Set("Transfer-Encoding", "chunked")
   4398 		w.Write([]byte("hello"))
   4399 	}))
   4400 	resp := ht.rawResponse("GET / HTTP/1.1\nHost: foo")
   4401 	const hdr = "Transfer-Encoding: chunked"
   4402 	if n := strings.Count(resp, hdr); n != 1 {
   4403 		t.Errorf("want 1 occurrence of %q in response, got %v\nresponse: %v", hdr, n, resp)
   4404 	}
   4405 }
   4406 
   4407 // https://golang.org/issue/16063
   4408 func TestHandlerSetTransferEncodingGzip(t *testing.T) {
   4409 	setParallel(t)
   4410 	defer afterTest(t)
   4411 	ht := newHandlerTest(HandlerFunc(func(w ResponseWriter, r *Request) {
   4412 		w.Header().Set("Transfer-Encoding", "gzip")
   4413 		gz := gzip.NewWriter(w)
   4414 		gz.Write([]byte("hello"))
   4415 		gz.Close()
   4416 	}))
   4417 	resp := ht.rawResponse("GET / HTTP/1.1\nHost: foo")
   4418 	for _, v := range []string{"gzip", "chunked"} {
   4419 		hdr := "Transfer-Encoding: " + v
   4420 		if n := strings.Count(resp, hdr); n != 1 {
   4421 			t.Errorf("want 1 occurrence of %q in response, got %v\nresponse: %v", hdr, n, resp)
   4422 		}
   4423 	}
   4424 }
   4425 
   4426 func BenchmarkClientServer(b *testing.B) {
   4427 	b.ReportAllocs()
   4428 	b.StopTimer()
   4429 	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, r *Request) {
   4430 		fmt.Fprintf(rw, "Hello world.\n")
   4431 	}))
   4432 	defer ts.Close()
   4433 	b.StartTimer()
   4434 
   4435 	for i := 0; i < b.N; i++ {
   4436 		res, err := Get(ts.URL)
   4437 		if err != nil {
   4438 			b.Fatal("Get:", err)
   4439 		}
   4440 		all, err := ioutil.ReadAll(res.Body)
   4441 		res.Body.Close()
   4442 		if err != nil {
   4443 			b.Fatal("ReadAll:", err)
   4444 		}
   4445 		body := string(all)
   4446 		if body != "Hello world.\n" {
   4447 			b.Fatal("Got body:", body)
   4448 		}
   4449 	}
   4450 
   4451 	b.StopTimer()
   4452 }
   4453 
   4454 func BenchmarkClientServerParallel4(b *testing.B) {
   4455 	benchmarkClientServerParallel(b, 4, false)
   4456 }
   4457 
   4458 func BenchmarkClientServerParallel64(b *testing.B) {
   4459 	benchmarkClientServerParallel(b, 64, false)
   4460 }
   4461 
   4462 func BenchmarkClientServerParallelTLS4(b *testing.B) {
   4463 	benchmarkClientServerParallel(b, 4, true)
   4464 }
   4465 
   4466 func BenchmarkClientServerParallelTLS64(b *testing.B) {
   4467 	benchmarkClientServerParallel(b, 64, true)
   4468 }
   4469 
   4470 func benchmarkClientServerParallel(b *testing.B, parallelism int, useTLS bool) {
   4471 	b.ReportAllocs()
   4472 	ts := httptest.NewUnstartedServer(HandlerFunc(func(rw ResponseWriter, r *Request) {
   4473 		fmt.Fprintf(rw, "Hello world.\n")
   4474 	}))
   4475 	if useTLS {
   4476 		ts.StartTLS()
   4477 	} else {
   4478 		ts.Start()
   4479 	}
   4480 	defer ts.Close()
   4481 	b.ResetTimer()
   4482 	b.SetParallelism(parallelism)
   4483 	b.RunParallel(func(pb *testing.PB) {
   4484 		noVerifyTransport := &Transport{
   4485 			TLSClientConfig: &tls.Config{
   4486 				InsecureSkipVerify: true,
   4487 			},
   4488 		}
   4489 		defer noVerifyTransport.CloseIdleConnections()
   4490 		client := &Client{Transport: noVerifyTransport}
   4491 		for pb.Next() {
   4492 			res, err := client.Get(ts.URL)
   4493 			if err != nil {
   4494 				b.Logf("Get: %v", err)
   4495 				continue
   4496 			}
   4497 			all, err := ioutil.ReadAll(res.Body)
   4498 			res.Body.Close()
   4499 			if err != nil {
   4500 				b.Logf("ReadAll: %v", err)
   4501 				continue
   4502 			}
   4503 			body := string(all)
   4504 			if body != "Hello world.\n" {
   4505 				panic("Got body: " + body)
   4506 			}
   4507 		}
   4508 	})
   4509 }
   4510 
   4511 // A benchmark for profiling the server without the HTTP client code.
   4512 // The client code runs in a subprocess.
   4513 //
   4514 // For use like:
   4515 //   $ go test -c
   4516 //   $ ./http.test -test.run=XX -test.bench=BenchmarkServer -test.benchtime=15s -test.cpuprofile=http.prof
   4517 //   $ go tool pprof http.test http.prof
   4518 //   (pprof) web
   4519 func BenchmarkServer(b *testing.B) {
   4520 	b.ReportAllocs()
   4521 	// Child process mode;
   4522 	if url := os.Getenv("TEST_BENCH_SERVER_URL"); url != "" {
   4523 		n, err := strconv.Atoi(os.Getenv("TEST_BENCH_CLIENT_N"))
   4524 		if err != nil {
   4525 			panic(err)
   4526 		}
   4527 		for i := 0; i < n; i++ {
   4528 			res, err := Get(url)
   4529 			if err != nil {
   4530 				log.Panicf("Get: %v", err)
   4531 			}
   4532 			all, err := ioutil.ReadAll(res.Body)
   4533 			res.Body.Close()
   4534 			if err != nil {
   4535 				log.Panicf("ReadAll: %v", err)
   4536 			}
   4537 			body := string(all)
   4538 			if body != "Hello world.\n" {
   4539 				log.Panicf("Got body: %q", body)
   4540 			}
   4541 		}
   4542 		os.Exit(0)
   4543 		return
   4544 	}
   4545 
   4546 	var res = []byte("Hello world.\n")
   4547 	b.StopTimer()
   4548 	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, r *Request) {
   4549 		rw.Header().Set("Content-Type", "text/html; charset=utf-8")
   4550 		rw.Write(res)
   4551 	}))
   4552 	defer ts.Close()
   4553 	b.StartTimer()
   4554 
   4555 	cmd := exec.Command(os.Args[0], "-test.run=XXXX", "-test.bench=BenchmarkServer$")
   4556 	cmd.Env = append([]string{
   4557 		fmt.Sprintf("TEST_BENCH_CLIENT_N=%d", b.N),
   4558 		fmt.Sprintf("TEST_BENCH_SERVER_URL=%s", ts.URL),
   4559 	}, os.Environ()...)
   4560 	out, err := cmd.CombinedOutput()
   4561 	if err != nil {
   4562 		b.Errorf("Test failure: %v, with output: %s", err, out)
   4563 	}
   4564 }
   4565 
   4566 // getNoBody wraps Get but closes any Response.Body before returning the response.
   4567 func getNoBody(urlStr string) (*Response, error) {
   4568 	res, err := Get(urlStr)
   4569 	if err != nil {
   4570 		return nil, err
   4571 	}
   4572 	res.Body.Close()
   4573 	return res, nil
   4574 }
   4575 
   4576 // A benchmark for profiling the client without the HTTP server code.
   4577 // The server code runs in a subprocess.
   4578 func BenchmarkClient(b *testing.B) {
   4579 	b.ReportAllocs()
   4580 	b.StopTimer()
   4581 	defer afterTest(b)
   4582 
   4583 	var data = []byte("Hello world.\n")
   4584 	if server := os.Getenv("TEST_BENCH_SERVER"); server != "" {
   4585 		// Server process mode.
   4586 		port := os.Getenv("TEST_BENCH_SERVER_PORT") // can be set by user
   4587 		if port == "" {
   4588 			port = "0"
   4589 		}
   4590 		ln, err := net.Listen("tcp", "localhost:"+port)
   4591 		if err != nil {
   4592 			fmt.Fprintln(os.Stderr, err.Error())
   4593 			os.Exit(1)
   4594 		}
   4595 		fmt.Println(ln.Addr().String())
   4596 		HandleFunc("/", func(w ResponseWriter, r *Request) {
   4597 			r.ParseForm()
   4598 			if r.Form.Get("stop") != "" {
   4599 				os.Exit(0)
   4600 			}
   4601 			w.Header().Set("Content-Type", "text/html; charset=utf-8")
   4602 			w.Write(data)
   4603 		})
   4604 		var srv Server
   4605 		log.Fatal(srv.Serve(ln))
   4606 	}
   4607 
   4608 	// Start server process.
   4609 	cmd := exec.Command(os.Args[0], "-test.run=XXXX", "-test.bench=BenchmarkClient$")
   4610 	cmd.Env = append(os.Environ(), "TEST_BENCH_SERVER=yes")
   4611 	cmd.Stderr = os.Stderr
   4612 	stdout, err := cmd.StdoutPipe()
   4613 	if err != nil {
   4614 		b.Fatal(err)
   4615 	}
   4616 	if err := cmd.Start(); err != nil {
   4617 		b.Fatalf("subprocess failed to start: %v", err)
   4618 	}
   4619 	defer cmd.Process.Kill()
   4620 
   4621 	// Wait for the server in the child process to respond and tell us
   4622 	// its listening address, once it's started listening:
   4623 	timer := time.AfterFunc(10*time.Second, func() {
   4624 		cmd.Process.Kill()
   4625 	})
   4626 	defer timer.Stop()
   4627 	bs := bufio.NewScanner(stdout)
   4628 	if !bs.Scan() {
   4629 		b.Fatalf("failed to read listening URL from child: %v", bs.Err())
   4630 	}
   4631 	url := "http://" + strings.TrimSpace(bs.Text()) + "/"
   4632 	timer.Stop()
   4633 	if _, err := getNoBody(url); err != nil {
   4634 		b.Fatalf("initial probe of child process failed: %v", err)
   4635 	}
   4636 
   4637 	done := make(chan error)
   4638 	go func() {
   4639 		done <- cmd.Wait()
   4640 	}()
   4641 
   4642 	// Do b.N requests to the server.
   4643 	b.StartTimer()
   4644 	for i := 0; i < b.N; i++ {
   4645 		res, err := Get(url)
   4646 		if err != nil {
   4647 			b.Fatalf("Get: %v", err)
   4648 		}
   4649 		body, err := ioutil.ReadAll(res.Body)
   4650 		res.Body.Close()
   4651 		if err != nil {
   4652 			b.Fatalf("ReadAll: %v", err)
   4653 		}
   4654 		if !bytes.Equal(body, data) {
   4655 			b.Fatalf("Got body: %q", body)
   4656 		}
   4657 	}
   4658 	b.StopTimer()
   4659 
   4660 	// Instruct server process to stop.
   4661 	getNoBody(url + "?stop=yes")
   4662 	select {
   4663 	case err := <-done:
   4664 		if err != nil {
   4665 			b.Fatalf("subprocess failed: %v", err)
   4666 		}
   4667 	case <-time.After(5 * time.Second):
   4668 		b.Fatalf("subprocess did not stop")
   4669 	}
   4670 }
   4671 
   4672 func BenchmarkServerFakeConnNoKeepAlive(b *testing.B) {
   4673 	b.ReportAllocs()
   4674 	req := reqBytes(`GET / HTTP/1.0
   4675 Host: golang.org
   4676 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
   4677 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17
   4678 Accept-Encoding: gzip,deflate,sdch
   4679 Accept-Language: en-US,en;q=0.8
   4680 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
   4681 `)
   4682 	res := []byte("Hello world!\n")
   4683 
   4684 	conn := &testConn{
   4685 		// testConn.Close will not push into the channel
   4686 		// if it's full.
   4687 		closec: make(chan bool, 1),
   4688 	}
   4689 	handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
   4690 		rw.Header().Set("Content-Type", "text/html; charset=utf-8")
   4691 		rw.Write(res)
   4692 	})
   4693 	ln := new(oneConnListener)
   4694 	for i := 0; i < b.N; i++ {
   4695 		conn.readBuf.Reset()
   4696 		conn.writeBuf.Reset()
   4697 		conn.readBuf.Write(req)
   4698 		ln.conn = conn
   4699 		Serve(ln, handler)
   4700 		<-conn.closec
   4701 	}
   4702 }
   4703 
   4704 // repeatReader reads content count times, then EOFs.
   4705 type repeatReader struct {
   4706 	content []byte
   4707 	count   int
   4708 	off     int
   4709 }
   4710 
   4711 func (r *repeatReader) Read(p []byte) (n int, err error) {
   4712 	if r.count <= 0 {
   4713 		return 0, io.EOF
   4714 	}
   4715 	n = copy(p, r.content[r.off:])
   4716 	r.off += n
   4717 	if r.off == len(r.content) {
   4718 		r.count--
   4719 		r.off = 0
   4720 	}
   4721 	return
   4722 }
   4723 
   4724 func BenchmarkServerFakeConnWithKeepAlive(b *testing.B) {
   4725 	b.ReportAllocs()
   4726 
   4727 	req := reqBytes(`GET / HTTP/1.1
   4728 Host: golang.org
   4729 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
   4730 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17
   4731 Accept-Encoding: gzip,deflate,sdch
   4732 Accept-Language: en-US,en;q=0.8
   4733 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
   4734 `)
   4735 	res := []byte("Hello world!\n")
   4736 
   4737 	conn := &rwTestConn{
   4738 		Reader: &repeatReader{content: req, count: b.N},
   4739 		Writer: ioutil.Discard,
   4740 		closec: make(chan bool, 1),
   4741 	}
   4742 	handled := 0
   4743 	handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
   4744 		handled++
   4745 		rw.Header().Set("Content-Type", "text/html; charset=utf-8")
   4746 		rw.Write(res)
   4747 	})
   4748 	ln := &oneConnListener{conn: conn}
   4749 	go Serve(ln, handler)
   4750 	<-conn.closec
   4751 	if b.N != handled {
   4752 		b.Errorf("b.N=%d but handled %d", b.N, handled)
   4753 	}
   4754 }
   4755 
   4756 // same as above, but representing the most simple possible request
   4757 // and handler. Notably: the handler does not call rw.Header().
   4758 func BenchmarkServerFakeConnWithKeepAliveLite(b *testing.B) {
   4759 	b.ReportAllocs()
   4760 
   4761 	req := reqBytes(`GET / HTTP/1.1
   4762 Host: golang.org
   4763 `)
   4764 	res := []byte("Hello world!\n")
   4765 
   4766 	conn := &rwTestConn{
   4767 		Reader: &repeatReader{content: req, count: b.N},
   4768 		Writer: ioutil.Discard,
   4769 		closec: make(chan bool, 1),
   4770 	}
   4771 	handled := 0
   4772 	handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
   4773 		handled++
   4774 		rw.Write(res)
   4775 	})
   4776 	ln := &oneConnListener{conn: conn}
   4777 	go Serve(ln, handler)
   4778 	<-conn.closec
   4779 	if b.N != handled {
   4780 		b.Errorf("b.N=%d but handled %d", b.N, handled)
   4781 	}
   4782 }
   4783 
   4784 const someResponse = "<html>some response</html>"
   4785 
   4786 // A Response that's just no bigger than 2KB, the buffer-before-chunking threshold.
   4787 var response = bytes.Repeat([]byte(someResponse), 2<<10/len(someResponse))
   4788 
   4789 // Both Content-Type and Content-Length set. Should be no buffering.
   4790 func BenchmarkServerHandlerTypeLen(b *testing.B) {
   4791 	benchmarkHandler(b, HandlerFunc(func(w ResponseWriter, r *Request) {
   4792 		w.Header().Set("Content-Type", "text/html")
   4793 		w.Header().Set("Content-Length", strconv.Itoa(len(response)))
   4794 		w.Write(response)
   4795 	}))
   4796 }
   4797 
   4798 // A Content-Type is set, but no length. No sniffing, but will count the Content-Length.
   4799 func BenchmarkServerHandlerNoLen(b *testing.B) {
   4800 	benchmarkHandler(b, HandlerFunc(func(w ResponseWriter, r *Request) {
   4801 		w.Header().Set("Content-Type", "text/html")
   4802 		w.Write(response)
   4803 	}))
   4804 }
   4805 
   4806 // A Content-Length is set, but the Content-Type will be sniffed.
   4807 func BenchmarkServerHandlerNoType(b *testing.B) {
   4808 	benchmarkHandler(b, HandlerFunc(func(w ResponseWriter, r *Request) {
   4809 		w.Header().Set("Content-Length", strconv.Itoa(len(response)))
   4810 		w.Write(response)
   4811 	}))
   4812 }
   4813 
   4814 // Neither a Content-Type or Content-Length, so sniffed and counted.
   4815 func BenchmarkServerHandlerNoHeader(b *testing.B) {
   4816 	benchmarkHandler(b, HandlerFunc(func(w ResponseWriter, r *Request) {
   4817 		w.Write(response)
   4818 	}))
   4819 }
   4820 
   4821 func benchmarkHandler(b *testing.B, h Handler) {
   4822 	b.ReportAllocs()
   4823 	req := reqBytes(`GET / HTTP/1.1
   4824 Host: golang.org
   4825 `)
   4826 	conn := &rwTestConn{
   4827 		Reader: &repeatReader{content: req, count: b.N},
   4828 		Writer: ioutil.Discard,
   4829 		closec: make(chan bool, 1),
   4830 	}
   4831 	handled := 0
   4832 	handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
   4833 		handled++
   4834 		h.ServeHTTP(rw, r)
   4835 	})
   4836 	ln := &oneConnListener{conn: conn}
   4837 	go Serve(ln, handler)
   4838 	<-conn.closec
   4839 	if b.N != handled {
   4840 		b.Errorf("b.N=%d but handled %d", b.N, handled)
   4841 	}
   4842 }
   4843 
   4844 func BenchmarkServerHijack(b *testing.B) {
   4845 	b.ReportAllocs()
   4846 	req := reqBytes(`GET / HTTP/1.1
   4847 Host: golang.org
   4848 `)
   4849 	h := HandlerFunc(func(w ResponseWriter, r *Request) {
   4850 		conn, _, err := w.(Hijacker).Hijack()
   4851 		if err != nil {
   4852 			panic(err)
   4853 		}
   4854 		conn.Close()
   4855 	})
   4856 	conn := &rwTestConn{
   4857 		Writer: ioutil.Discard,
   4858 		closec: make(chan bool, 1),
   4859 	}
   4860 	ln := &oneConnListener{conn: conn}
   4861 	for i := 0; i < b.N; i++ {
   4862 		conn.Reader = bytes.NewReader(req)
   4863 		ln.conn = conn
   4864 		Serve(ln, h)
   4865 		<-conn.closec
   4866 	}
   4867 }
   4868 
   4869 func BenchmarkCloseNotifier(b *testing.B) {
   4870 	b.ReportAllocs()
   4871 	b.StopTimer()
   4872 	sawClose := make(chan bool)
   4873 	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
   4874 		<-rw.(CloseNotifier).CloseNotify()
   4875 		sawClose <- true
   4876 	}))
   4877 	defer ts.Close()
   4878 	tot := time.NewTimer(5 * time.Second)
   4879 	defer tot.Stop()
   4880 	b.StartTimer()
   4881 	for i := 0; i < b.N; i++ {
   4882 		conn, err := net.Dial("tcp", ts.Listener.Addr().String())
   4883 		if err != nil {
   4884 			b.Fatalf("error dialing: %v", err)
   4885 		}
   4886 		_, err = fmt.Fprintf(conn, "GET / HTTP/1.1\r\nConnection: keep-alive\r\nHost: foo\r\n\r\n")
   4887 		if err != nil {
   4888 			b.Fatal(err)
   4889 		}
   4890 		conn.Close()
   4891 		tot.Reset(5 * time.Second)
   4892 		select {
   4893 		case <-sawClose:
   4894 		case <-tot.C:
   4895 			b.Fatal("timeout")
   4896 		}
   4897 	}
   4898 	b.StopTimer()
   4899 }
   4900 
   4901 // Verify this doesn't race (Issue 16505)
   4902 func TestConcurrentServerServe(t *testing.T) {
   4903 	setParallel(t)
   4904 	for i := 0; i < 100; i++ {
   4905 		ln1 := &oneConnListener{conn: nil}
   4906 		ln2 := &oneConnListener{conn: nil}
   4907 		srv := Server{}
   4908 		go func() { srv.Serve(ln1) }()
   4909 		go func() { srv.Serve(ln2) }()
   4910 	}
   4911 }
   4912 
   4913 func TestServerIdleTimeout(t *testing.T) {
   4914 	if testing.Short() {
   4915 		t.Skip("skipping in short mode")
   4916 	}
   4917 	setParallel(t)
   4918 	defer afterTest(t)
   4919 	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   4920 		io.Copy(ioutil.Discard, r.Body)
   4921 		io.WriteString(w, r.RemoteAddr)
   4922 	}))
   4923 	ts.Config.ReadHeaderTimeout = 1 * time.Second
   4924 	ts.Config.IdleTimeout = 2 * time.Second
   4925 	ts.Start()
   4926 	defer ts.Close()
   4927 
   4928 	tr := &Transport{}
   4929 	defer tr.CloseIdleConnections()
   4930 	c := &Client{Transport: tr}
   4931 
   4932 	get := func() string {
   4933 		res, err := c.Get(ts.URL)
   4934 		if err != nil {
   4935 			t.Fatal(err)
   4936 		}
   4937 		defer res.Body.Close()
   4938 		slurp, err := ioutil.ReadAll(res.Body)
   4939 		if err != nil {
   4940 			t.Fatal(err)
   4941 		}
   4942 		return string(slurp)
   4943 	}
   4944 
   4945 	a1, a2 := get(), get()
   4946 	if a1 != a2 {
   4947 		t.Fatalf("did requests on different connections")
   4948 	}
   4949 	time.Sleep(3 * time.Second)
   4950 	a3 := get()
   4951 	if a2 == a3 {
   4952 		t.Fatal("request three unexpectedly on same connection")
   4953 	}
   4954 
   4955 	// And test that ReadHeaderTimeout still works:
   4956 	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
   4957 	if err != nil {
   4958 		t.Fatal(err)
   4959 	}
   4960 	defer conn.Close()
   4961 	conn.Write([]byte("GET / HTTP/1.1\r\nHost: foo.com\r\n"))
   4962 	time.Sleep(2 * time.Second)
   4963 	if _, err := io.CopyN(ioutil.Discard, conn, 1); err == nil {
   4964 		t.Fatal("copy byte succeeded; want err")
   4965 	}
   4966 }
   4967 
   4968 func get(t *testing.T, c *Client, url string) string {
   4969 	res, err := c.Get(url)
   4970 	if err != nil {
   4971 		t.Fatal(err)
   4972 	}
   4973 	defer res.Body.Close()
   4974 	slurp, err := ioutil.ReadAll(res.Body)
   4975 	if err != nil {
   4976 		t.Fatal(err)
   4977 	}
   4978 	return string(slurp)
   4979 }
   4980 
   4981 // Tests that calls to Server.SetKeepAlivesEnabled(false) closes any
   4982 // currently-open connections.
   4983 func TestServerSetKeepAlivesEnabledClosesConns(t *testing.T) {
   4984 	setParallel(t)
   4985 	defer afterTest(t)
   4986 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   4987 		io.WriteString(w, r.RemoteAddr)
   4988 	}))
   4989 	defer ts.Close()
   4990 
   4991 	tr := &Transport{}
   4992 	defer tr.CloseIdleConnections()
   4993 	c := &Client{Transport: tr}
   4994 
   4995 	get := func() string { return get(t, c, ts.URL) }
   4996 
   4997 	a1, a2 := get(), get()
   4998 	if a1 != a2 {
   4999 		t.Fatal("expected first two requests on same connection")
   5000 	}
   5001 	var idle0 int
   5002 	if !waitCondition(2*time.Second, 10*time.Millisecond, func() bool {
   5003 		idle0 = tr.IdleConnKeyCountForTesting()
   5004 		return idle0 == 1
   5005 	}) {
   5006 		t.Fatalf("idle count before SetKeepAlivesEnabled called = %v; want 1", idle0)
   5007 	}
   5008 
   5009 	ts.Config.SetKeepAlivesEnabled(false)
   5010 
   5011 	var idle1 int
   5012 	if !waitCondition(2*time.Second, 10*time.Millisecond, func() bool {
   5013 		idle1 = tr.IdleConnKeyCountForTesting()
   5014 		return idle1 == 0
   5015 	}) {
   5016 		t.Fatalf("idle count after SetKeepAlivesEnabled called = %v; want 0", idle1)
   5017 	}
   5018 
   5019 	a3 := get()
   5020 	if a3 == a2 {
   5021 		t.Fatal("expected third request on new connection")
   5022 	}
   5023 }
   5024 
   5025 func TestServerShutdown_h1(t *testing.T) { testServerShutdown(t, h1Mode) }
   5026 func TestServerShutdown_h2(t *testing.T) { testServerShutdown(t, h2Mode) }
   5027 
   5028 func testServerShutdown(t *testing.T, h2 bool) {
   5029 	setParallel(t)
   5030 	defer afterTest(t)
   5031 	var doShutdown func() // set later
   5032 	var shutdownRes = make(chan error, 1)
   5033 	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
   5034 		go doShutdown()
   5035 		// Shutdown is graceful, so it should not interrupt
   5036 		// this in-flight response. Add a tiny sleep here to
   5037 		// increase the odds of a failure if shutdown has
   5038 		// bugs.
   5039 		time.Sleep(20 * time.Millisecond)
   5040 		io.WriteString(w, r.RemoteAddr)
   5041 	}))
   5042 	defer cst.close()
   5043 
   5044 	doShutdown = func() {
   5045 		shutdownRes <- cst.ts.Config.Shutdown(context.Background())
   5046 	}
   5047 	get(t, cst.c, cst.ts.URL) // calls t.Fail on failure
   5048 
   5049 	if err := <-shutdownRes; err != nil {
   5050 		t.Fatalf("Shutdown: %v", err)
   5051 	}
   5052 
   5053 	res, err := cst.c.Get(cst.ts.URL)
   5054 	if err == nil {
   5055 		res.Body.Close()
   5056 		t.Fatal("second request should fail. server should be shut down")
   5057 	}
   5058 }
   5059 
   5060 // Issue 17878: tests that we can call Close twice.
   5061 func TestServerCloseDeadlock(t *testing.T) {
   5062 	var s Server
   5063 	s.Close()
   5064 	s.Close()
   5065 }
   5066 
   5067 // Issue 17717: tests that Server.SetKeepAlivesEnabled is respected by
   5068 // both HTTP/1 and HTTP/2.
   5069 func TestServerKeepAlivesEnabled_h1(t *testing.T) { testServerKeepAlivesEnabled(t, h1Mode) }
   5070 func TestServerKeepAlivesEnabled_h2(t *testing.T) { testServerKeepAlivesEnabled(t, h2Mode) }
   5071 func testServerKeepAlivesEnabled(t *testing.T, h2 bool) {
   5072 	setParallel(t)
   5073 	defer afterTest(t)
   5074 	cst := newClientServerTest(t, h2, HandlerFunc(func(w ResponseWriter, r *Request) {
   5075 		fmt.Fprintf(w, "%v", r.RemoteAddr)
   5076 	}))
   5077 	defer cst.close()
   5078 	srv := cst.ts.Config
   5079 	srv.SetKeepAlivesEnabled(false)
   5080 	a := cst.getURL(cst.ts.URL)
   5081 	if !waitCondition(2*time.Second, 10*time.Millisecond, srv.ExportAllConnsIdle) {
   5082 		t.Fatalf("test server has active conns")
   5083 	}
   5084 	b := cst.getURL(cst.ts.URL)
   5085 	if a == b {
   5086 		t.Errorf("got same connection between first and second requests")
   5087 	}
   5088 	if !waitCondition(2*time.Second, 10*time.Millisecond, srv.ExportAllConnsIdle) {
   5089 		t.Fatalf("test server has active conns")
   5090 	}
   5091 }
   5092 
   5093 // Issue 18447: test that the Server's ReadTimeout is stopped while
   5094 // the server's doing its 1-byte background read between requests,
   5095 // waiting for the connection to maybe close.
   5096 func TestServerCancelsReadTimeoutWhenIdle(t *testing.T) {
   5097 	setParallel(t)
   5098 	defer afterTest(t)
   5099 	const timeout = 250 * time.Millisecond
   5100 	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   5101 		select {
   5102 		case <-time.After(2 * timeout):
   5103 			fmt.Fprint(w, "ok")
   5104 		case <-r.Context().Done():
   5105 			fmt.Fprint(w, r.Context().Err())
   5106 		}
   5107 	}))
   5108 	ts.Config.ReadTimeout = timeout
   5109 	ts.Start()
   5110 	defer ts.Close()
   5111 
   5112 	tr := &Transport{}
   5113 	defer tr.CloseIdleConnections()
   5114 	c := &Client{Transport: tr}
   5115 
   5116 	res, err := c.Get(ts.URL)
   5117 	if err != nil {
   5118 		t.Fatal(err)
   5119 	}
   5120 	slurp, err := ioutil.ReadAll(res.Body)
   5121 	res.Body.Close()
   5122 	if err != nil {
   5123 		t.Fatal(err)
   5124 	}
   5125 	if string(slurp) != "ok" {
   5126 		t.Fatalf("Got: %q, want ok", slurp)
   5127 	}
   5128 }
   5129 
   5130 // Issue 18535: test that the Server doesn't try to do a background
   5131 // read if it's already done one.
   5132 func TestServerDuplicateBackgroundRead(t *testing.T) {
   5133 	setParallel(t)
   5134 	defer afterTest(t)
   5135 
   5136 	const goroutines = 5
   5137 	const requests = 2000
   5138 
   5139 	hts := httptest.NewServer(HandlerFunc(NotFound))
   5140 	defer hts.Close()
   5141 
   5142 	reqBytes := []byte("GET / HTTP/1.1\r\nHost: e.com\r\n\r\n")
   5143 
   5144 	var wg sync.WaitGroup
   5145 	for i := 0; i < goroutines; i++ {
   5146 		wg.Add(1)
   5147 		go func() {
   5148 			defer wg.Done()
   5149 			cn, err := net.Dial("tcp", hts.Listener.Addr().String())
   5150 			if err != nil {
   5151 				t.Error(err)
   5152 				return
   5153 			}
   5154 			defer cn.Close()
   5155 
   5156 			wg.Add(1)
   5157 			go func() {
   5158 				defer wg.Done()
   5159 				io.Copy(ioutil.Discard, cn)
   5160 			}()
   5161 
   5162 			for j := 0; j < requests; j++ {
   5163 				if t.Failed() {
   5164 					return
   5165 				}
   5166 				_, err := cn.Write(reqBytes)
   5167 				if err != nil {
   5168 					t.Error(err)
   5169 					return
   5170 				}
   5171 			}
   5172 		}()
   5173 	}
   5174 	wg.Wait()
   5175 }
   5176 
   5177 // Test that the bufio.Reader returned by Hijack includes any buffered
   5178 // byte (from the Server's backgroundRead) in its buffer. We want the
   5179 // Handler code to be able to tell that a byte is available via
   5180 // bufio.Reader.Buffered(), without resorting to Reading it
   5181 // (potentially blocking) to get at it.
   5182 func TestServerHijackGetsBackgroundByte(t *testing.T) {
   5183 	if runtime.GOOS == "plan9" {
   5184 		t.Skip("skipping test; see https://golang.org/issue/18657")
   5185 	}
   5186 	setParallel(t)
   5187 	defer afterTest(t)
   5188 	done := make(chan struct{})
   5189 	inHandler := make(chan bool, 1)
   5190 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   5191 		defer close(done)
   5192 
   5193 		// Tell the client to send more data after the GET request.
   5194 		inHandler <- true
   5195 
   5196 		// Wait until the HTTP server sees the extra data
   5197 		// after the GET request. The HTTP server fires the
   5198 		// close notifier here, assuming it's a pipelined
   5199 		// request, as documented.
   5200 		select {
   5201 		case <-w.(CloseNotifier).CloseNotify():
   5202 		case <-time.After(5 * time.Second):
   5203 			t.Error("timeout")
   5204 			return
   5205 		}
   5206 
   5207 		conn, buf, err := w.(Hijacker).Hijack()
   5208 		if err != nil {
   5209 			t.Error(err)
   5210 			return
   5211 		}
   5212 		defer conn.Close()
   5213 		n := buf.Reader.Buffered()
   5214 		if n != 1 {
   5215 			t.Errorf("buffered data = %d; want 1", n)
   5216 		}
   5217 		peek, err := buf.Reader.Peek(3)
   5218 		if string(peek) != "foo" || err != nil {
   5219 			t.Errorf("Peek = %q, %v; want foo, nil", peek, err)
   5220 		}
   5221 	}))
   5222 	defer ts.Close()
   5223 
   5224 	cn, err := net.Dial("tcp", ts.Listener.Addr().String())
   5225 	if err != nil {
   5226 		t.Fatal(err)
   5227 	}
   5228 	defer cn.Close()
   5229 	if _, err := cn.Write([]byte("GET / HTTP/1.1\r\nHost: e.com\r\n\r\n")); err != nil {
   5230 		t.Fatal(err)
   5231 	}
   5232 	<-inHandler
   5233 	if _, err := cn.Write([]byte("foo")); err != nil {
   5234 		t.Fatal(err)
   5235 	}
   5236 
   5237 	if err := cn.(*net.TCPConn).CloseWrite(); err != nil {
   5238 		t.Fatal(err)
   5239 	}
   5240 	select {
   5241 	case <-done:
   5242 	case <-time.After(2 * time.Second):
   5243 		t.Error("timeout")
   5244 	}
   5245 }
   5246 
   5247 // Like TestServerHijackGetsBackgroundByte above but sending a
   5248 // immediate 1MB of data to the server to fill up the server's 4KB
   5249 // buffer.
   5250 func TestServerHijackGetsBackgroundByte_big(t *testing.T) {
   5251 	if runtime.GOOS == "plan9" {
   5252 		t.Skip("skipping test; see https://golang.org/issue/18657")
   5253 	}
   5254 	setParallel(t)
   5255 	defer afterTest(t)
   5256 	done := make(chan struct{})
   5257 	const size = 8 << 10
   5258 	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
   5259 		defer close(done)
   5260 
   5261 		// Wait until the HTTP server sees the extra data
   5262 		// after the GET request. The HTTP server fires the
   5263 		// close notifier here, assuming it's a pipelined
   5264 		// request, as documented.
   5265 		select {
   5266 		case <-w.(CloseNotifier).CloseNotify():
   5267 		case <-time.After(5 * time.Second):
   5268 			t.Error("timeout")
   5269 			return
   5270 		}
   5271 
   5272 		conn, buf, err := w.(Hijacker).Hijack()
   5273 		if err != nil {
   5274 			t.Error(err)
   5275 			return
   5276 		}
   5277 		defer conn.Close()
   5278 		slurp, err := ioutil.ReadAll(buf.Reader)
   5279 		if err != nil {
   5280 			t.Errorf("Copy: %v", err)
   5281 		}
   5282 		allX := true
   5283 		for _, v := range slurp {
   5284 			if v != 'x' {
   5285 				allX = false
   5286 			}
   5287 		}
   5288 		if len(slurp) != size {
   5289 			t.Errorf("read %d; want %d", len(slurp), size)
   5290 		} else if !allX {
   5291 			t.Errorf("read %q; want %d 'x'", slurp, size)
   5292 		}
   5293 	}))
   5294 	defer ts.Close()
   5295 
   5296 	cn, err := net.Dial("tcp", ts.Listener.Addr().String())
   5297 	if err != nil {
   5298 		t.Fatal(err)
   5299 	}
   5300 	defer cn.Close()
   5301 	if _, err := fmt.Fprintf(cn, "GET / HTTP/1.1\r\nHost: e.com\r\n\r\n%s",
   5302 		strings.Repeat("x", size)); err != nil {
   5303 		t.Fatal(err)
   5304 	}
   5305 	if err := cn.(*net.TCPConn).CloseWrite(); err != nil {
   5306 		t.Fatal(err)
   5307 	}
   5308 
   5309 	select {
   5310 	case <-done:
   5311 	case <-time.After(2 * time.Second):
   5312 		t.Error("timeout")
   5313 	}
   5314 }
   5315