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