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