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