github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/net/http2/server_test.go (about) 1 // Copyright 2014 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 package http2 6 7 import ( 8 "bytes" 9 "crypto/tls" 10 "errors" 11 "flag" 12 "fmt" 13 "io" 14 "io/ioutil" 15 "log" 16 "net" 17 "net/http" 18 "net/http/httptest" 19 "os" 20 "os/exec" 21 "reflect" 22 "runtime" 23 "strconv" 24 "strings" 25 "sync" 26 "sync/atomic" 27 "testing" 28 "time" 29 30 "golang.org/x/net/http2/hpack" 31 ) 32 33 var stderrVerbose = flag.Bool("stderr_verbose", false, "Mirror verbosity to stderr, unbuffered") 34 35 func stderrv() io.Writer { 36 if *stderrVerbose { 37 return os.Stderr 38 } 39 40 return ioutil.Discard 41 } 42 43 type serverTester struct { 44 cc net.Conn // client conn 45 t testing.TB 46 ts *httptest.Server 47 fr *Framer 48 logBuf *bytes.Buffer 49 logFilter []string // substrings to filter out 50 scMu sync.Mutex // guards sc 51 sc *serverConn 52 hpackDec *hpack.Decoder 53 decodedHeaders [][2]string 54 55 // writing headers: 56 headerBuf bytes.Buffer 57 hpackEnc *hpack.Encoder 58 59 // reading frames: 60 frc chan Frame 61 frErrc chan error 62 readTimer *time.Timer 63 } 64 65 func init() { 66 testHookOnPanicMu = new(sync.Mutex) 67 } 68 69 func resetHooks() { 70 testHookOnPanicMu.Lock() 71 testHookOnPanic = nil 72 testHookOnPanicMu.Unlock() 73 } 74 75 type serverTesterOpt string 76 77 var optOnlyServer = serverTesterOpt("only_server") 78 79 func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{}) *serverTester { 80 resetHooks() 81 82 logBuf := new(bytes.Buffer) 83 ts := httptest.NewUnstartedServer(handler) 84 85 tlsConfig := &tls.Config{ 86 InsecureSkipVerify: true, 87 // The h2-14 is temporary, until curl is updated. (as used by unit tests 88 // in Docker) 89 NextProtos: []string{NextProtoTLS, "h2-14"}, 90 } 91 92 onlyServer := false 93 for _, opt := range opts { 94 switch v := opt.(type) { 95 case func(*tls.Config): 96 v(tlsConfig) 97 case func(*httptest.Server): 98 v(ts) 99 case serverTesterOpt: 100 onlyServer = (v == optOnlyServer) 101 default: 102 t.Fatalf("unknown newServerTester option type %T", v) 103 } 104 } 105 106 ConfigureServer(ts.Config, &Server{}) 107 108 st := &serverTester{ 109 t: t, 110 ts: ts, 111 logBuf: logBuf, 112 frc: make(chan Frame, 1), 113 frErrc: make(chan error, 1), 114 } 115 st.hpackEnc = hpack.NewEncoder(&st.headerBuf) 116 st.hpackDec = hpack.NewDecoder(initialHeaderTableSize, st.onHeaderField) 117 118 ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config 119 ts.Config.ErrorLog = log.New(io.MultiWriter(stderrv(), twriter{t: t, st: st}, logBuf), "", log.LstdFlags) 120 ts.StartTLS() 121 122 if VerboseLogs { 123 t.Logf("Running test server at: %s", ts.URL) 124 } 125 testHookGetServerConn = func(v *serverConn) { 126 st.scMu.Lock() 127 defer st.scMu.Unlock() 128 st.sc = v 129 st.sc.testHookCh = make(chan func(int)) 130 } 131 log.SetOutput(io.MultiWriter(stderrv(), twriter{t: t, st: st})) 132 if !onlyServer { 133 cc, err := tls.Dial("tcp", ts.Listener.Addr().String(), tlsConfig) 134 if err != nil { 135 t.Fatal(err) 136 } 137 st.cc = cc 138 st.fr = NewFramer(cc, cc) 139 } 140 return st 141 } 142 143 func (st *serverTester) closeConn() { 144 st.scMu.Lock() 145 defer st.scMu.Unlock() 146 st.sc.conn.Close() 147 } 148 149 func (st *serverTester) addLogFilter(phrase string) { 150 st.logFilter = append(st.logFilter, phrase) 151 } 152 153 func (st *serverTester) stream(id uint32) *stream { 154 ch := make(chan *stream, 1) 155 st.sc.testHookCh <- func(int) { 156 ch <- st.sc.streams[id] 157 } 158 return <-ch 159 } 160 161 func (st *serverTester) streamState(id uint32) streamState { 162 ch := make(chan streamState, 1) 163 st.sc.testHookCh <- func(int) { 164 state, _ := st.sc.state(id) 165 ch <- state 166 } 167 return <-ch 168 } 169 170 // loopNum reports how many times this conn's select loop has gone around. 171 func (st *serverTester) loopNum() int { 172 lastc := make(chan int, 1) 173 st.sc.testHookCh <- func(loopNum int) { 174 lastc <- loopNum 175 } 176 return <-lastc 177 } 178 179 // awaitIdle heuristically awaits for the server conn's select loop to be idle. 180 // The heuristic is that the server connection's serve loop must schedule 181 // 50 times in a row without any channel sends or receives occuring. 182 func (st *serverTester) awaitIdle() { 183 remain := 50 184 last := st.loopNum() 185 for remain > 0 { 186 n := st.loopNum() 187 if n == last+1 { 188 remain-- 189 } else { 190 remain = 50 191 } 192 last = n 193 } 194 } 195 196 func (st *serverTester) Close() { 197 st.ts.Close() 198 if st.cc != nil { 199 st.cc.Close() 200 } 201 log.SetOutput(os.Stderr) 202 } 203 204 // greet initiates the client's HTTP/2 connection into a state where 205 // frames may be sent. 206 func (st *serverTester) greet() { 207 st.writePreface() 208 st.writeInitialSettings() 209 st.wantSettings() 210 st.writeSettingsAck() 211 st.wantSettingsAck() 212 } 213 214 func (st *serverTester) writePreface() { 215 n, err := st.cc.Write(clientPreface) 216 if err != nil { 217 st.t.Fatalf("Error writing client preface: %v", err) 218 } 219 if n != len(clientPreface) { 220 st.t.Fatalf("Writing client preface, wrote %d bytes; want %d", n, len(clientPreface)) 221 } 222 } 223 224 func (st *serverTester) writeInitialSettings() { 225 if err := st.fr.WriteSettings(); err != nil { 226 st.t.Fatalf("Error writing initial SETTINGS frame from client to server: %v", err) 227 } 228 } 229 230 func (st *serverTester) writeSettingsAck() { 231 if err := st.fr.WriteSettingsAck(); err != nil { 232 st.t.Fatalf("Error writing ACK of server's SETTINGS: %v", err) 233 } 234 } 235 236 func (st *serverTester) writeHeaders(p HeadersFrameParam) { 237 if err := st.fr.WriteHeaders(p); err != nil { 238 st.t.Fatalf("Error writing HEADERS: %v", err) 239 } 240 } 241 242 func (st *serverTester) encodeHeaderField(k, v string) { 243 err := st.hpackEnc.WriteField(hpack.HeaderField{Name: k, Value: v}) 244 if err != nil { 245 st.t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err) 246 } 247 } 248 249 // encodeHeaderRaw is the magic-free version of encodeHeader. 250 // It takes 0 or more (k, v) pairs and encodes them. 251 func (st *serverTester) encodeHeaderRaw(headers ...string) []byte { 252 if len(headers)%2 == 1 { 253 panic("odd number of kv args") 254 } 255 st.headerBuf.Reset() 256 for len(headers) > 0 { 257 k, v := headers[0], headers[1] 258 st.encodeHeaderField(k, v) 259 headers = headers[2:] 260 } 261 return st.headerBuf.Bytes() 262 } 263 264 // encodeHeader encodes headers and returns their HPACK bytes. headers 265 // must contain an even number of key/value pairs. There may be 266 // multiple pairs for keys (e.g. "cookie"). The :method, :path, and 267 // :scheme headers default to GET, / and https. 268 func (st *serverTester) encodeHeader(headers ...string) []byte { 269 if len(headers)%2 == 1 { 270 panic("odd number of kv args") 271 } 272 273 st.headerBuf.Reset() 274 275 if len(headers) == 0 { 276 // Fast path, mostly for benchmarks, so test code doesn't pollute 277 // profiles when we're looking to improve server allocations. 278 st.encodeHeaderField(":method", "GET") 279 st.encodeHeaderField(":path", "/") 280 st.encodeHeaderField(":scheme", "https") 281 return st.headerBuf.Bytes() 282 } 283 284 if len(headers) == 2 && headers[0] == ":method" { 285 // Another fast path for benchmarks. 286 st.encodeHeaderField(":method", headers[1]) 287 st.encodeHeaderField(":path", "/") 288 st.encodeHeaderField(":scheme", "https") 289 return st.headerBuf.Bytes() 290 } 291 292 pseudoCount := map[string]int{} 293 keys := []string{":method", ":path", ":scheme"} 294 vals := map[string][]string{ 295 ":method": {"GET"}, 296 ":path": {"/"}, 297 ":scheme": {"https"}, 298 } 299 for len(headers) > 0 { 300 k, v := headers[0], headers[1] 301 headers = headers[2:] 302 if _, ok := vals[k]; !ok { 303 keys = append(keys, k) 304 } 305 if strings.HasPrefix(k, ":") { 306 pseudoCount[k]++ 307 if pseudoCount[k] == 1 { 308 vals[k] = []string{v} 309 } else { 310 // Allows testing of invalid headers w/ dup pseudo fields. 311 vals[k] = append(vals[k], v) 312 } 313 } else { 314 vals[k] = append(vals[k], v) 315 } 316 } 317 for _, k := range keys { 318 for _, v := range vals[k] { 319 st.encodeHeaderField(k, v) 320 } 321 } 322 return st.headerBuf.Bytes() 323 } 324 325 // bodylessReq1 writes a HEADERS frames with StreamID 1 and EndStream and EndHeaders set. 326 func (st *serverTester) bodylessReq1(headers ...string) { 327 st.writeHeaders(HeadersFrameParam{ 328 StreamID: 1, // clients send odd numbers 329 BlockFragment: st.encodeHeader(headers...), 330 EndStream: true, 331 EndHeaders: true, 332 }) 333 } 334 335 func (st *serverTester) writeData(streamID uint32, endStream bool, data []byte) { 336 if err := st.fr.WriteData(streamID, endStream, data); err != nil { 337 st.t.Fatalf("Error writing DATA: %v", err) 338 } 339 } 340 341 func (st *serverTester) readFrame() (Frame, error) { 342 go func() { 343 fr, err := st.fr.ReadFrame() 344 if err != nil { 345 st.frErrc <- err 346 } else { 347 st.frc <- fr 348 } 349 }() 350 t := st.readTimer 351 if t == nil { 352 t = time.NewTimer(2 * time.Second) 353 st.readTimer = t 354 } 355 t.Reset(2 * time.Second) 356 defer t.Stop() 357 select { 358 case f := <-st.frc: 359 return f, nil 360 case err := <-st.frErrc: 361 return nil, err 362 case <-t.C: 363 return nil, errors.New("timeout waiting for frame") 364 } 365 } 366 367 func (st *serverTester) wantHeaders() *HeadersFrame { 368 f, err := st.readFrame() 369 if err != nil { 370 st.t.Fatalf("Error while expecting a HEADERS frame: %v", err) 371 } 372 hf, ok := f.(*HeadersFrame) 373 if !ok { 374 st.t.Fatalf("got a %T; want *HeadersFrame", f) 375 } 376 return hf 377 } 378 379 func (st *serverTester) wantContinuation() *ContinuationFrame { 380 f, err := st.readFrame() 381 if err != nil { 382 st.t.Fatalf("Error while expecting a CONTINUATION frame: %v", err) 383 } 384 cf, ok := f.(*ContinuationFrame) 385 if !ok { 386 st.t.Fatalf("got a %T; want *ContinuationFrame", f) 387 } 388 return cf 389 } 390 391 func (st *serverTester) wantData() *DataFrame { 392 f, err := st.readFrame() 393 if err != nil { 394 st.t.Fatalf("Error while expecting a DATA frame: %v", err) 395 } 396 df, ok := f.(*DataFrame) 397 if !ok { 398 st.t.Fatalf("got a %T; want *DataFrame", f) 399 } 400 return df 401 } 402 403 func (st *serverTester) wantSettings() *SettingsFrame { 404 f, err := st.readFrame() 405 if err != nil { 406 st.t.Fatalf("Error while expecting a SETTINGS frame: %v", err) 407 } 408 sf, ok := f.(*SettingsFrame) 409 if !ok { 410 st.t.Fatalf("got a %T; want *SettingsFrame", f) 411 } 412 return sf 413 } 414 415 func (st *serverTester) wantPing() *PingFrame { 416 f, err := st.readFrame() 417 if err != nil { 418 st.t.Fatalf("Error while expecting a PING frame: %v", err) 419 } 420 pf, ok := f.(*PingFrame) 421 if !ok { 422 st.t.Fatalf("got a %T; want *PingFrame", f) 423 } 424 return pf 425 } 426 427 func (st *serverTester) wantGoAway() *GoAwayFrame { 428 f, err := st.readFrame() 429 if err != nil { 430 st.t.Fatalf("Error while expecting a GOAWAY frame: %v", err) 431 } 432 gf, ok := f.(*GoAwayFrame) 433 if !ok { 434 st.t.Fatalf("got a %T; want *GoAwayFrame", f) 435 } 436 return gf 437 } 438 439 func (st *serverTester) wantRSTStream(streamID uint32, errCode ErrCode) { 440 f, err := st.readFrame() 441 if err != nil { 442 st.t.Fatalf("Error while expecting an RSTStream frame: %v", err) 443 } 444 rs, ok := f.(*RSTStreamFrame) 445 if !ok { 446 st.t.Fatalf("got a %T; want *RSTStreamFrame", f) 447 } 448 if rs.FrameHeader.StreamID != streamID { 449 st.t.Fatalf("RSTStream StreamID = %d; want %d", rs.FrameHeader.StreamID, streamID) 450 } 451 if rs.ErrCode != errCode { 452 st.t.Fatalf("RSTStream ErrCode = %d (%s); want %d (%s)", rs.ErrCode, rs.ErrCode, errCode, errCode) 453 } 454 } 455 456 func (st *serverTester) wantWindowUpdate(streamID, incr uint32) { 457 f, err := st.readFrame() 458 if err != nil { 459 st.t.Fatalf("Error while expecting a WINDOW_UPDATE frame: %v", err) 460 } 461 wu, ok := f.(*WindowUpdateFrame) 462 if !ok { 463 st.t.Fatalf("got a %T; want *WindowUpdateFrame", f) 464 } 465 if wu.FrameHeader.StreamID != streamID { 466 st.t.Fatalf("WindowUpdate StreamID = %d; want %d", wu.FrameHeader.StreamID, streamID) 467 } 468 if wu.Increment != incr { 469 st.t.Fatalf("WindowUpdate increment = %d; want %d", wu.Increment, incr) 470 } 471 } 472 473 func (st *serverTester) wantSettingsAck() { 474 f, err := st.readFrame() 475 if err != nil { 476 st.t.Fatal(err) 477 } 478 sf, ok := f.(*SettingsFrame) 479 if !ok { 480 st.t.Fatalf("Wanting a settings ACK, received a %T", f) 481 } 482 if !sf.Header().Flags.Has(FlagSettingsAck) { 483 st.t.Fatal("Settings Frame didn't have ACK set") 484 } 485 486 } 487 488 func TestServer(t *testing.T) { 489 gotReq := make(chan bool, 1) 490 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 491 w.Header().Set("Foo", "Bar") 492 gotReq <- true 493 }) 494 defer st.Close() 495 496 covers("3.5", ` 497 The server connection preface consists of a potentially empty 498 SETTINGS frame ([SETTINGS]) that MUST be the first frame the 499 server sends in the HTTP/2 connection. 500 `) 501 502 st.writePreface() 503 st.writeInitialSettings() 504 st.wantSettings() 505 st.writeSettingsAck() 506 st.wantSettingsAck() 507 508 st.writeHeaders(HeadersFrameParam{ 509 StreamID: 1, // clients send odd numbers 510 BlockFragment: st.encodeHeader(), 511 EndStream: true, // no DATA frames 512 EndHeaders: true, 513 }) 514 515 select { 516 case <-gotReq: 517 case <-time.After(2 * time.Second): 518 t.Error("timeout waiting for request") 519 } 520 } 521 522 func TestServer_Request_Get(t *testing.T) { 523 testServerRequest(t, func(st *serverTester) { 524 st.writeHeaders(HeadersFrameParam{ 525 StreamID: 1, // clients send odd numbers 526 BlockFragment: st.encodeHeader("foo-bar", "some-value"), 527 EndStream: true, // no DATA frames 528 EndHeaders: true, 529 }) 530 }, func(r *http.Request) { 531 if r.Method != "GET" { 532 t.Errorf("Method = %q; want GET", r.Method) 533 } 534 if r.URL.Path != "/" { 535 t.Errorf("URL.Path = %q; want /", r.URL.Path) 536 } 537 if r.ContentLength != 0 { 538 t.Errorf("ContentLength = %v; want 0", r.ContentLength) 539 } 540 if r.Close { 541 t.Error("Close = true; want false") 542 } 543 if !strings.Contains(r.RemoteAddr, ":") { 544 t.Errorf("RemoteAddr = %q; want something with a colon", r.RemoteAddr) 545 } 546 if r.Proto != "HTTP/2.0" || r.ProtoMajor != 2 || r.ProtoMinor != 0 { 547 t.Errorf("Proto = %q Major=%v,Minor=%v; want HTTP/2.0", r.Proto, r.ProtoMajor, r.ProtoMinor) 548 } 549 wantHeader := http.Header{ 550 "Foo-Bar": []string{"some-value"}, 551 } 552 if !reflect.DeepEqual(r.Header, wantHeader) { 553 t.Errorf("Header = %#v; want %#v", r.Header, wantHeader) 554 } 555 if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 { 556 t.Errorf("Read = %d, %v; want 0, EOF", n, err) 557 } 558 }) 559 } 560 561 func TestServer_Request_Get_PathSlashes(t *testing.T) { 562 testServerRequest(t, func(st *serverTester) { 563 st.writeHeaders(HeadersFrameParam{ 564 StreamID: 1, // clients send odd numbers 565 BlockFragment: st.encodeHeader(":path", "/%2f/"), 566 EndStream: true, // no DATA frames 567 EndHeaders: true, 568 }) 569 }, func(r *http.Request) { 570 if r.RequestURI != "/%2f/" { 571 t.Errorf("RequestURI = %q; want /%%2f/", r.RequestURI) 572 } 573 if r.URL.Path != "///" { 574 t.Errorf("URL.Path = %q; want ///", r.URL.Path) 575 } 576 }) 577 } 578 579 // TODO: add a test with EndStream=true on the HEADERS but setting a 580 // Content-Length anyway. Should we just omit it and force it to 581 // zero? 582 583 func TestServer_Request_Post_NoContentLength_EndStream(t *testing.T) { 584 testServerRequest(t, func(st *serverTester) { 585 st.writeHeaders(HeadersFrameParam{ 586 StreamID: 1, // clients send odd numbers 587 BlockFragment: st.encodeHeader(":method", "POST"), 588 EndStream: true, 589 EndHeaders: true, 590 }) 591 }, func(r *http.Request) { 592 if r.Method != "POST" { 593 t.Errorf("Method = %q; want POST", r.Method) 594 } 595 if r.ContentLength != 0 { 596 t.Errorf("ContentLength = %v; want 0", r.ContentLength) 597 } 598 if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 { 599 t.Errorf("Read = %d, %v; want 0, EOF", n, err) 600 } 601 }) 602 } 603 604 func TestServer_Request_Post_Body_ImmediateEOF(t *testing.T) { 605 testBodyContents(t, -1, "", func(st *serverTester) { 606 st.writeHeaders(HeadersFrameParam{ 607 StreamID: 1, // clients send odd numbers 608 BlockFragment: st.encodeHeader(":method", "POST"), 609 EndStream: false, // to say DATA frames are coming 610 EndHeaders: true, 611 }) 612 st.writeData(1, true, nil) // just kidding. empty body. 613 }) 614 } 615 616 func TestServer_Request_Post_Body_OneData(t *testing.T) { 617 const content = "Some content" 618 testBodyContents(t, -1, content, func(st *serverTester) { 619 st.writeHeaders(HeadersFrameParam{ 620 StreamID: 1, // clients send odd numbers 621 BlockFragment: st.encodeHeader(":method", "POST"), 622 EndStream: false, // to say DATA frames are coming 623 EndHeaders: true, 624 }) 625 st.writeData(1, true, []byte(content)) 626 }) 627 } 628 629 func TestServer_Request_Post_Body_TwoData(t *testing.T) { 630 const content = "Some content" 631 testBodyContents(t, -1, content, func(st *serverTester) { 632 st.writeHeaders(HeadersFrameParam{ 633 StreamID: 1, // clients send odd numbers 634 BlockFragment: st.encodeHeader(":method", "POST"), 635 EndStream: false, // to say DATA frames are coming 636 EndHeaders: true, 637 }) 638 st.writeData(1, false, []byte(content[:5])) 639 st.writeData(1, true, []byte(content[5:])) 640 }) 641 } 642 643 func TestServer_Request_Post_Body_ContentLength_Correct(t *testing.T) { 644 const content = "Some content" 645 testBodyContents(t, int64(len(content)), content, func(st *serverTester) { 646 st.writeHeaders(HeadersFrameParam{ 647 StreamID: 1, // clients send odd numbers 648 BlockFragment: st.encodeHeader( 649 ":method", "POST", 650 "content-length", strconv.Itoa(len(content)), 651 ), 652 EndStream: false, // to say DATA frames are coming 653 EndHeaders: true, 654 }) 655 st.writeData(1, true, []byte(content)) 656 }) 657 } 658 659 func TestServer_Request_Post_Body_ContentLength_TooLarge(t *testing.T) { 660 testBodyContentsFail(t, 3, "request declared a Content-Length of 3 but only wrote 2 bytes", 661 func(st *serverTester) { 662 st.writeHeaders(HeadersFrameParam{ 663 StreamID: 1, // clients send odd numbers 664 BlockFragment: st.encodeHeader( 665 ":method", "POST", 666 "content-length", "3", 667 ), 668 EndStream: false, // to say DATA frames are coming 669 EndHeaders: true, 670 }) 671 st.writeData(1, true, []byte("12")) 672 }) 673 } 674 675 func TestServer_Request_Post_Body_ContentLength_TooSmall(t *testing.T) { 676 testBodyContentsFail(t, 4, "sender tried to send more than declared Content-Length of 4 bytes", 677 func(st *serverTester) { 678 st.writeHeaders(HeadersFrameParam{ 679 StreamID: 1, // clients send odd numbers 680 BlockFragment: st.encodeHeader( 681 ":method", "POST", 682 "content-length", "4", 683 ), 684 EndStream: false, // to say DATA frames are coming 685 EndHeaders: true, 686 }) 687 st.writeData(1, true, []byte("12345")) 688 }) 689 } 690 691 func testBodyContents(t *testing.T, wantContentLength int64, wantBody string, write func(st *serverTester)) { 692 testServerRequest(t, write, func(r *http.Request) { 693 if r.Method != "POST" { 694 t.Errorf("Method = %q; want POST", r.Method) 695 } 696 if r.ContentLength != wantContentLength { 697 t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength) 698 } 699 all, err := ioutil.ReadAll(r.Body) 700 if err != nil { 701 t.Fatal(err) 702 } 703 if string(all) != wantBody { 704 t.Errorf("Read = %q; want %q", all, wantBody) 705 } 706 if err := r.Body.Close(); err != nil { 707 t.Fatalf("Close: %v", err) 708 } 709 }) 710 } 711 712 func testBodyContentsFail(t *testing.T, wantContentLength int64, wantReadError string, write func(st *serverTester)) { 713 testServerRequest(t, write, func(r *http.Request) { 714 if r.Method != "POST" { 715 t.Errorf("Method = %q; want POST", r.Method) 716 } 717 if r.ContentLength != wantContentLength { 718 t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength) 719 } 720 all, err := ioutil.ReadAll(r.Body) 721 if err == nil { 722 t.Fatalf("expected an error (%q) reading from the body. Successfully read %q instead.", 723 wantReadError, all) 724 } 725 if !strings.Contains(err.Error(), wantReadError) { 726 t.Fatalf("Body.Read = %v; want substring %q", err, wantReadError) 727 } 728 if err := r.Body.Close(); err != nil { 729 t.Fatalf("Close: %v", err) 730 } 731 }) 732 } 733 734 // Using a Host header, instead of :authority 735 func TestServer_Request_Get_Host(t *testing.T) { 736 const host = "example.com" 737 testServerRequest(t, func(st *serverTester) { 738 st.writeHeaders(HeadersFrameParam{ 739 StreamID: 1, // clients send odd numbers 740 BlockFragment: st.encodeHeader("host", host), 741 EndStream: true, 742 EndHeaders: true, 743 }) 744 }, func(r *http.Request) { 745 if r.Host != host { 746 t.Errorf("Host = %q; want %q", r.Host, host) 747 } 748 }) 749 } 750 751 // Using an :authority pseudo-header, instead of Host 752 func TestServer_Request_Get_Authority(t *testing.T) { 753 const host = "example.com" 754 testServerRequest(t, func(st *serverTester) { 755 st.writeHeaders(HeadersFrameParam{ 756 StreamID: 1, // clients send odd numbers 757 BlockFragment: st.encodeHeader(":authority", host), 758 EndStream: true, 759 EndHeaders: true, 760 }) 761 }, func(r *http.Request) { 762 if r.Host != host { 763 t.Errorf("Host = %q; want %q", r.Host, host) 764 } 765 }) 766 } 767 768 func TestServer_Request_WithContinuation(t *testing.T) { 769 wantHeader := http.Header{ 770 "Foo-One": []string{"value-one"}, 771 "Foo-Two": []string{"value-two"}, 772 "Foo-Three": []string{"value-three"}, 773 } 774 testServerRequest(t, func(st *serverTester) { 775 fullHeaders := st.encodeHeader( 776 "foo-one", "value-one", 777 "foo-two", "value-two", 778 "foo-three", "value-three", 779 ) 780 remain := fullHeaders 781 chunks := 0 782 for len(remain) > 0 { 783 const maxChunkSize = 5 784 chunk := remain 785 if len(chunk) > maxChunkSize { 786 chunk = chunk[:maxChunkSize] 787 } 788 remain = remain[len(chunk):] 789 790 if chunks == 0 { 791 st.writeHeaders(HeadersFrameParam{ 792 StreamID: 1, // clients send odd numbers 793 BlockFragment: chunk, 794 EndStream: true, // no DATA frames 795 EndHeaders: false, // we'll have continuation frames 796 }) 797 } else { 798 err := st.fr.WriteContinuation(1, len(remain) == 0, chunk) 799 if err != nil { 800 t.Fatal(err) 801 } 802 } 803 chunks++ 804 } 805 if chunks < 2 { 806 t.Fatal("too few chunks") 807 } 808 }, func(r *http.Request) { 809 if !reflect.DeepEqual(r.Header, wantHeader) { 810 t.Errorf("Header = %#v; want %#v", r.Header, wantHeader) 811 } 812 }) 813 } 814 815 // Concatenated cookie headers. ("8.1.2.5 Compressing the Cookie Header Field") 816 func TestServer_Request_CookieConcat(t *testing.T) { 817 const host = "example.com" 818 testServerRequest(t, func(st *serverTester) { 819 st.bodylessReq1( 820 ":authority", host, 821 "cookie", "a=b", 822 "cookie", "c=d", 823 "cookie", "e=f", 824 ) 825 }, func(r *http.Request) { 826 const want = "a=b; c=d; e=f" 827 if got := r.Header.Get("Cookie"); got != want { 828 t.Errorf("Cookie = %q; want %q", got, want) 829 } 830 }) 831 } 832 833 func TestServer_Request_Reject_CapitalHeader(t *testing.T) { 834 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("UPPER", "v") }) 835 } 836 837 func TestServer_Request_Reject_Pseudo_Missing_method(t *testing.T) { 838 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "") }) 839 } 840 841 func TestServer_Request_Reject_Pseudo_ExactlyOne(t *testing.T) { 842 // 8.1.2.3 Request Pseudo-Header Fields 843 // "All HTTP/2 requests MUST include exactly one valid value" ... 844 testRejectRequest(t, func(st *serverTester) { 845 st.addLogFilter("duplicate pseudo-header") 846 st.bodylessReq1(":method", "GET", ":method", "POST") 847 }) 848 } 849 850 func TestServer_Request_Reject_Pseudo_AfterRegular(t *testing.T) { 851 // 8.1.2.3 Request Pseudo-Header Fields 852 // "All pseudo-header fields MUST appear in the header block 853 // before regular header fields. Any request or response that 854 // contains a pseudo-header field that appears in a header 855 // block after a regular header field MUST be treated as 856 // malformed (Section 8.1.2.6)." 857 testRejectRequest(t, func(st *serverTester) { 858 st.addLogFilter("pseudo-header after regular header") 859 var buf bytes.Buffer 860 enc := hpack.NewEncoder(&buf) 861 enc.WriteField(hpack.HeaderField{Name: ":method", Value: "GET"}) 862 enc.WriteField(hpack.HeaderField{Name: "regular", Value: "foobar"}) 863 enc.WriteField(hpack.HeaderField{Name: ":path", Value: "/"}) 864 enc.WriteField(hpack.HeaderField{Name: ":scheme", Value: "https"}) 865 st.writeHeaders(HeadersFrameParam{ 866 StreamID: 1, // clients send odd numbers 867 BlockFragment: buf.Bytes(), 868 EndStream: true, 869 EndHeaders: true, 870 }) 871 }) 872 } 873 874 func TestServer_Request_Reject_Pseudo_Missing_path(t *testing.T) { 875 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":path", "") }) 876 } 877 878 func TestServer_Request_Reject_Pseudo_Missing_scheme(t *testing.T) { 879 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "") }) 880 } 881 882 func TestServer_Request_Reject_Pseudo_scheme_invalid(t *testing.T) { 883 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "bogus") }) 884 } 885 886 func TestServer_Request_Reject_Pseudo_Unknown(t *testing.T) { 887 testRejectRequest(t, func(st *serverTester) { 888 st.addLogFilter(`invalid pseudo-header ":unknown_thing"`) 889 st.bodylessReq1(":unknown_thing", "") 890 }) 891 } 892 893 func testRejectRequest(t *testing.T, send func(*serverTester)) { 894 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 895 t.Fatal("server request made it to handler; should've been rejected") 896 }) 897 defer st.Close() 898 899 st.greet() 900 send(st) 901 st.wantRSTStream(1, ErrCodeProtocol) 902 } 903 904 func TestServer_Request_Connect(t *testing.T) { 905 testServerRequest(t, func(st *serverTester) { 906 st.writeHeaders(HeadersFrameParam{ 907 StreamID: 1, 908 BlockFragment: st.encodeHeaderRaw( 909 ":method", "CONNECT", 910 ":authority", "example.com:123", 911 ), 912 EndStream: true, 913 EndHeaders: true, 914 }) 915 }, func(r *http.Request) { 916 if g, w := r.Method, "CONNECT"; g != w { 917 t.Errorf("Method = %q; want %q", g, w) 918 } 919 if g, w := r.RequestURI, "example.com:123"; g != w { 920 t.Errorf("RequestURI = %q; want %q", g, w) 921 } 922 if g, w := r.URL.Host, "example.com:123"; g != w { 923 t.Errorf("URL.Host = %q; want %q", g, w) 924 } 925 }) 926 } 927 928 func TestServer_Request_Connect_InvalidPath(t *testing.T) { 929 testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { 930 st.writeHeaders(HeadersFrameParam{ 931 StreamID: 1, 932 BlockFragment: st.encodeHeaderRaw( 933 ":method", "CONNECT", 934 ":authority", "example.com:123", 935 ":path", "/bogus", 936 ), 937 EndStream: true, 938 EndHeaders: true, 939 }) 940 }) 941 } 942 943 func TestServer_Request_Connect_InvalidScheme(t *testing.T) { 944 testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { 945 st.writeHeaders(HeadersFrameParam{ 946 StreamID: 1, 947 BlockFragment: st.encodeHeaderRaw( 948 ":method", "CONNECT", 949 ":authority", "example.com:123", 950 ":scheme", "https", 951 ), 952 EndStream: true, 953 EndHeaders: true, 954 }) 955 }) 956 } 957 958 func TestServer_Ping(t *testing.T) { 959 st := newServerTester(t, nil) 960 defer st.Close() 961 st.greet() 962 963 // Server should ignore this one, since it has ACK set. 964 ackPingData := [8]byte{1, 2, 4, 8, 16, 32, 64, 128} 965 if err := st.fr.WritePing(true, ackPingData); err != nil { 966 t.Fatal(err) 967 } 968 969 // But the server should reply to this one, since ACK is false. 970 pingData := [8]byte{1, 2, 3, 4, 5, 6, 7, 8} 971 if err := st.fr.WritePing(false, pingData); err != nil { 972 t.Fatal(err) 973 } 974 975 pf := st.wantPing() 976 if !pf.Flags.Has(FlagPingAck) { 977 t.Error("response ping doesn't have ACK set") 978 } 979 if pf.Data != pingData { 980 t.Errorf("response ping has data %q; want %q", pf.Data, pingData) 981 } 982 } 983 984 func TestServer_RejectsLargeFrames(t *testing.T) { 985 st := newServerTester(t, nil) 986 defer st.Close() 987 st.greet() 988 989 // Write too large of a frame (too large by one byte) 990 // We ignore the return value because it's expected that the server 991 // will only read the first 9 bytes (the headre) and then disconnect. 992 st.fr.WriteRawFrame(0xff, 0, 0, make([]byte, defaultMaxReadFrameSize+1)) 993 994 gf := st.wantGoAway() 995 if gf.ErrCode != ErrCodeFrameSize { 996 t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFrameSize) 997 } 998 if st.logBuf.Len() != 0 { 999 // Previously we spun here for a bit until the GOAWAY disconnect 1000 // timer fired, logging while we fired. 1001 t.Errorf("unexpected server output: %.500s\n", st.logBuf.Bytes()) 1002 } 1003 } 1004 1005 func TestServer_Handler_Sends_WindowUpdate(t *testing.T) { 1006 puppet := newHandlerPuppet() 1007 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 1008 puppet.act(w, r) 1009 }) 1010 defer st.Close() 1011 defer puppet.done() 1012 1013 st.greet() 1014 1015 st.writeHeaders(HeadersFrameParam{ 1016 StreamID: 1, // clients send odd numbers 1017 BlockFragment: st.encodeHeader(":method", "POST"), 1018 EndStream: false, // data coming 1019 EndHeaders: true, 1020 }) 1021 st.writeData(1, false, []byte("abcdef")) 1022 puppet.do(readBodyHandler(t, "abc")) 1023 st.wantWindowUpdate(0, 3) 1024 st.wantWindowUpdate(1, 3) 1025 1026 puppet.do(readBodyHandler(t, "def")) 1027 st.wantWindowUpdate(0, 3) 1028 st.wantWindowUpdate(1, 3) 1029 1030 st.writeData(1, true, []byte("ghijkl")) // END_STREAM here 1031 puppet.do(readBodyHandler(t, "ghi")) 1032 puppet.do(readBodyHandler(t, "jkl")) 1033 st.wantWindowUpdate(0, 3) 1034 st.wantWindowUpdate(0, 3) // no more stream-level, since END_STREAM 1035 } 1036 1037 func TestServer_Send_GoAway_After_Bogus_WindowUpdate(t *testing.T) { 1038 st := newServerTester(t, nil) 1039 defer st.Close() 1040 st.greet() 1041 if err := st.fr.WriteWindowUpdate(0, 1<<31-1); err != nil { 1042 t.Fatal(err) 1043 } 1044 gf := st.wantGoAway() 1045 if gf.ErrCode != ErrCodeFlowControl { 1046 t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFlowControl) 1047 } 1048 if gf.LastStreamID != 0 { 1049 t.Errorf("GOAWAY last stream ID = %v; want %v", gf.LastStreamID, 0) 1050 } 1051 } 1052 1053 func TestServer_Send_RstStream_After_Bogus_WindowUpdate(t *testing.T) { 1054 inHandler := make(chan bool) 1055 blockHandler := make(chan bool) 1056 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 1057 inHandler <- true 1058 <-blockHandler 1059 }) 1060 defer st.Close() 1061 defer close(blockHandler) 1062 st.greet() 1063 st.writeHeaders(HeadersFrameParam{ 1064 StreamID: 1, 1065 BlockFragment: st.encodeHeader(":method", "POST"), 1066 EndStream: false, // keep it open 1067 EndHeaders: true, 1068 }) 1069 <-inHandler 1070 // Send a bogus window update: 1071 if err := st.fr.WriteWindowUpdate(1, 1<<31-1); err != nil { 1072 t.Fatal(err) 1073 } 1074 st.wantRSTStream(1, ErrCodeFlowControl) 1075 } 1076 1077 // testServerPostUnblock sends a hanging POST with unsent data to handler, 1078 // then runs fn once in the handler, and verifies that the error returned from 1079 // handler is acceptable. It fails if takes over 5 seconds for handler to exit. 1080 func testServerPostUnblock(t *testing.T, 1081 handler func(http.ResponseWriter, *http.Request) error, 1082 fn func(*serverTester), 1083 checkErr func(error), 1084 otherHeaders ...string) { 1085 inHandler := make(chan bool) 1086 errc := make(chan error, 1) 1087 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 1088 inHandler <- true 1089 errc <- handler(w, r) 1090 }) 1091 st.greet() 1092 st.writeHeaders(HeadersFrameParam{ 1093 StreamID: 1, 1094 BlockFragment: st.encodeHeader(append([]string{":method", "POST"}, otherHeaders...)...), 1095 EndStream: false, // keep it open 1096 EndHeaders: true, 1097 }) 1098 <-inHandler 1099 fn(st) 1100 select { 1101 case err := <-errc: 1102 if checkErr != nil { 1103 checkErr(err) 1104 } 1105 case <-time.After(5 * time.Second): 1106 t.Fatal("timeout waiting for Handler to return") 1107 } 1108 st.Close() 1109 } 1110 1111 func TestServer_RSTStream_Unblocks_Read(t *testing.T) { 1112 testServerPostUnblock(t, 1113 func(w http.ResponseWriter, r *http.Request) (err error) { 1114 _, err = r.Body.Read(make([]byte, 1)) 1115 return 1116 }, 1117 func(st *serverTester) { 1118 if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { 1119 t.Fatal(err) 1120 } 1121 }, 1122 func(err error) { 1123 if err == nil { 1124 t.Error("unexpected nil error from Request.Body.Read") 1125 } 1126 }, 1127 ) 1128 } 1129 1130 func TestServer_RSTStream_Unblocks_Header_Write(t *testing.T) { 1131 // Run this test a bunch, because it doesn't always 1132 // deadlock. But with a bunch, it did. 1133 n := 50 1134 if testing.Short() { 1135 n = 5 1136 } 1137 for i := 0; i < n; i++ { 1138 testServer_RSTStream_Unblocks_Header_Write(t) 1139 } 1140 } 1141 1142 func testServer_RSTStream_Unblocks_Header_Write(t *testing.T) { 1143 inHandler := make(chan bool, 1) 1144 unblockHandler := make(chan bool, 1) 1145 headerWritten := make(chan bool, 1) 1146 wroteRST := make(chan bool, 1) 1147 1148 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 1149 inHandler <- true 1150 <-wroteRST 1151 w.Header().Set("foo", "bar") 1152 w.WriteHeader(200) 1153 w.(http.Flusher).Flush() 1154 headerWritten <- true 1155 <-unblockHandler 1156 }) 1157 defer st.Close() 1158 1159 st.greet() 1160 st.writeHeaders(HeadersFrameParam{ 1161 StreamID: 1, 1162 BlockFragment: st.encodeHeader(":method", "POST"), 1163 EndStream: false, // keep it open 1164 EndHeaders: true, 1165 }) 1166 <-inHandler 1167 if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { 1168 t.Fatal(err) 1169 } 1170 wroteRST <- true 1171 st.awaitIdle() 1172 select { 1173 case <-headerWritten: 1174 case <-time.After(2 * time.Second): 1175 t.Error("timeout waiting for header write") 1176 } 1177 unblockHandler <- true 1178 } 1179 1180 func TestServer_DeadConn_Unblocks_Read(t *testing.T) { 1181 testServerPostUnblock(t, 1182 func(w http.ResponseWriter, r *http.Request) (err error) { 1183 _, err = r.Body.Read(make([]byte, 1)) 1184 return 1185 }, 1186 func(st *serverTester) { st.cc.Close() }, 1187 func(err error) { 1188 if err == nil { 1189 t.Error("unexpected nil error from Request.Body.Read") 1190 } 1191 }, 1192 ) 1193 } 1194 1195 var blockUntilClosed = func(w http.ResponseWriter, r *http.Request) error { 1196 <-w.(http.CloseNotifier).CloseNotify() 1197 return nil 1198 } 1199 1200 func TestServer_CloseNotify_After_RSTStream(t *testing.T) { 1201 testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { 1202 if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { 1203 t.Fatal(err) 1204 } 1205 }, nil) 1206 } 1207 1208 func TestServer_CloseNotify_After_ConnClose(t *testing.T) { 1209 testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { st.cc.Close() }, nil) 1210 } 1211 1212 // that CloseNotify unblocks after a stream error due to the client's 1213 // problem that's unrelated to them explicitly canceling it (which is 1214 // TestServer_CloseNotify_After_RSTStream above) 1215 func TestServer_CloseNotify_After_StreamError(t *testing.T) { 1216 testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { 1217 // data longer than declared Content-Length => stream error 1218 st.writeData(1, true, []byte("1234")) 1219 }, nil, "content-length", "3") 1220 } 1221 1222 func TestServer_StateTransitions(t *testing.T) { 1223 var st *serverTester 1224 inHandler := make(chan bool) 1225 writeData := make(chan bool) 1226 leaveHandler := make(chan bool) 1227 st = newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 1228 inHandler <- true 1229 if st.stream(1) == nil { 1230 t.Errorf("nil stream 1 in handler") 1231 } 1232 if got, want := st.streamState(1), stateOpen; got != want { 1233 t.Errorf("in handler, state is %v; want %v", got, want) 1234 } 1235 writeData <- true 1236 if n, err := r.Body.Read(make([]byte, 1)); n != 0 || err != io.EOF { 1237 t.Errorf("body read = %d, %v; want 0, EOF", n, err) 1238 } 1239 if got, want := st.streamState(1), stateHalfClosedRemote; got != want { 1240 t.Errorf("in handler, state is %v; want %v", got, want) 1241 } 1242 1243 <-leaveHandler 1244 }) 1245 st.greet() 1246 if st.stream(1) != nil { 1247 t.Fatal("stream 1 should be empty") 1248 } 1249 if got := st.streamState(1); got != stateIdle { 1250 t.Fatalf("stream 1 should be idle; got %v", got) 1251 } 1252 1253 st.writeHeaders(HeadersFrameParam{ 1254 StreamID: 1, 1255 BlockFragment: st.encodeHeader(":method", "POST"), 1256 EndStream: false, // keep it open 1257 EndHeaders: true, 1258 }) 1259 <-inHandler 1260 <-writeData 1261 st.writeData(1, true, nil) 1262 1263 leaveHandler <- true 1264 hf := st.wantHeaders() 1265 if !hf.StreamEnded() { 1266 t.Fatal("expected END_STREAM flag") 1267 } 1268 1269 if got, want := st.streamState(1), stateClosed; got != want { 1270 t.Errorf("at end, state is %v; want %v", got, want) 1271 } 1272 if st.stream(1) != nil { 1273 t.Fatal("at end, stream 1 should be gone") 1274 } 1275 } 1276 1277 // test HEADERS w/o EndHeaders + another HEADERS (should get rejected) 1278 func TestServer_Rejects_HeadersNoEnd_Then_Headers(t *testing.T) { 1279 testServerRejectsConn(t, func(st *serverTester) { 1280 st.writeHeaders(HeadersFrameParam{ 1281 StreamID: 1, 1282 BlockFragment: st.encodeHeader(), 1283 EndStream: true, 1284 EndHeaders: false, 1285 }) 1286 st.writeHeaders(HeadersFrameParam{ // Not a continuation. 1287 StreamID: 3, // different stream. 1288 BlockFragment: st.encodeHeader(), 1289 EndStream: true, 1290 EndHeaders: true, 1291 }) 1292 }) 1293 } 1294 1295 // test HEADERS w/o EndHeaders + PING (should get rejected) 1296 func TestServer_Rejects_HeadersNoEnd_Then_Ping(t *testing.T) { 1297 testServerRejectsConn(t, func(st *serverTester) { 1298 st.writeHeaders(HeadersFrameParam{ 1299 StreamID: 1, 1300 BlockFragment: st.encodeHeader(), 1301 EndStream: true, 1302 EndHeaders: false, 1303 }) 1304 if err := st.fr.WritePing(false, [8]byte{}); err != nil { 1305 t.Fatal(err) 1306 } 1307 }) 1308 } 1309 1310 // test HEADERS w/ EndHeaders + a continuation HEADERS (should get rejected) 1311 func TestServer_Rejects_HeadersEnd_Then_Continuation(t *testing.T) { 1312 testServerRejectsConn(t, func(st *serverTester) { 1313 st.writeHeaders(HeadersFrameParam{ 1314 StreamID: 1, 1315 BlockFragment: st.encodeHeader(), 1316 EndStream: true, 1317 EndHeaders: true, 1318 }) 1319 st.wantHeaders() 1320 if err := st.fr.WriteContinuation(1, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil { 1321 t.Fatal(err) 1322 } 1323 }) 1324 } 1325 1326 // test HEADERS w/o EndHeaders + a continuation HEADERS on wrong stream ID 1327 func TestServer_Rejects_HeadersNoEnd_Then_ContinuationWrongStream(t *testing.T) { 1328 testServerRejectsConn(t, func(st *serverTester) { 1329 st.writeHeaders(HeadersFrameParam{ 1330 StreamID: 1, 1331 BlockFragment: st.encodeHeader(), 1332 EndStream: true, 1333 EndHeaders: false, 1334 }) 1335 if err := st.fr.WriteContinuation(3, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil { 1336 t.Fatal(err) 1337 } 1338 }) 1339 } 1340 1341 // No HEADERS on stream 0. 1342 func TestServer_Rejects_Headers0(t *testing.T) { 1343 testServerRejectsConn(t, func(st *serverTester) { 1344 st.fr.AllowIllegalWrites = true 1345 st.writeHeaders(HeadersFrameParam{ 1346 StreamID: 0, 1347 BlockFragment: st.encodeHeader(), 1348 EndStream: true, 1349 EndHeaders: true, 1350 }) 1351 }) 1352 } 1353 1354 // No CONTINUATION on stream 0. 1355 func TestServer_Rejects_Continuation0(t *testing.T) { 1356 testServerRejectsConn(t, func(st *serverTester) { 1357 st.fr.AllowIllegalWrites = true 1358 if err := st.fr.WriteContinuation(0, true, st.encodeHeader()); err != nil { 1359 t.Fatal(err) 1360 } 1361 }) 1362 } 1363 1364 func TestServer_Rejects_PushPromise(t *testing.T) { 1365 testServerRejectsConn(t, func(st *serverTester) { 1366 pp := PushPromiseParam{ 1367 StreamID: 1, 1368 PromiseID: 3, 1369 } 1370 if err := st.fr.WritePushPromise(pp); err != nil { 1371 t.Fatal(err) 1372 } 1373 }) 1374 } 1375 1376 // testServerRejectsConn tests that the server hangs up with a GOAWAY 1377 // frame and a server close after the client does something 1378 // deserving a CONNECTION_ERROR. 1379 func testServerRejectsConn(t *testing.T, writeReq func(*serverTester)) { 1380 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}) 1381 st.addLogFilter("connection error: PROTOCOL_ERROR") 1382 defer st.Close() 1383 st.greet() 1384 writeReq(st) 1385 1386 st.wantGoAway() 1387 errc := make(chan error, 1) 1388 go func() { 1389 fr, err := st.fr.ReadFrame() 1390 if err == nil { 1391 err = fmt.Errorf("got frame of type %T", fr) 1392 } 1393 errc <- err 1394 }() 1395 select { 1396 case err := <-errc: 1397 if err != io.EOF { 1398 t.Errorf("ReadFrame = %v; want io.EOF", err) 1399 } 1400 case <-time.After(2 * time.Second): 1401 t.Error("timeout waiting for disconnect") 1402 } 1403 } 1404 1405 // testServerRejectsStream tests that the server sends a RST_STREAM with the provided 1406 // error code after a client sends a bogus request. 1407 func testServerRejectsStream(t *testing.T, code ErrCode, writeReq func(*serverTester)) { 1408 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}) 1409 defer st.Close() 1410 st.greet() 1411 writeReq(st) 1412 st.wantRSTStream(1, code) 1413 } 1414 1415 // testServerRequest sets up an idle HTTP/2 connection and lets you 1416 // write a single request with writeReq, and then verify that the 1417 // *http.Request is built correctly in checkReq. 1418 func testServerRequest(t *testing.T, writeReq func(*serverTester), checkReq func(*http.Request)) { 1419 gotReq := make(chan bool, 1) 1420 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 1421 if r.Body == nil { 1422 t.Fatal("nil Body") 1423 } 1424 checkReq(r) 1425 gotReq <- true 1426 }) 1427 defer st.Close() 1428 1429 st.greet() 1430 writeReq(st) 1431 1432 select { 1433 case <-gotReq: 1434 case <-time.After(2 * time.Second): 1435 t.Error("timeout waiting for request") 1436 } 1437 } 1438 1439 func getSlash(st *serverTester) { st.bodylessReq1() } 1440 1441 func TestServer_Response_NoData(t *testing.T) { 1442 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1443 // Nothing. 1444 return nil 1445 }, func(st *serverTester) { 1446 getSlash(st) 1447 hf := st.wantHeaders() 1448 if !hf.StreamEnded() { 1449 t.Fatal("want END_STREAM flag") 1450 } 1451 if !hf.HeadersEnded() { 1452 t.Fatal("want END_HEADERS flag") 1453 } 1454 }) 1455 } 1456 1457 func TestServer_Response_NoData_Header_FooBar(t *testing.T) { 1458 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1459 w.Header().Set("Foo-Bar", "some-value") 1460 return nil 1461 }, func(st *serverTester) { 1462 getSlash(st) 1463 hf := st.wantHeaders() 1464 if !hf.StreamEnded() { 1465 t.Fatal("want END_STREAM flag") 1466 } 1467 if !hf.HeadersEnded() { 1468 t.Fatal("want END_HEADERS flag") 1469 } 1470 goth := st.decodeHeader(hf.HeaderBlockFragment()) 1471 wanth := [][2]string{ 1472 {":status", "200"}, 1473 {"foo-bar", "some-value"}, 1474 {"content-type", "text/plain; charset=utf-8"}, 1475 {"content-length", "0"}, 1476 } 1477 if !reflect.DeepEqual(goth, wanth) { 1478 t.Errorf("Got headers %v; want %v", goth, wanth) 1479 } 1480 }) 1481 } 1482 1483 func TestServer_Response_Data_Sniff_DoesntOverride(t *testing.T) { 1484 const msg = "<html>this is HTML." 1485 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1486 w.Header().Set("Content-Type", "foo/bar") 1487 io.WriteString(w, msg) 1488 return nil 1489 }, func(st *serverTester) { 1490 getSlash(st) 1491 hf := st.wantHeaders() 1492 if hf.StreamEnded() { 1493 t.Fatal("don't want END_STREAM, expecting data") 1494 } 1495 if !hf.HeadersEnded() { 1496 t.Fatal("want END_HEADERS flag") 1497 } 1498 goth := st.decodeHeader(hf.HeaderBlockFragment()) 1499 wanth := [][2]string{ 1500 {":status", "200"}, 1501 {"content-type", "foo/bar"}, 1502 {"content-length", strconv.Itoa(len(msg))}, 1503 } 1504 if !reflect.DeepEqual(goth, wanth) { 1505 t.Errorf("Got headers %v; want %v", goth, wanth) 1506 } 1507 df := st.wantData() 1508 if !df.StreamEnded() { 1509 t.Error("expected DATA to have END_STREAM flag") 1510 } 1511 if got := string(df.Data()); got != msg { 1512 t.Errorf("got DATA %q; want %q", got, msg) 1513 } 1514 }) 1515 } 1516 1517 func TestServer_Response_TransferEncoding_chunked(t *testing.T) { 1518 const msg = "hi" 1519 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1520 w.Header().Set("Transfer-Encoding", "chunked") // should be stripped 1521 io.WriteString(w, msg) 1522 return nil 1523 }, func(st *serverTester) { 1524 getSlash(st) 1525 hf := st.wantHeaders() 1526 goth := st.decodeHeader(hf.HeaderBlockFragment()) 1527 wanth := [][2]string{ 1528 {":status", "200"}, 1529 {"content-type", "text/plain; charset=utf-8"}, 1530 {"content-length", strconv.Itoa(len(msg))}, 1531 } 1532 if !reflect.DeepEqual(goth, wanth) { 1533 t.Errorf("Got headers %v; want %v", goth, wanth) 1534 } 1535 }) 1536 } 1537 1538 // Header accessed only after the initial write. 1539 func TestServer_Response_Data_IgnoreHeaderAfterWrite_After(t *testing.T) { 1540 const msg = "<html>this is HTML." 1541 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1542 io.WriteString(w, msg) 1543 w.Header().Set("foo", "should be ignored") 1544 return nil 1545 }, func(st *serverTester) { 1546 getSlash(st) 1547 hf := st.wantHeaders() 1548 if hf.StreamEnded() { 1549 t.Fatal("unexpected END_STREAM") 1550 } 1551 if !hf.HeadersEnded() { 1552 t.Fatal("want END_HEADERS flag") 1553 } 1554 goth := st.decodeHeader(hf.HeaderBlockFragment()) 1555 wanth := [][2]string{ 1556 {":status", "200"}, 1557 {"content-type", "text/html; charset=utf-8"}, 1558 {"content-length", strconv.Itoa(len(msg))}, 1559 } 1560 if !reflect.DeepEqual(goth, wanth) { 1561 t.Errorf("Got headers %v; want %v", goth, wanth) 1562 } 1563 }) 1564 } 1565 1566 // Header accessed before the initial write and later mutated. 1567 func TestServer_Response_Data_IgnoreHeaderAfterWrite_Overwrite(t *testing.T) { 1568 const msg = "<html>this is HTML." 1569 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1570 w.Header().Set("foo", "proper value") 1571 io.WriteString(w, msg) 1572 w.Header().Set("foo", "should be ignored") 1573 return nil 1574 }, func(st *serverTester) { 1575 getSlash(st) 1576 hf := st.wantHeaders() 1577 if hf.StreamEnded() { 1578 t.Fatal("unexpected END_STREAM") 1579 } 1580 if !hf.HeadersEnded() { 1581 t.Fatal("want END_HEADERS flag") 1582 } 1583 goth := st.decodeHeader(hf.HeaderBlockFragment()) 1584 wanth := [][2]string{ 1585 {":status", "200"}, 1586 {"foo", "proper value"}, 1587 {"content-type", "text/html; charset=utf-8"}, 1588 {"content-length", strconv.Itoa(len(msg))}, 1589 } 1590 if !reflect.DeepEqual(goth, wanth) { 1591 t.Errorf("Got headers %v; want %v", goth, wanth) 1592 } 1593 }) 1594 } 1595 1596 func TestServer_Response_Data_SniffLenType(t *testing.T) { 1597 const msg = "<html>this is HTML." 1598 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1599 io.WriteString(w, msg) 1600 return nil 1601 }, func(st *serverTester) { 1602 getSlash(st) 1603 hf := st.wantHeaders() 1604 if hf.StreamEnded() { 1605 t.Fatal("don't want END_STREAM, expecting data") 1606 } 1607 if !hf.HeadersEnded() { 1608 t.Fatal("want END_HEADERS flag") 1609 } 1610 goth := st.decodeHeader(hf.HeaderBlockFragment()) 1611 wanth := [][2]string{ 1612 {":status", "200"}, 1613 {"content-type", "text/html; charset=utf-8"}, 1614 {"content-length", strconv.Itoa(len(msg))}, 1615 } 1616 if !reflect.DeepEqual(goth, wanth) { 1617 t.Errorf("Got headers %v; want %v", goth, wanth) 1618 } 1619 df := st.wantData() 1620 if !df.StreamEnded() { 1621 t.Error("expected DATA to have END_STREAM flag") 1622 } 1623 if got := string(df.Data()); got != msg { 1624 t.Errorf("got DATA %q; want %q", got, msg) 1625 } 1626 }) 1627 } 1628 1629 func TestServer_Response_Header_Flush_MidWrite(t *testing.T) { 1630 const msg = "<html>this is HTML" 1631 const msg2 = ", and this is the next chunk" 1632 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1633 io.WriteString(w, msg) 1634 w.(http.Flusher).Flush() 1635 io.WriteString(w, msg2) 1636 return nil 1637 }, func(st *serverTester) { 1638 getSlash(st) 1639 hf := st.wantHeaders() 1640 if hf.StreamEnded() { 1641 t.Fatal("unexpected END_STREAM flag") 1642 } 1643 if !hf.HeadersEnded() { 1644 t.Fatal("want END_HEADERS flag") 1645 } 1646 goth := st.decodeHeader(hf.HeaderBlockFragment()) 1647 wanth := [][2]string{ 1648 {":status", "200"}, 1649 {"content-type", "text/html; charset=utf-8"}, // sniffed 1650 // and no content-length 1651 } 1652 if !reflect.DeepEqual(goth, wanth) { 1653 t.Errorf("Got headers %v; want %v", goth, wanth) 1654 } 1655 { 1656 df := st.wantData() 1657 if df.StreamEnded() { 1658 t.Error("unexpected END_STREAM flag") 1659 } 1660 if got := string(df.Data()); got != msg { 1661 t.Errorf("got DATA %q; want %q", got, msg) 1662 } 1663 } 1664 { 1665 df := st.wantData() 1666 if !df.StreamEnded() { 1667 t.Error("wanted END_STREAM flag on last data chunk") 1668 } 1669 if got := string(df.Data()); got != msg2 { 1670 t.Errorf("got DATA %q; want %q", got, msg2) 1671 } 1672 } 1673 }) 1674 } 1675 1676 func TestServer_Response_LargeWrite(t *testing.T) { 1677 const size = 1 << 20 1678 const maxFrameSize = 16 << 10 1679 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1680 n, err := w.Write(bytes.Repeat([]byte("a"), size)) 1681 if err != nil { 1682 return fmt.Errorf("Write error: %v", err) 1683 } 1684 if n != size { 1685 return fmt.Errorf("wrong size %d from Write", n) 1686 } 1687 return nil 1688 }, func(st *serverTester) { 1689 if err := st.fr.WriteSettings( 1690 Setting{SettingInitialWindowSize, 0}, 1691 Setting{SettingMaxFrameSize, maxFrameSize}, 1692 ); err != nil { 1693 t.Fatal(err) 1694 } 1695 st.wantSettingsAck() 1696 1697 getSlash(st) // make the single request 1698 1699 // Give the handler quota to write: 1700 if err := st.fr.WriteWindowUpdate(1, size); err != nil { 1701 t.Fatal(err) 1702 } 1703 // Give the handler quota to write to connection-level 1704 // window as well 1705 if err := st.fr.WriteWindowUpdate(0, size); err != nil { 1706 t.Fatal(err) 1707 } 1708 hf := st.wantHeaders() 1709 if hf.StreamEnded() { 1710 t.Fatal("unexpected END_STREAM flag") 1711 } 1712 if !hf.HeadersEnded() { 1713 t.Fatal("want END_HEADERS flag") 1714 } 1715 goth := st.decodeHeader(hf.HeaderBlockFragment()) 1716 wanth := [][2]string{ 1717 {":status", "200"}, 1718 {"content-type", "text/plain; charset=utf-8"}, // sniffed 1719 // and no content-length 1720 } 1721 if !reflect.DeepEqual(goth, wanth) { 1722 t.Errorf("Got headers %v; want %v", goth, wanth) 1723 } 1724 var bytes, frames int 1725 for { 1726 df := st.wantData() 1727 bytes += len(df.Data()) 1728 frames++ 1729 for _, b := range df.Data() { 1730 if b != 'a' { 1731 t.Fatal("non-'a' byte seen in DATA") 1732 } 1733 } 1734 if df.StreamEnded() { 1735 break 1736 } 1737 } 1738 if bytes != size { 1739 t.Errorf("Got %d bytes; want %d", bytes, size) 1740 } 1741 if want := int(size / maxFrameSize); frames < want || frames > want*2 { 1742 t.Errorf("Got %d frames; want %d", frames, size) 1743 } 1744 }) 1745 } 1746 1747 // Test that the handler can't write more than the client allows 1748 func TestServer_Response_LargeWrite_FlowControlled(t *testing.T) { 1749 const size = 1 << 20 1750 const maxFrameSize = 16 << 10 1751 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1752 w.(http.Flusher).Flush() 1753 n, err := w.Write(bytes.Repeat([]byte("a"), size)) 1754 if err != nil { 1755 return fmt.Errorf("Write error: %v", err) 1756 } 1757 if n != size { 1758 return fmt.Errorf("wrong size %d from Write", n) 1759 } 1760 return nil 1761 }, func(st *serverTester) { 1762 // Set the window size to something explicit for this test. 1763 // It's also how much initial data we expect. 1764 const initWindowSize = 123 1765 if err := st.fr.WriteSettings( 1766 Setting{SettingInitialWindowSize, initWindowSize}, 1767 Setting{SettingMaxFrameSize, maxFrameSize}, 1768 ); err != nil { 1769 t.Fatal(err) 1770 } 1771 st.wantSettingsAck() 1772 1773 getSlash(st) // make the single request 1774 defer func() { st.fr.WriteRSTStream(1, ErrCodeCancel) }() 1775 1776 hf := st.wantHeaders() 1777 if hf.StreamEnded() { 1778 t.Fatal("unexpected END_STREAM flag") 1779 } 1780 if !hf.HeadersEnded() { 1781 t.Fatal("want END_HEADERS flag") 1782 } 1783 1784 df := st.wantData() 1785 if got := len(df.Data()); got != initWindowSize { 1786 t.Fatalf("Initial window size = %d but got DATA with %d bytes", initWindowSize, got) 1787 } 1788 1789 for _, quota := range []int{1, 13, 127} { 1790 if err := st.fr.WriteWindowUpdate(1, uint32(quota)); err != nil { 1791 t.Fatal(err) 1792 } 1793 df := st.wantData() 1794 if int(quota) != len(df.Data()) { 1795 t.Fatalf("read %d bytes after giving %d quota", len(df.Data()), quota) 1796 } 1797 } 1798 1799 if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { 1800 t.Fatal(err) 1801 } 1802 }) 1803 } 1804 1805 // Test that the handler blocked in a Write is unblocked if the server sends a RST_STREAM. 1806 func TestServer_Response_RST_Unblocks_LargeWrite(t *testing.T) { 1807 const size = 1 << 20 1808 const maxFrameSize = 16 << 10 1809 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1810 w.(http.Flusher).Flush() 1811 errc := make(chan error, 1) 1812 go func() { 1813 _, err := w.Write(bytes.Repeat([]byte("a"), size)) 1814 errc <- err 1815 }() 1816 select { 1817 case err := <-errc: 1818 if err == nil { 1819 return errors.New("unexpected nil error from Write in handler") 1820 } 1821 return nil 1822 case <-time.After(2 * time.Second): 1823 return errors.New("timeout waiting for Write in handler") 1824 } 1825 }, func(st *serverTester) { 1826 if err := st.fr.WriteSettings( 1827 Setting{SettingInitialWindowSize, 0}, 1828 Setting{SettingMaxFrameSize, maxFrameSize}, 1829 ); err != nil { 1830 t.Fatal(err) 1831 } 1832 st.wantSettingsAck() 1833 1834 getSlash(st) // make the single request 1835 1836 hf := st.wantHeaders() 1837 if hf.StreamEnded() { 1838 t.Fatal("unexpected END_STREAM flag") 1839 } 1840 if !hf.HeadersEnded() { 1841 t.Fatal("want END_HEADERS flag") 1842 } 1843 1844 if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil { 1845 t.Fatal(err) 1846 } 1847 }) 1848 } 1849 1850 func TestServer_Response_Empty_Data_Not_FlowControlled(t *testing.T) { 1851 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1852 w.(http.Flusher).Flush() 1853 // Nothing; send empty DATA 1854 return nil 1855 }, func(st *serverTester) { 1856 // Handler gets no data quota: 1857 if err := st.fr.WriteSettings(Setting{SettingInitialWindowSize, 0}); err != nil { 1858 t.Fatal(err) 1859 } 1860 st.wantSettingsAck() 1861 1862 getSlash(st) // make the single request 1863 1864 hf := st.wantHeaders() 1865 if hf.StreamEnded() { 1866 t.Fatal("unexpected END_STREAM flag") 1867 } 1868 if !hf.HeadersEnded() { 1869 t.Fatal("want END_HEADERS flag") 1870 } 1871 1872 df := st.wantData() 1873 if got := len(df.Data()); got != 0 { 1874 t.Fatalf("unexpected %d DATA bytes; want 0", got) 1875 } 1876 if !df.StreamEnded() { 1877 t.Fatal("DATA didn't have END_STREAM") 1878 } 1879 }) 1880 } 1881 1882 func TestServer_Response_Automatic100Continue(t *testing.T) { 1883 const msg = "foo" 1884 const reply = "bar" 1885 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1886 if v := r.Header.Get("Expect"); v != "" { 1887 t.Errorf("Expect header = %q; want empty", v) 1888 } 1889 buf := make([]byte, len(msg)) 1890 // This read should trigger the 100-continue being sent. 1891 if n, err := io.ReadFull(r.Body, buf); err != nil || n != len(msg) || string(buf) != msg { 1892 return fmt.Errorf("ReadFull = %q, %v; want %q, nil", buf[:n], err, msg) 1893 } 1894 _, err := io.WriteString(w, reply) 1895 return err 1896 }, func(st *serverTester) { 1897 st.writeHeaders(HeadersFrameParam{ 1898 StreamID: 1, // clients send odd numbers 1899 BlockFragment: st.encodeHeader(":method", "POST", "expect", "100-continue"), 1900 EndStream: false, 1901 EndHeaders: true, 1902 }) 1903 hf := st.wantHeaders() 1904 if hf.StreamEnded() { 1905 t.Fatal("unexpected END_STREAM flag") 1906 } 1907 if !hf.HeadersEnded() { 1908 t.Fatal("want END_HEADERS flag") 1909 } 1910 goth := st.decodeHeader(hf.HeaderBlockFragment()) 1911 wanth := [][2]string{ 1912 {":status", "100"}, 1913 } 1914 if !reflect.DeepEqual(goth, wanth) { 1915 t.Fatalf("Got headers %v; want %v", goth, wanth) 1916 } 1917 1918 // Okay, they sent status 100, so we can send our 1919 // gigantic and/or sensitive "foo" payload now. 1920 st.writeData(1, true, []byte(msg)) 1921 1922 st.wantWindowUpdate(0, uint32(len(msg))) 1923 1924 hf = st.wantHeaders() 1925 if hf.StreamEnded() { 1926 t.Fatal("expected data to follow") 1927 } 1928 if !hf.HeadersEnded() { 1929 t.Fatal("want END_HEADERS flag") 1930 } 1931 goth = st.decodeHeader(hf.HeaderBlockFragment()) 1932 wanth = [][2]string{ 1933 {":status", "200"}, 1934 {"content-type", "text/plain; charset=utf-8"}, 1935 {"content-length", strconv.Itoa(len(reply))}, 1936 } 1937 if !reflect.DeepEqual(goth, wanth) { 1938 t.Errorf("Got headers %v; want %v", goth, wanth) 1939 } 1940 1941 df := st.wantData() 1942 if string(df.Data()) != reply { 1943 t.Errorf("Client read %q; want %q", df.Data(), reply) 1944 } 1945 if !df.StreamEnded() { 1946 t.Errorf("expect data stream end") 1947 } 1948 }) 1949 } 1950 1951 func TestServer_HandlerWriteErrorOnDisconnect(t *testing.T) { 1952 errc := make(chan error, 1) 1953 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 1954 p := []byte("some data.\n") 1955 for { 1956 _, err := w.Write(p) 1957 if err != nil { 1958 errc <- err 1959 return nil 1960 } 1961 } 1962 }, func(st *serverTester) { 1963 st.writeHeaders(HeadersFrameParam{ 1964 StreamID: 1, 1965 BlockFragment: st.encodeHeader(), 1966 EndStream: false, 1967 EndHeaders: true, 1968 }) 1969 hf := st.wantHeaders() 1970 if hf.StreamEnded() { 1971 t.Fatal("unexpected END_STREAM flag") 1972 } 1973 if !hf.HeadersEnded() { 1974 t.Fatal("want END_HEADERS flag") 1975 } 1976 // Close the connection and wait for the handler to (hopefully) notice. 1977 st.cc.Close() 1978 select { 1979 case <-errc: 1980 case <-time.After(5 * time.Second): 1981 t.Error("timeout") 1982 } 1983 }) 1984 } 1985 1986 func TestServer_Rejects_Too_Many_Streams(t *testing.T) { 1987 const testPath = "/some/path" 1988 1989 inHandler := make(chan uint32) 1990 leaveHandler := make(chan bool) 1991 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 1992 id := w.(*responseWriter).rws.stream.id 1993 inHandler <- id 1994 if id == 1+(defaultMaxStreams+1)*2 && r.URL.Path != testPath { 1995 t.Errorf("decoded final path as %q; want %q", r.URL.Path, testPath) 1996 } 1997 <-leaveHandler 1998 }) 1999 defer st.Close() 2000 st.greet() 2001 nextStreamID := uint32(1) 2002 streamID := func() uint32 { 2003 defer func() { nextStreamID += 2 }() 2004 return nextStreamID 2005 } 2006 sendReq := func(id uint32, headers ...string) { 2007 st.writeHeaders(HeadersFrameParam{ 2008 StreamID: id, 2009 BlockFragment: st.encodeHeader(headers...), 2010 EndStream: true, 2011 EndHeaders: true, 2012 }) 2013 } 2014 for i := 0; i < defaultMaxStreams; i++ { 2015 sendReq(streamID()) 2016 <-inHandler 2017 } 2018 defer func() { 2019 for i := 0; i < defaultMaxStreams; i++ { 2020 leaveHandler <- true 2021 } 2022 }() 2023 2024 // And this one should cross the limit: 2025 // (It's also sent as a CONTINUATION, to verify we still track the decoder context, 2026 // even if we're rejecting it) 2027 rejectID := streamID() 2028 headerBlock := st.encodeHeader(":path", testPath) 2029 frag1, frag2 := headerBlock[:3], headerBlock[3:] 2030 st.writeHeaders(HeadersFrameParam{ 2031 StreamID: rejectID, 2032 BlockFragment: frag1, 2033 EndStream: true, 2034 EndHeaders: false, // CONTINUATION coming 2035 }) 2036 if err := st.fr.WriteContinuation(rejectID, true, frag2); err != nil { 2037 t.Fatal(err) 2038 } 2039 st.wantRSTStream(rejectID, ErrCodeProtocol) 2040 2041 // But let a handler finish: 2042 leaveHandler <- true 2043 st.wantHeaders() 2044 2045 // And now another stream should be able to start: 2046 goodID := streamID() 2047 sendReq(goodID, ":path", testPath) 2048 select { 2049 case got := <-inHandler: 2050 if got != goodID { 2051 t.Errorf("Got stream %d; want %d", got, goodID) 2052 } 2053 case <-time.After(3 * time.Second): 2054 t.Error("timeout waiting for handler") 2055 } 2056 } 2057 2058 // So many response headers that the server needs to use CONTINUATION frames: 2059 func TestServer_Response_ManyHeaders_With_Continuation(t *testing.T) { 2060 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 2061 h := w.Header() 2062 for i := 0; i < 5000; i++ { 2063 h.Set(fmt.Sprintf("x-header-%d", i), fmt.Sprintf("x-value-%d", i)) 2064 } 2065 return nil 2066 }, func(st *serverTester) { 2067 getSlash(st) 2068 hf := st.wantHeaders() 2069 if hf.HeadersEnded() { 2070 t.Fatal("got unwanted END_HEADERS flag") 2071 } 2072 n := 0 2073 for { 2074 n++ 2075 cf := st.wantContinuation() 2076 if cf.HeadersEnded() { 2077 break 2078 } 2079 } 2080 if n < 5 { 2081 t.Errorf("Only got %d CONTINUATION frames; expected 5+ (currently 6)", n) 2082 } 2083 }) 2084 } 2085 2086 // This previously crashed (reported by Mathieu Lonjaret as observed 2087 // while using Camlistore) because we got a DATA frame from the client 2088 // after the handler exited and our logic at the time was wrong, 2089 // keeping a stream in the map in stateClosed, which tickled an 2090 // invariant check later when we tried to remove that stream (via 2091 // defer sc.closeAllStreamsOnConnClose) when the serverConn serve loop 2092 // ended. 2093 func TestServer_NoCrash_HandlerClose_Then_ClientClose(t *testing.T) { 2094 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 2095 // nothing 2096 return nil 2097 }, func(st *serverTester) { 2098 st.writeHeaders(HeadersFrameParam{ 2099 StreamID: 1, 2100 BlockFragment: st.encodeHeader(), 2101 EndStream: false, // DATA is coming 2102 EndHeaders: true, 2103 }) 2104 hf := st.wantHeaders() 2105 if !hf.HeadersEnded() || !hf.StreamEnded() { 2106 t.Fatalf("want END_HEADERS+END_STREAM, got %v", hf) 2107 } 2108 2109 // Sent when the a Handler closes while a client has 2110 // indicated it's still sending DATA: 2111 st.wantRSTStream(1, ErrCodeCancel) 2112 2113 // Now the handler has ended, so it's ended its 2114 // stream, but the client hasn't closed its side 2115 // (stateClosedLocal). So send more data and verify 2116 // it doesn't crash with an internal invariant panic, like 2117 // it did before. 2118 st.writeData(1, true, []byte("foo")) 2119 2120 // Sent after a peer sends data anyway (admittedly the 2121 // previous RST_STREAM might've still been in-flight), 2122 // but they'll get the more friendly 'cancel' code 2123 // first. 2124 st.wantRSTStream(1, ErrCodeStreamClosed) 2125 2126 // Set up a bunch of machinery to record the panic we saw 2127 // previously. 2128 var ( 2129 panMu sync.Mutex 2130 panicVal interface{} 2131 ) 2132 2133 testHookOnPanicMu.Lock() 2134 testHookOnPanic = func(sc *serverConn, pv interface{}) bool { 2135 panMu.Lock() 2136 panicVal = pv 2137 panMu.Unlock() 2138 return true 2139 } 2140 testHookOnPanicMu.Unlock() 2141 2142 // Now force the serve loop to end, via closing the connection. 2143 st.cc.Close() 2144 select { 2145 case <-st.sc.doneServing: 2146 // Loop has exited. 2147 panMu.Lock() 2148 got := panicVal 2149 panMu.Unlock() 2150 if got != nil { 2151 t.Errorf("Got panic: %v", got) 2152 } 2153 case <-time.After(5 * time.Second): 2154 t.Error("timeout") 2155 } 2156 }) 2157 } 2158 2159 func TestServer_Rejects_TLS10(t *testing.T) { testRejectTLS(t, tls.VersionTLS10) } 2160 func TestServer_Rejects_TLS11(t *testing.T) { testRejectTLS(t, tls.VersionTLS11) } 2161 2162 func testRejectTLS(t *testing.T, max uint16) { 2163 st := newServerTester(t, nil, func(c *tls.Config) { 2164 c.MaxVersion = max 2165 }) 2166 defer st.Close() 2167 gf := st.wantGoAway() 2168 if got, want := gf.ErrCode, ErrCodeInadequateSecurity; got != want { 2169 t.Errorf("Got error code %v; want %v", got, want) 2170 } 2171 } 2172 2173 func TestServer_Rejects_TLSBadCipher(t *testing.T) { 2174 st := newServerTester(t, nil, func(c *tls.Config) { 2175 // Only list bad ones: 2176 c.CipherSuites = []uint16{ 2177 tls.TLS_RSA_WITH_RC4_128_SHA, 2178 tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA, 2179 tls.TLS_RSA_WITH_AES_128_CBC_SHA, 2180 tls.TLS_RSA_WITH_AES_256_CBC_SHA, 2181 tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, 2182 tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, 2183 tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, 2184 tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA, 2185 tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, 2186 tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, 2187 tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, 2188 } 2189 }) 2190 defer st.Close() 2191 gf := st.wantGoAway() 2192 if got, want := gf.ErrCode, ErrCodeInadequateSecurity; got != want { 2193 t.Errorf("Got error code %v; want %v", got, want) 2194 } 2195 } 2196 2197 func TestServer_Advertises_Common_Cipher(t *testing.T) { 2198 const requiredSuite = tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 2199 st := newServerTester(t, nil, func(c *tls.Config) { 2200 // Have the client only support the one required by the spec. 2201 c.CipherSuites = []uint16{requiredSuite} 2202 }, func(ts *httptest.Server) { 2203 var srv *http.Server = ts.Config 2204 // Have the server configured with no specific cipher suites. 2205 // This tests that Go's defaults include the required one. 2206 srv.TLSConfig = nil 2207 }) 2208 defer st.Close() 2209 st.greet() 2210 } 2211 2212 func (st *serverTester) onHeaderField(f hpack.HeaderField) { 2213 if f.Name == "date" { 2214 return 2215 } 2216 st.decodedHeaders = append(st.decodedHeaders, [2]string{f.Name, f.Value}) 2217 } 2218 2219 func (st *serverTester) decodeHeader(headerBlock []byte) (pairs [][2]string) { 2220 st.decodedHeaders = nil 2221 if _, err := st.hpackDec.Write(headerBlock); err != nil { 2222 st.t.Fatalf("hpack decoding error: %v", err) 2223 } 2224 if err := st.hpackDec.Close(); err != nil { 2225 st.t.Fatalf("hpack decoding error: %v", err) 2226 } 2227 return st.decodedHeaders 2228 } 2229 2230 // testServerResponse sets up an idle HTTP/2 connection and lets you 2231 // write a single request with writeReq, and then reply to it in some way with the provided handler, 2232 // and then verify the output with the serverTester again (assuming the handler returns nil) 2233 func testServerResponse(t testing.TB, 2234 handler func(http.ResponseWriter, *http.Request) error, 2235 client func(*serverTester), 2236 ) { 2237 errc := make(chan error, 1) 2238 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 2239 if r.Body == nil { 2240 t.Fatal("nil Body") 2241 } 2242 errc <- handler(w, r) 2243 }) 2244 defer st.Close() 2245 2246 donec := make(chan bool) 2247 go func() { 2248 defer close(donec) 2249 st.greet() 2250 client(st) 2251 }() 2252 2253 select { 2254 case <-donec: 2255 return 2256 case <-time.After(5 * time.Second): 2257 t.Fatal("timeout") 2258 } 2259 2260 select { 2261 case err := <-errc: 2262 if err != nil { 2263 t.Fatalf("Error in handler: %v", err) 2264 } 2265 case <-time.After(2 * time.Second): 2266 t.Error("timeout waiting for handler to finish") 2267 } 2268 } 2269 2270 // readBodyHandler returns an http Handler func that reads len(want) 2271 // bytes from r.Body and fails t if the contents read were not 2272 // the value of want. 2273 func readBodyHandler(t *testing.T, want string) func(w http.ResponseWriter, r *http.Request) { 2274 return func(w http.ResponseWriter, r *http.Request) { 2275 buf := make([]byte, len(want)) 2276 _, err := io.ReadFull(r.Body, buf) 2277 if err != nil { 2278 t.Error(err) 2279 return 2280 } 2281 if string(buf) != want { 2282 t.Errorf("read %q; want %q", buf, want) 2283 } 2284 } 2285 } 2286 2287 // TestServerWithCurl currently fails, hence the LenientCipherSuites test. See: 2288 // https://github.com/tatsuhiro-t/nghttp2/issues/140 & 2289 // http://sourceforge.net/p/curl/bugs/1472/ 2290 func TestServerWithCurl(t *testing.T) { testServerWithCurl(t, false) } 2291 func TestServerWithCurl_LenientCipherSuites(t *testing.T) { testServerWithCurl(t, true) } 2292 2293 func testServerWithCurl(t *testing.T, permitProhibitedCipherSuites bool) { 2294 if runtime.GOOS != "linux" { 2295 t.Skip("skipping Docker test when not on Linux; requires --net which won't work with boot2docker anyway") 2296 } 2297 if testing.Short() { 2298 t.Skip("skipping curl test in short mode") 2299 } 2300 requireCurl(t) 2301 var gotConn int32 2302 testHookOnConn = func() { atomic.StoreInt32(&gotConn, 1) } 2303 2304 const msg = "Hello from curl!\n" 2305 ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 2306 w.Header().Set("Foo", "Bar") 2307 w.Header().Set("Client-Proto", r.Proto) 2308 io.WriteString(w, msg) 2309 })) 2310 ConfigureServer(ts.Config, &Server{ 2311 PermitProhibitedCipherSuites: permitProhibitedCipherSuites, 2312 }) 2313 ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config 2314 ts.StartTLS() 2315 defer ts.Close() 2316 2317 t.Logf("Running test server for curl to hit at: %s", ts.URL) 2318 container := curl(t, "--silent", "--http2", "--insecure", "-v", ts.URL) 2319 defer kill(container) 2320 resc := make(chan interface{}, 1) 2321 go func() { 2322 res, err := dockerLogs(container) 2323 if err != nil { 2324 resc <- err 2325 } else { 2326 resc <- res 2327 } 2328 }() 2329 select { 2330 case res := <-resc: 2331 if err, ok := res.(error); ok { 2332 t.Fatal(err) 2333 } 2334 body := string(res.([]byte)) 2335 // Search for both "key: value" and "key:value", since curl changed their format 2336 // Our Dockerfile contains the latest version (no space), but just in case people 2337 // didn't rebuild, check both. 2338 if !strings.Contains(body, "foo: Bar") && !strings.Contains(body, "foo:Bar") { 2339 t.Errorf("didn't see foo: Bar header") 2340 t.Logf("Got: %s", body) 2341 } 2342 if !strings.Contains(body, "client-proto: HTTP/2") && !strings.Contains(body, "client-proto:HTTP/2") { 2343 t.Errorf("didn't see client-proto: HTTP/2 header") 2344 t.Logf("Got: %s", res) 2345 } 2346 if !strings.Contains(string(res.([]byte)), msg) { 2347 t.Errorf("didn't see %q content", msg) 2348 t.Logf("Got: %s", res) 2349 } 2350 case <-time.After(3 * time.Second): 2351 t.Errorf("timeout waiting for curl") 2352 } 2353 2354 if atomic.LoadInt32(&gotConn) == 0 { 2355 t.Error("never saw an http2 connection") 2356 } 2357 } 2358 2359 var doh2load = flag.Bool("h2load", false, "Run h2load test") 2360 2361 func TestServerWithH2Load(t *testing.T) { 2362 if !*doh2load { 2363 t.Skip("Skipping without --h2load flag.") 2364 } 2365 if runtime.GOOS != "linux" { 2366 t.Skip("skipping Docker test when not on Linux; requires --net which won't work with boot2docker anyway") 2367 } 2368 requireH2load(t) 2369 2370 msg := strings.Repeat("Hello, h2load!\n", 5000) 2371 ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 2372 io.WriteString(w, msg) 2373 w.(http.Flusher).Flush() 2374 io.WriteString(w, msg) 2375 })) 2376 ts.StartTLS() 2377 defer ts.Close() 2378 2379 cmd := exec.Command("docker", "run", "--net=host", "--entrypoint=/usr/local/bin/h2load", "gohttp2/curl", 2380 "-n100000", "-c100", "-m100", ts.URL) 2381 cmd.Stdout = os.Stdout 2382 cmd.Stderr = os.Stderr 2383 if err := cmd.Run(); err != nil { 2384 t.Fatal(err) 2385 } 2386 } 2387 2388 // Issue 12843 2389 func TestServerDoS_MaxHeaderListSize(t *testing.T) { 2390 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}) 2391 defer st.Close() 2392 2393 // shake hands 2394 st.writePreface() 2395 st.writeInitialSettings() 2396 frameSize := defaultMaxReadFrameSize 2397 var advHeaderListSize *uint32 2398 st.wantSettings().ForeachSetting(func(s Setting) error { 2399 switch s.ID { 2400 case SettingMaxFrameSize: 2401 if s.Val < minMaxFrameSize { 2402 frameSize = minMaxFrameSize 2403 } else if s.Val > maxFrameSize { 2404 frameSize = maxFrameSize 2405 } else { 2406 frameSize = int(s.Val) 2407 } 2408 case SettingMaxHeaderListSize: 2409 advHeaderListSize = &s.Val 2410 } 2411 return nil 2412 }) 2413 st.writeSettingsAck() 2414 st.wantSettingsAck() 2415 2416 if advHeaderListSize == nil { 2417 t.Errorf("server didn't advertise a max header list size") 2418 } else if *advHeaderListSize == 0 { 2419 t.Errorf("server advertised a max header list size of 0") 2420 } 2421 2422 st.encodeHeaderField(":method", "GET") 2423 st.encodeHeaderField(":path", "/") 2424 st.encodeHeaderField(":scheme", "https") 2425 cookie := strings.Repeat("*", 4058) 2426 st.encodeHeaderField("cookie", cookie) 2427 st.writeHeaders(HeadersFrameParam{ 2428 StreamID: 1, 2429 BlockFragment: st.headerBuf.Bytes(), 2430 EndStream: true, 2431 EndHeaders: false, 2432 }) 2433 2434 // Capture the short encoding of a duplicate ~4K cookie, now 2435 // that we've already sent it once. 2436 st.headerBuf.Reset() 2437 st.encodeHeaderField("cookie", cookie) 2438 2439 // Now send 1MB of it. 2440 const size = 1 << 20 2441 b := bytes.Repeat(st.headerBuf.Bytes(), size/st.headerBuf.Len()) 2442 for len(b) > 0 { 2443 chunk := b 2444 if len(chunk) > frameSize { 2445 chunk = chunk[:frameSize] 2446 } 2447 b = b[len(chunk):] 2448 st.fr.WriteContinuation(1, len(b) == 0, chunk) 2449 } 2450 2451 h := st.wantHeaders() 2452 if !h.HeadersEnded() { 2453 t.Fatalf("Got HEADERS without END_HEADERS set: %v", h) 2454 } 2455 headers := st.decodeHeader(h.HeaderBlockFragment()) 2456 want := [][2]string{ 2457 {":status", "431"}, 2458 {"content-type", "text/html; charset=utf-8"}, 2459 {"content-length", "63"}, 2460 } 2461 if !reflect.DeepEqual(headers, want) { 2462 t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) 2463 } 2464 } 2465 2466 func TestCompressionErrorOnWrite(t *testing.T) { 2467 const maxStrLen = 8 << 10 2468 var serverConfig *http.Server 2469 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 2470 // No response body. 2471 }, func(ts *httptest.Server) { 2472 serverConfig = ts.Config 2473 serverConfig.MaxHeaderBytes = maxStrLen 2474 }) 2475 defer st.Close() 2476 st.greet() 2477 2478 maxAllowed := st.sc.maxHeaderStringLen() 2479 2480 // Crank this up, now that we have a conn connected with the 2481 // hpack.Decoder's max string length set has been initialized 2482 // from the earlier low ~8K value. We want this higher so don't 2483 // hit the max header list size. We only want to test hitting 2484 // the max string size. 2485 serverConfig.MaxHeaderBytes = 1 << 20 2486 2487 // First a request with a header that's exactly the max allowed size. 2488 hbf := st.encodeHeader("foo", strings.Repeat("a", maxAllowed)) 2489 st.writeHeaders(HeadersFrameParam{ 2490 StreamID: 1, 2491 BlockFragment: hbf, 2492 EndStream: true, 2493 EndHeaders: true, 2494 }) 2495 h := st.wantHeaders() 2496 if !h.HeadersEnded() || !h.StreamEnded() { 2497 t.Errorf("Unexpected HEADER frame %v", h) 2498 } 2499 2500 // And now send one that's just one byte too big. 2501 hbf = st.encodeHeader("bar", strings.Repeat("b", maxAllowed+1)) 2502 st.writeHeaders(HeadersFrameParam{ 2503 StreamID: 3, 2504 BlockFragment: hbf, 2505 EndStream: true, 2506 EndHeaders: true, 2507 }) 2508 ga := st.wantGoAway() 2509 if ga.ErrCode != ErrCodeCompression { 2510 t.Errorf("GOAWAY err = %v; want ErrCodeCompression", ga.ErrCode) 2511 } 2512 } 2513 2514 func TestCompressionErrorOnClose(t *testing.T) { 2515 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 2516 // No response body. 2517 }) 2518 defer st.Close() 2519 st.greet() 2520 2521 hbf := st.encodeHeader("foo", "bar") 2522 hbf = hbf[:len(hbf)-1] // truncate one byte from the end, so hpack.Decoder.Close fails. 2523 st.writeHeaders(HeadersFrameParam{ 2524 StreamID: 1, 2525 BlockFragment: hbf, 2526 EndStream: true, 2527 EndHeaders: true, 2528 }) 2529 ga := st.wantGoAway() 2530 if ga.ErrCode != ErrCodeCompression { 2531 t.Errorf("GOAWAY err = %v; want ErrCodeCompression", ga.ErrCode) 2532 } 2533 } 2534 2535 // test that a server handler can read trailers from a client 2536 func TestServerReadsTrailers(t *testing.T) { 2537 const testBody = "some test body" 2538 writeReq := func(st *serverTester) { 2539 st.writeHeaders(HeadersFrameParam{ 2540 StreamID: 1, // clients send odd numbers 2541 BlockFragment: st.encodeHeader("trailer", "Foo, Bar", "trailer", "Baz"), 2542 EndStream: false, 2543 EndHeaders: true, 2544 }) 2545 st.writeData(1, false, []byte(testBody)) 2546 st.writeHeaders(HeadersFrameParam{ 2547 StreamID: 1, // clients send odd numbers 2548 BlockFragment: st.encodeHeaderRaw( 2549 "foo", "foov", 2550 "bar", "barv", 2551 "baz", "bazv", 2552 "surprise", "wasn't declared; shouldn't show up", 2553 ), 2554 EndStream: true, 2555 EndHeaders: true, 2556 }) 2557 } 2558 checkReq := func(r *http.Request) { 2559 wantTrailer := http.Header{ 2560 "Foo": nil, 2561 "Bar": nil, 2562 "Baz": nil, 2563 } 2564 if !reflect.DeepEqual(r.Trailer, wantTrailer) { 2565 t.Errorf("initial Trailer = %v; want %v", r.Trailer, wantTrailer) 2566 } 2567 slurp, err := ioutil.ReadAll(r.Body) 2568 if string(slurp) != testBody { 2569 t.Errorf("read body %q; want %q", slurp, testBody) 2570 } 2571 if err != nil { 2572 t.Fatalf("Body slurp: %v", err) 2573 } 2574 wantTrailerAfter := http.Header{ 2575 "Foo": {"foov"}, 2576 "Bar": {"barv"}, 2577 "Baz": {"bazv"}, 2578 } 2579 if !reflect.DeepEqual(r.Trailer, wantTrailerAfter) { 2580 t.Errorf("final Trailer = %v; want %v", r.Trailer, wantTrailerAfter) 2581 } 2582 } 2583 testServerRequest(t, writeReq, checkReq) 2584 } 2585 2586 // test that a server handler can send trailers 2587 func TestServerWritesTrailers_WithFlush(t *testing.T) { testServerWritesTrailers(t, true) } 2588 func TestServerWritesTrailers_WithoutFlush(t *testing.T) { testServerWritesTrailers(t, false) } 2589 2590 func testServerWritesTrailers(t *testing.T, withFlush bool) { 2591 // See https://httpwg.github.io/specs/rfc7540.html#rfc.section.8.1.3 2592 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { 2593 w.Header().Set("Trailer", "Server-Trailer-A, Server-Trailer-B") 2594 w.Header().Add("Trailer", "Server-Trailer-C") 2595 2596 // TODO: decide if the server should filter these while 2597 // writing the Trailer header in the response. Currently it 2598 // appears net/http doesn't do this for http/1.1 2599 w.Header().Add("Trailer", "Transfer-Encoding, Content-Length, Trailer") // filtered 2600 w.Header().Set("Foo", "Bar") 2601 w.Header().Set("Content-Length", "5") 2602 2603 io.WriteString(w, "Hello") 2604 if withFlush { 2605 w.(http.Flusher).Flush() 2606 } 2607 w.Header().Set("Server-Trailer-A", "valuea") 2608 w.Header().Set("Server-Trailer-C", "valuec") // skipping B 2609 w.Header().Set("Server-Surpise", "surprise! this isn't predeclared!") 2610 w.Header().Set("Transfer-Encoding", "should not be included; Forbidden by RFC 2616 14.40") 2611 w.Header().Set("Content-Length", "should not be included; Forbidden by RFC 2616 14.40") 2612 w.Header().Set("Trailer", "should not be included; Forbidden by RFC 2616 14.40") 2613 return nil 2614 }, func(st *serverTester) { 2615 getSlash(st) 2616 hf := st.wantHeaders() 2617 if hf.StreamEnded() { 2618 t.Fatal("response HEADERS had END_STREAM") 2619 } 2620 if !hf.HeadersEnded() { 2621 t.Fatal("response HEADERS didn't have END_HEADERS") 2622 } 2623 goth := st.decodeHeader(hf.HeaderBlockFragment()) 2624 wanth := [][2]string{ 2625 {":status", "200"}, 2626 {"foo", "Bar"}, 2627 {"trailer", "Server-Trailer-A, Server-Trailer-B"}, 2628 {"trailer", "Server-Trailer-C"}, 2629 {"trailer", "Transfer-Encoding, Content-Length, Trailer"}, 2630 {"content-type", "text/plain; charset=utf-8"}, 2631 {"content-length", "5"}, 2632 } 2633 if !reflect.DeepEqual(goth, wanth) { 2634 t.Errorf("Header mismatch.\n got: %v\nwant: %v", goth, wanth) 2635 } 2636 df := st.wantData() 2637 if string(df.Data()) != "Hello" { 2638 t.Fatalf("Client read %q; want Hello", df.Data()) 2639 } 2640 if df.StreamEnded() { 2641 t.Fatalf("data frame had STREAM_ENDED") 2642 } 2643 tf := st.wantHeaders() // for the trailers 2644 if !tf.StreamEnded() { 2645 t.Fatalf("trailers HEADERS lacked END_STREAM") 2646 } 2647 if !tf.HeadersEnded() { 2648 t.Fatalf("trailers HEADERS lacked END_HEADERS") 2649 } 2650 wanth = [][2]string{ 2651 {"server-trailer-a", "valuea"}, 2652 {"server-trailer-c", "valuec"}, 2653 } 2654 goth = st.decodeHeader(tf.HeaderBlockFragment()) 2655 if !reflect.DeepEqual(goth, wanth) { 2656 t.Errorf("Header mismatch.\n got: %v\nwant: %v", goth, wanth) 2657 } 2658 }) 2659 } 2660 2661 func BenchmarkServerGets(b *testing.B) { 2662 b.ReportAllocs() 2663 2664 const msg = "Hello, world" 2665 st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { 2666 io.WriteString(w, msg) 2667 }) 2668 defer st.Close() 2669 st.greet() 2670 2671 // Give the server quota to reply. (plus it has the the 64KB) 2672 if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil { 2673 b.Fatal(err) 2674 } 2675 2676 for i := 0; i < b.N; i++ { 2677 id := 1 + uint32(i)*2 2678 st.writeHeaders(HeadersFrameParam{ 2679 StreamID: id, 2680 BlockFragment: st.encodeHeader(), 2681 EndStream: true, 2682 EndHeaders: true, 2683 }) 2684 st.wantHeaders() 2685 df := st.wantData() 2686 if !df.StreamEnded() { 2687 b.Fatalf("DATA didn't have END_STREAM; got %v", df) 2688 } 2689 } 2690 } 2691 2692 func BenchmarkServerPosts(b *testing.B) { 2693 b.ReportAllocs() 2694 2695 const msg = "Hello, world" 2696 st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { 2697 io.WriteString(w, msg) 2698 }) 2699 defer st.Close() 2700 st.greet() 2701 2702 // Give the server quota to reply. (plus it has the the 64KB) 2703 if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil { 2704 b.Fatal(err) 2705 } 2706 2707 for i := 0; i < b.N; i++ { 2708 id := 1 + uint32(i)*2 2709 st.writeHeaders(HeadersFrameParam{ 2710 StreamID: id, 2711 BlockFragment: st.encodeHeader(":method", "POST"), 2712 EndStream: false, 2713 EndHeaders: true, 2714 }) 2715 st.writeData(id, true, nil) 2716 st.wantHeaders() 2717 df := st.wantData() 2718 if !df.StreamEnded() { 2719 b.Fatalf("DATA didn't have END_STREAM; got %v", df) 2720 } 2721 } 2722 } 2723 2724 // go-fuzz bug, originally reported at https://github.com/bradfitz/http2/issues/53 2725 // Verify we don't hang. 2726 func TestIssue53(t *testing.T) { 2727 const data = "PRI * HTTP/2.0\r\n\r\nSM" + 2728 "\r\n\r\n\x00\x00\x00\x01\ainfinfin\ad" 2729 s := &http.Server{ 2730 ErrorLog: log.New(io.MultiWriter(stderrv(), twriter{t: t}), "", log.LstdFlags), 2731 } 2732 s2 := &Server{MaxReadFrameSize: 1 << 16, PermitProhibitedCipherSuites: true} 2733 c := &issue53Conn{[]byte(data), false, false} 2734 s2.handleConn(s, c, http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { 2735 w.Write([]byte("hello")) 2736 })) 2737 if !c.closed { 2738 t.Fatal("connection is not closed") 2739 } 2740 } 2741 2742 type issue53Conn struct { 2743 data []byte 2744 closed bool 2745 written bool 2746 } 2747 2748 func (c *issue53Conn) Read(b []byte) (n int, err error) { 2749 if len(c.data) == 0 { 2750 return 0, io.EOF 2751 } 2752 n = copy(b, c.data) 2753 c.data = c.data[n:] 2754 return 2755 } 2756 2757 func (c *issue53Conn) Write(b []byte) (n int, err error) { 2758 c.written = true 2759 return len(b), nil 2760 } 2761 2762 func (c *issue53Conn) Close() error { 2763 c.closed = true 2764 return nil 2765 } 2766 2767 func (c *issue53Conn) LocalAddr() net.Addr { return &net.TCPAddr{net.IP{127, 0, 0, 1}, 49706, ""} } 2768 func (c *issue53Conn) RemoteAddr() net.Addr { return &net.TCPAddr{net.IP{127, 0, 0, 1}, 49706, ""} } 2769 func (c *issue53Conn) SetDeadline(t time.Time) error { return nil } 2770 func (c *issue53Conn) SetReadDeadline(t time.Time) error { return nil } 2771 func (c *issue53Conn) SetWriteDeadline(t time.Time) error { return nil } 2772 2773 // golang.org/issue/12895 2774 func TestConfigureServer(t *testing.T) { 2775 tests := []struct { 2776 name string 2777 in http.Server 2778 wantErr string 2779 }{ 2780 { 2781 name: "empty server", 2782 in: http.Server{}, 2783 }, 2784 { 2785 name: "just the required cipher suite", 2786 in: http.Server{ 2787 TLSConfig: &tls.Config{ 2788 CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}, 2789 }, 2790 }, 2791 }, 2792 { 2793 name: "missing required cipher suite", 2794 in: http.Server{ 2795 TLSConfig: &tls.Config{ 2796 CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384}, 2797 }, 2798 }, 2799 wantErr: "is missing HTTP/2-required TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", 2800 }, 2801 { 2802 name: "required after bad", 2803 in: http.Server{ 2804 TLSConfig: &tls.Config{ 2805 CipherSuites: []uint16{tls.TLS_RSA_WITH_RC4_128_SHA, tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}, 2806 }, 2807 }, 2808 wantErr: "contains an HTTP/2-approved cipher suite (0xc02f), but it comes after", 2809 }, 2810 { 2811 name: "bad after required", 2812 in: http.Server{ 2813 TLSConfig: &tls.Config{ 2814 CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, tls.TLS_RSA_WITH_RC4_128_SHA}, 2815 }, 2816 }, 2817 }, 2818 } 2819 for _, tt := range tests { 2820 err := ConfigureServer(&tt.in, nil) 2821 if (err != nil) != (tt.wantErr != "") { 2822 if tt.wantErr != "" { 2823 t.Errorf("%s: success, but want error", tt.name) 2824 } else { 2825 t.Errorf("%s: unexpected error: %v", tt.name, err) 2826 } 2827 } 2828 if err != nil && tt.wantErr != "" && !strings.Contains(err.Error(), tt.wantErr) { 2829 t.Errorf("%s: err = %v; want substring %q", tt.name, err, tt.wantErr) 2830 } 2831 if err == nil && !tt.in.TLSConfig.PreferServerCipherSuites { 2832 t.Errorf("%s: PreferServerCipherSuite is false; want true", tt.name) 2833 } 2834 } 2835 } 2836 2837 func TestServerRejectHeadWithBody(t *testing.T) { 2838 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 2839 // No response body. 2840 }) 2841 defer st.Close() 2842 st.greet() 2843 st.writeHeaders(HeadersFrameParam{ 2844 StreamID: 1, // clients send odd numbers 2845 BlockFragment: st.encodeHeader(":method", "HEAD"), 2846 EndStream: false, // what we're testing, a bogus HEAD request with body 2847 EndHeaders: true, 2848 }) 2849 st.wantRSTStream(1, ErrCodeProtocol) 2850 } 2851 2852 func TestServerNoAutoContentLengthOnHead(t *testing.T) { 2853 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 2854 // No response body. (or smaller than one frame) 2855 }) 2856 defer st.Close() 2857 st.greet() 2858 st.writeHeaders(HeadersFrameParam{ 2859 StreamID: 1, // clients send odd numbers 2860 BlockFragment: st.encodeHeader(":method", "HEAD"), 2861 EndStream: true, 2862 EndHeaders: true, 2863 }) 2864 h := st.wantHeaders() 2865 headers := st.decodeHeader(h.HeaderBlockFragment()) 2866 want := [][2]string{ 2867 {":status", "200"}, 2868 {"content-type", "text/plain; charset=utf-8"}, 2869 } 2870 if !reflect.DeepEqual(headers, want) { 2871 t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) 2872 } 2873 } 2874 2875 // golang.org/issue/13495 2876 func TestServerNoDuplicateContentType(t *testing.T) { 2877 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { 2878 w.Header()["Content-Type"] = []string{""} 2879 fmt.Fprintf(w, "<html><head></head><body>hi</body></html>") 2880 }) 2881 defer st.Close() 2882 st.greet() 2883 st.writeHeaders(HeadersFrameParam{ 2884 StreamID: 1, 2885 BlockFragment: st.encodeHeader(), 2886 EndStream: true, 2887 EndHeaders: true, 2888 }) 2889 h := st.wantHeaders() 2890 headers := st.decodeHeader(h.HeaderBlockFragment()) 2891 want := [][2]string{ 2892 {":status", "200"}, 2893 {"content-type", ""}, 2894 {"content-length", "41"}, 2895 } 2896 if !reflect.DeepEqual(headers, want) { 2897 t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) 2898 } 2899 }