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