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