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