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