1
2
3
4
5 package http2_test
6
7 import (
8 "bytes"
9 "compress/gzip"
10 "compress/zlib"
11 "context"
12 "crypto/tls"
13 "crypto/x509"
14 "errors"
15 "flag"
16 "fmt"
17 "io"
18 "log"
19 "math"
20 "net"
21 "net/http"
22 "net/http/httptest"
23 "os"
24 "reflect"
25 "runtime"
26 "slices"
27 "strconv"
28 "strings"
29 "sync"
30 "testing"
31 "testing/synctest"
32 "time"
33 _ "unsafe"
34
35 "net/http/internal/http2"
36 . "net/http/internal/http2"
37 "net/http/internal/testcert"
38
39 "golang.org/x/net/http2/hpack"
40 )
41
42 var stderrVerbose = flag.Bool("stderr_verbose", false, "Mirror verbosity to stderr, unbuffered")
43
44 func stderrv() io.Writer {
45 if *stderrVerbose {
46 return os.Stderr
47 }
48
49 return io.Discard
50 }
51
52 type safeBuffer struct {
53 b bytes.Buffer
54 m sync.Mutex
55 }
56
57 func (sb *safeBuffer) Write(d []byte) (int, error) {
58 sb.m.Lock()
59 defer sb.m.Unlock()
60 return sb.b.Write(d)
61 }
62
63 func (sb *safeBuffer) Bytes() []byte {
64 sb.m.Lock()
65 defer sb.m.Unlock()
66 return sb.b.Bytes()
67 }
68
69 func (sb *safeBuffer) Len() int {
70 sb.m.Lock()
71 defer sb.m.Unlock()
72 return sb.b.Len()
73 }
74
75 type serverTester struct {
76 cc net.Conn
77 t testing.TB
78 h1server *http.Server
79 h2server *Server
80 serverLogBuf safeBuffer
81 logFilter []string
82 scMu sync.Mutex
83 sc *ServerConn
84 wrotePreface bool
85 testConnFramer
86
87 callsMu sync.Mutex
88 calls []*serverHandlerCall
89
90
91
92
93
94 frameReadLogMu sync.Mutex
95 frameReadLogBuf bytes.Buffer
96 frameWriteLogMu sync.Mutex
97 frameWriteLogBuf bytes.Buffer
98
99
100 headerBuf bytes.Buffer
101 hpackEnc *hpack.Encoder
102 }
103
104 type twriter struct {
105 t testing.TB
106 st *serverTester
107 }
108
109 func (w twriter) Write(p []byte) (n int, err error) {
110 if w.st != nil {
111 ps := string(p)
112 for _, phrase := range w.st.logFilter {
113 if strings.Contains(ps, phrase) {
114 return len(p), nil
115 }
116 }
117 }
118 w.t.Logf("%s", p)
119 return len(p), nil
120 }
121
122 func newTestServer(t testing.TB, handler http.HandlerFunc, opts ...interface{}) *httptest.Server {
123 t.Helper()
124 if handler == nil {
125 handler = func(w http.ResponseWriter, req *http.Request) {}
126 }
127 ts := httptest.NewUnstartedServer(handler)
128 ts.EnableHTTP2 = true
129 ts.Config.ErrorLog = log.New(twriter{t: t}, "", log.LstdFlags)
130 ts.Config.Protocols = protocols("h2")
131 for _, opt := range opts {
132 switch v := opt.(type) {
133 case func(*httptest.Server):
134 v(ts)
135 case func(*http.Server):
136 v(ts.Config)
137 case func(*http.HTTP2Config):
138 if ts.Config.HTTP2 == nil {
139 ts.Config.HTTP2 = &http.HTTP2Config{}
140 }
141 v(ts.Config.HTTP2)
142 default:
143 t.Fatalf("unknown newTestServer option type %T", v)
144 }
145 }
146
147 if ts.Config.Protocols.HTTP2() {
148 ts.TLS = testServerTLSConfig
149 if ts.Config.TLSConfig != nil {
150 ts.TLS = ts.Config.TLSConfig
151 }
152 ts.StartTLS()
153 } else if ts.Config.Protocols.UnencryptedHTTP2() {
154 ts.EnableHTTP2 = false
155 ts.Start()
156 } else {
157 t.Fatalf("Protocols contains neither HTTP2 nor UnencryptedHTTP2")
158 }
159
160 t.Cleanup(func() {
161 ts.CloseClientConnections()
162 ts.Close()
163 })
164
165 return ts
166 }
167
168 type serverTesterOpt string
169
170 var optFramerReuseFrames = serverTesterOpt("frame_reuse_frames")
171
172 var optQuiet = func(server *http.Server) {
173 server.ErrorLog = log.New(io.Discard, "", 0)
174 }
175
176 func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{}) *serverTester {
177 t.Helper()
178
179 h1server := &http.Server{}
180 var tlsState *tls.ConnectionState
181 for _, opt := range opts {
182 switch v := opt.(type) {
183 case func(*http.Server):
184 v(h1server)
185 case func(*http.HTTP2Config):
186 if h1server.HTTP2 == nil {
187 h1server.HTTP2 = &http.HTTP2Config{}
188 }
189 v(h1server.HTTP2)
190 case func(*tls.ConnectionState):
191 if tlsState == nil {
192 tlsState = &tls.ConnectionState{
193 Version: tls.VersionTLS13,
194 ServerName: "go.dev",
195 CipherSuite: tls.TLS_AES_128_GCM_SHA256,
196 }
197 }
198 v(tlsState)
199 default:
200 t.Fatalf("unknown newServerTester option type %T", v)
201 }
202 }
203
204 tlsConfig := h1server.TLSConfig
205 if tlsConfig == nil {
206 cert, err := tls.X509KeyPair(testcert.LocalhostCert, testcert.LocalhostKey)
207 if err != nil {
208 t.Fatal(err)
209 }
210 tlsConfig = &tls.Config{
211 Certificates: []tls.Certificate{cert},
212 InsecureSkipVerify: true,
213 NextProtos: []string{"h2"},
214 }
215 h1server.TLSConfig = tlsConfig
216 }
217
218 var cli, srv net.Conn
219
220 cliPipe, srvPipe := synctestNetPipe()
221
222 if h1server.Protocols != nil && h1server.Protocols.UnencryptedHTTP2() {
223 cli, srv = cliPipe, srvPipe
224 } else {
225 cli = tls.Client(cliPipe, &tls.Config{
226 InsecureSkipVerify: true,
227 NextProtos: []string{"h2"},
228 })
229 srv = tls.Server(srvPipe, tlsConfig)
230 }
231
232 st := &serverTester{
233 t: t,
234 cc: cli,
235 h1server: h1server,
236 }
237 st.hpackEnc = hpack.NewEncoder(&st.headerBuf)
238 if h1server.ErrorLog == nil {
239 h1server.ErrorLog = log.New(io.MultiWriter(stderrv(), twriter{t: t, st: st}, &st.serverLogBuf), "", log.LstdFlags)
240 }
241
242 if handler == nil {
243 handler = serverTesterHandler{st}.ServeHTTP
244 }
245 h1server.Handler = handler
246
247 t.Cleanup(func() {
248 st.Close()
249 time.Sleep(GoAwayTimeout)
250 })
251
252 connc := make(chan *ServerConn)
253 h1server.ConnContext = func(ctx context.Context, conn net.Conn) context.Context {
254 ctx = context.WithValue(ctx, NewConnContextKey, func(sc *ServerConn) {
255 connc <- sc
256 })
257 if tlsState != nil {
258 ctx = context.WithValue(ctx, ConnectionStateContextKey, func() tls.ConnectionState {
259 return *tlsState
260 })
261 }
262 return ctx
263 }
264 go func() {
265 li := newOneConnListener(srv)
266 t.Cleanup(func() {
267 li.Close()
268 })
269 h1server.Serve(li)
270 }()
271 if cliTLS, ok := cli.(*tls.Conn); ok {
272 if err := cliTLS.Handshake(); err != nil {
273 t.Fatalf("client TLS handshake: %v", err)
274 }
275 cliTLS.SetReadDeadline(time.Now())
276 } else {
277
278
279 st.writePreface()
280 st.wrotePreface = true
281 cliPipe.SetReadDeadline(time.Now())
282 }
283 st.sc = <-connc
284
285 st.fr = NewFramer(st.cc, st.cc)
286 st.testConnFramer = testConnFramer{
287 t: t,
288 fr: NewFramer(cli, cli),
289 dec: hpack.NewDecoder(InitialHeaderTableSize, nil),
290 }
291 synctest.Wait()
292 return st
293 }
294
295 type netConnWithConnectionState struct {
296 net.Conn
297 state tls.ConnectionState
298 }
299
300 func (c *netConnWithConnectionState) ConnectionState() tls.ConnectionState {
301 return c.state
302 }
303
304 func (c *netConnWithConnectionState) HandshakeContext() tls.ConnectionState {
305 return c.state
306 }
307
308 type serverTesterHandler struct {
309 st *serverTester
310 }
311
312 func (h serverTesterHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
313 call := &serverHandlerCall{
314 w: w,
315 req: req,
316 ch: make(chan func()),
317 }
318 h.st.t.Cleanup(call.exit)
319 h.st.callsMu.Lock()
320 h.st.calls = append(h.st.calls, call)
321 h.st.callsMu.Unlock()
322 for f := range call.ch {
323 f()
324 }
325 }
326
327
328 type serverHandlerCall struct {
329 w http.ResponseWriter
330 req *http.Request
331 closeOnce sync.Once
332 ch chan func()
333 }
334
335
336 func (call *serverHandlerCall) do(f func(http.ResponseWriter, *http.Request)) {
337 donec := make(chan struct{})
338 call.ch <- func() {
339 defer close(donec)
340 f(call.w, call.req)
341 }
342 <-donec
343 }
344
345
346 func (call *serverHandlerCall) exit() {
347 call.closeOnce.Do(func() {
348 close(call.ch)
349 })
350 }
351
352
353 func (st *serverTester) sync() {
354 synctest.Wait()
355 }
356
357
358 func (st *serverTester) advance(d time.Duration) {
359 time.Sleep(d)
360 synctest.Wait()
361 }
362
363 func (st *serverTester) authority() string {
364 return "dummy.tld"
365 }
366
367 func (st *serverTester) addLogFilter(phrase string) {
368 st.logFilter = append(st.logFilter, phrase)
369 }
370
371 func (st *serverTester) nextHandlerCall() *serverHandlerCall {
372 st.t.Helper()
373 synctest.Wait()
374 st.callsMu.Lock()
375 defer st.callsMu.Unlock()
376 if len(st.calls) == 0 {
377 st.t.Fatal("expected server handler call, got none")
378 }
379 call := st.calls[0]
380 st.calls = st.calls[1:]
381 return call
382 }
383
384 func (st *serverTester) streamExists(id uint32) bool {
385 return st.sc.TestStreamExists(id)
386 }
387
388 func (st *serverTester) streamState(id uint32) StreamState {
389 return st.sc.TestStreamState(id)
390 }
391
392 func (st *serverTester) Close() {
393 if st.t.Failed() {
394 st.frameReadLogMu.Lock()
395 if st.frameReadLogBuf.Len() > 0 {
396 st.t.Logf("Framer read log:\n%s", st.frameReadLogBuf.String())
397 }
398 st.frameReadLogMu.Unlock()
399
400 st.frameWriteLogMu.Lock()
401 if st.frameWriteLogBuf.Len() > 0 {
402 st.t.Logf("Framer write log:\n%s", st.frameWriteLogBuf.String())
403 }
404 st.frameWriteLogMu.Unlock()
405
406
407
408
409
410 if st.cc != nil {
411 st.cc.Close()
412 }
413 }
414 if st.cc != nil {
415 st.cc.Close()
416 }
417 log.SetOutput(os.Stderr)
418 }
419
420
421
422 func (st *serverTester) greet() {
423 st.t.Helper()
424 st.greetAndCheckSettings(func(Setting) error { return nil })
425 }
426
427 func (st *serverTester) greetAndCheckSettings(checkSetting func(s Setting) error) {
428 st.t.Helper()
429 st.writePreface()
430 st.writeSettings()
431 st.sync()
432 readFrame[*SettingsFrame](st.t, st).ForeachSetting(checkSetting)
433 st.writeSettingsAck()
434
435
436 var gotSettingsAck bool
437 var gotWindowUpdate bool
438
439 for i := 0; i < 2; i++ {
440 f := st.readFrame()
441 if f == nil {
442 st.t.Fatal("wanted a settings ACK and window update, got none")
443 }
444 switch f := f.(type) {
445 case *SettingsFrame:
446 if !f.Header().Flags.Has(FlagSettingsAck) {
447 st.t.Fatal("Settings Frame didn't have ACK set")
448 }
449 gotSettingsAck = true
450
451 case *WindowUpdateFrame:
452 if f.FrameHeader.StreamID != 0 {
453 st.t.Fatalf("WindowUpdate StreamID = %d; want 0", f.FrameHeader.StreamID)
454 }
455 gotWindowUpdate = true
456
457 default:
458 st.t.Fatalf("Wanting a settings ACK or window update, received a %T", f)
459 }
460 }
461
462 if !gotSettingsAck {
463 st.t.Fatalf("Didn't get a settings ACK")
464 }
465 if !gotWindowUpdate {
466 st.t.Fatalf("Didn't get a window update")
467 }
468 }
469
470 func (st *serverTester) writePreface() {
471 if st.wrotePreface {
472 return
473 }
474 n, err := st.cc.Write([]byte(ClientPreface))
475 if err != nil {
476 st.t.Fatalf("Error writing client preface: %v", err)
477 }
478 if n != len(ClientPreface) {
479 st.t.Fatalf("Writing client preface, wrote %d bytes; want %d", n, len(ClientPreface))
480 }
481 }
482
483 func (st *serverTester) encodeHeaderField(k, v string) {
484 err := st.hpackEnc.WriteField(hpack.HeaderField{Name: k, Value: v})
485 if err != nil {
486 st.t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err)
487 }
488 }
489
490
491
492 func (st *serverTester) encodeHeaderRaw(headers ...string) []byte {
493 if len(headers)%2 == 1 {
494 panic("odd number of kv args")
495 }
496 st.headerBuf.Reset()
497 for len(headers) > 0 {
498 k, v := headers[0], headers[1]
499 st.encodeHeaderField(k, v)
500 headers = headers[2:]
501 }
502 return st.headerBuf.Bytes()
503 }
504
505
506
507
508
509
510 func (st *serverTester) encodeHeader(headers ...string) []byte {
511 if len(headers)%2 == 1 {
512 panic("odd number of kv args")
513 }
514
515 st.headerBuf.Reset()
516 defaultAuthority := st.authority()
517
518 if len(headers) == 0 {
519
520
521 st.encodeHeaderField(":method", "GET")
522 st.encodeHeaderField(":scheme", "https")
523 st.encodeHeaderField(":authority", defaultAuthority)
524 st.encodeHeaderField(":path", "/")
525 return st.headerBuf.Bytes()
526 }
527
528 if len(headers) == 2 && headers[0] == ":method" {
529
530 st.encodeHeaderField(":method", headers[1])
531 st.encodeHeaderField(":scheme", "https")
532 st.encodeHeaderField(":authority", defaultAuthority)
533 st.encodeHeaderField(":path", "/")
534 return st.headerBuf.Bytes()
535 }
536
537 pseudoCount := map[string]int{}
538 keys := []string{":method", ":scheme", ":authority", ":path"}
539 vals := map[string][]string{
540 ":method": {"GET"},
541 ":scheme": {"https"},
542 ":authority": {defaultAuthority},
543 ":path": {"/"},
544 }
545 for len(headers) > 0 {
546 k, v := headers[0], headers[1]
547 headers = headers[2:]
548 if _, ok := vals[k]; !ok {
549 keys = append(keys, k)
550 }
551 if strings.HasPrefix(k, ":") {
552 pseudoCount[k]++
553 if pseudoCount[k] == 1 {
554 vals[k] = []string{v}
555 } else {
556
557 vals[k] = append(vals[k], v)
558 }
559 } else {
560 vals[k] = append(vals[k], v)
561 }
562 }
563 for _, k := range keys {
564 for _, v := range vals[k] {
565 st.encodeHeaderField(k, v)
566 }
567 }
568 return st.headerBuf.Bytes()
569 }
570
571
572 func (st *serverTester) bodylessReq1(headers ...string) {
573 st.writeHeaders(HeadersFrameParam{
574 StreamID: 1,
575 BlockFragment: st.encodeHeader(headers...),
576 EndStream: true,
577 EndHeaders: true,
578 })
579 }
580
581 func (st *serverTester) wantConnFlowControlConsumed(consumed int32) {
582 if got, want := st.sc.TestFlowControlConsumed(), consumed; got != want {
583 st.t.Errorf("connection flow control consumed: %v, want %v", got, want)
584 }
585 }
586
587 func TestServer(t *testing.T) { synctestTest(t, testServer) }
588 func testServer(t testing.TB) {
589 gotReq := make(chan bool, 1)
590 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
591 w.Header().Set("Foo", "Bar")
592 gotReq <- true
593 })
594 defer st.Close()
595
596 st.greet()
597 st.writeHeaders(HeadersFrameParam{
598 StreamID: 1,
599 BlockFragment: st.encodeHeader(),
600 EndStream: true,
601 EndHeaders: true,
602 })
603
604 <-gotReq
605 }
606
607 func TestServer_Request_Get(t *testing.T) { synctestTest(t, testServer_Request_Get) }
608 func testServer_Request_Get(t testing.TB) {
609 testServerRequest(t, func(st *serverTester) {
610 st.writeHeaders(HeadersFrameParam{
611 StreamID: 1,
612 BlockFragment: st.encodeHeader("foo-bar", "some-value"),
613 EndStream: true,
614 EndHeaders: true,
615 })
616 }, func(r *http.Request) {
617 if r.Method != "GET" {
618 t.Errorf("Method = %q; want GET", r.Method)
619 }
620 if r.URL.Path != "/" {
621 t.Errorf("URL.Path = %q; want /", r.URL.Path)
622 }
623 if r.ContentLength != 0 {
624 t.Errorf("ContentLength = %v; want 0", r.ContentLength)
625 }
626 if r.Close {
627 t.Error("Close = true; want false")
628 }
629 if !strings.Contains(r.RemoteAddr, ":") {
630 t.Errorf("RemoteAddr = %q; want something with a colon", r.RemoteAddr)
631 }
632 if r.Proto != "HTTP/2.0" || r.ProtoMajor != 2 || r.ProtoMinor != 0 {
633 t.Errorf("Proto = %q Major=%v,Minor=%v; want HTTP/2.0", r.Proto, r.ProtoMajor, r.ProtoMinor)
634 }
635 wantHeader := http.Header{
636 "Foo-Bar": []string{"some-value"},
637 }
638 if !reflect.DeepEqual(r.Header, wantHeader) {
639 t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
640 }
641 if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 {
642 t.Errorf("Read = %d, %v; want 0, EOF", n, err)
643 }
644 })
645 }
646
647 func TestServer_Request_Get_PathSlashes(t *testing.T) {
648 synctestTest(t, testServer_Request_Get_PathSlashes)
649 }
650 func testServer_Request_Get_PathSlashes(t testing.TB) {
651 testServerRequest(t, func(st *serverTester) {
652 st.writeHeaders(HeadersFrameParam{
653 StreamID: 1,
654 BlockFragment: st.encodeHeader(":path", "/%2f/"),
655 EndStream: true,
656 EndHeaders: true,
657 })
658 }, func(r *http.Request) {
659 if r.RequestURI != "/%2f/" {
660 t.Errorf("RequestURI = %q; want /%%2f/", r.RequestURI)
661 }
662 if r.URL.Path != "///" {
663 t.Errorf("URL.Path = %q; want ///", r.URL.Path)
664 }
665 })
666 }
667
668
669
670
671
672 func TestServer_Request_Post_NoContentLength_EndStream(t *testing.T) {
673 synctestTest(t, testServer_Request_Post_NoContentLength_EndStream)
674 }
675 func testServer_Request_Post_NoContentLength_EndStream(t testing.TB) {
676 testServerRequest(t, func(st *serverTester) {
677 st.writeHeaders(HeadersFrameParam{
678 StreamID: 1,
679 BlockFragment: st.encodeHeader(":method", "POST"),
680 EndStream: true,
681 EndHeaders: true,
682 })
683 }, func(r *http.Request) {
684 if r.Method != "POST" {
685 t.Errorf("Method = %q; want POST", r.Method)
686 }
687 if r.ContentLength != 0 {
688 t.Errorf("ContentLength = %v; want 0", r.ContentLength)
689 }
690 if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 {
691 t.Errorf("Read = %d, %v; want 0, EOF", n, err)
692 }
693 })
694 }
695
696 func TestServer_Request_Post_Body_ImmediateEOF(t *testing.T) {
697 synctestTest(t, testServer_Request_Post_Body_ImmediateEOF)
698 }
699 func testServer_Request_Post_Body_ImmediateEOF(t testing.TB) {
700 testBodyContents(t, -1, "", func(st *serverTester) {
701 st.writeHeaders(HeadersFrameParam{
702 StreamID: 1,
703 BlockFragment: st.encodeHeader(":method", "POST"),
704 EndStream: false,
705 EndHeaders: true,
706 })
707 st.writeData(1, true, nil)
708 })
709 }
710
711 func TestServer_Request_Post_Body_OneData(t *testing.T) {
712 synctestTest(t, testServer_Request_Post_Body_OneData)
713 }
714 func testServer_Request_Post_Body_OneData(t testing.TB) {
715 const content = "Some content"
716 testBodyContents(t, -1, content, func(st *serverTester) {
717 st.writeHeaders(HeadersFrameParam{
718 StreamID: 1,
719 BlockFragment: st.encodeHeader(":method", "POST"),
720 EndStream: false,
721 EndHeaders: true,
722 })
723 st.writeData(1, true, []byte(content))
724 })
725 }
726
727 func TestServer_Request_Post_Body_TwoData(t *testing.T) {
728 synctestTest(t, testServer_Request_Post_Body_TwoData)
729 }
730 func testServer_Request_Post_Body_TwoData(t testing.TB) {
731 const content = "Some content"
732 testBodyContents(t, -1, content, func(st *serverTester) {
733 st.writeHeaders(HeadersFrameParam{
734 StreamID: 1,
735 BlockFragment: st.encodeHeader(":method", "POST"),
736 EndStream: false,
737 EndHeaders: true,
738 })
739 st.writeData(1, false, []byte(content[:5]))
740 st.writeData(1, true, []byte(content[5:]))
741 })
742 }
743
744 func TestServer_Request_Post_Body_ContentLength_Correct(t *testing.T) {
745 synctestTest(t, testServer_Request_Post_Body_ContentLength_Correct)
746 }
747 func testServer_Request_Post_Body_ContentLength_Correct(t testing.TB) {
748 const content = "Some content"
749 testBodyContents(t, int64(len(content)), content, func(st *serverTester) {
750 st.writeHeaders(HeadersFrameParam{
751 StreamID: 1,
752 BlockFragment: st.encodeHeader(
753 ":method", "POST",
754 "content-length", strconv.Itoa(len(content)),
755 ),
756 EndStream: false,
757 EndHeaders: true,
758 })
759 st.writeData(1, true, []byte(content))
760 })
761 }
762
763 func TestServer_Request_Post_Body_ContentLength_TooLarge(t *testing.T) {
764 synctestTest(t, testServer_Request_Post_Body_ContentLength_TooLarge)
765 }
766 func testServer_Request_Post_Body_ContentLength_TooLarge(t testing.TB) {
767 testBodyContentsFail(t, 3, "request declared a Content-Length of 3 but only wrote 2 bytes",
768 func(st *serverTester) {
769 st.writeHeaders(HeadersFrameParam{
770 StreamID: 1,
771 BlockFragment: st.encodeHeader(
772 ":method", "POST",
773 "content-length", "3",
774 ),
775 EndStream: false,
776 EndHeaders: true,
777 })
778 st.writeData(1, true, []byte("12"))
779 })
780 }
781
782 func TestServer_Request_Post_Body_ContentLength_TooSmall(t *testing.T) {
783 synctestTest(t, testServer_Request_Post_Body_ContentLength_TooSmall)
784 }
785 func testServer_Request_Post_Body_ContentLength_TooSmall(t testing.TB) {
786 testBodyContentsFail(t, 4, "sender tried to send more than declared Content-Length of 4 bytes",
787 func(st *serverTester) {
788 st.writeHeaders(HeadersFrameParam{
789 StreamID: 1,
790 BlockFragment: st.encodeHeader(
791 ":method", "POST",
792 "content-length", "4",
793 ),
794 EndStream: false,
795 EndHeaders: true,
796 })
797 st.writeData(1, true, []byte("12345"))
798
799
800 st.wantRSTStream(1, ErrCodeProtocol)
801 st.wantConnFlowControlConsumed(0)
802 })
803 }
804
805 func testBodyContents(t testing.TB, wantContentLength int64, wantBody string, write func(st *serverTester)) {
806 testServerRequest(t, write, func(r *http.Request) {
807 if r.Method != "POST" {
808 t.Errorf("Method = %q; want POST", r.Method)
809 }
810 if r.ContentLength != wantContentLength {
811 t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength)
812 }
813 all, err := io.ReadAll(r.Body)
814 if err != nil {
815 t.Fatal(err)
816 }
817 if string(all) != wantBody {
818 t.Errorf("Read = %q; want %q", all, wantBody)
819 }
820 if err := r.Body.Close(); err != nil {
821 t.Fatalf("Close: %v", err)
822 }
823 })
824 }
825
826 func testBodyContentsFail(t testing.TB, wantContentLength int64, wantReadError string, write func(st *serverTester)) {
827 testServerRequest(t, write, func(r *http.Request) {
828 if r.Method != "POST" {
829 t.Errorf("Method = %q; want POST", r.Method)
830 }
831 if r.ContentLength != wantContentLength {
832 t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength)
833 }
834 all, err := io.ReadAll(r.Body)
835 if err == nil {
836 t.Fatalf("expected an error (%q) reading from the body. Successfully read %q instead.",
837 wantReadError, all)
838 }
839 if !strings.Contains(err.Error(), wantReadError) {
840 t.Fatalf("Body.Read = %v; want substring %q", err, wantReadError)
841 }
842 if err := r.Body.Close(); err != nil {
843 t.Fatalf("Close: %v", err)
844 }
845 })
846 }
847
848
849 func TestServer_Request_Get_Host(t *testing.T) { synctestTest(t, testServer_Request_Get_Host) }
850 func testServer_Request_Get_Host(t testing.TB) {
851 const host = "example.com"
852 testServerRequest(t, func(st *serverTester) {
853 st.writeHeaders(HeadersFrameParam{
854 StreamID: 1,
855 BlockFragment: st.encodeHeader(":authority", "", "host", host),
856 EndStream: true,
857 EndHeaders: true,
858 })
859 }, func(r *http.Request) {
860 if r.Host != host {
861 t.Errorf("Host = %q; want %q", r.Host, host)
862 }
863 })
864 }
865
866
867 func TestServer_Request_Get_Authority(t *testing.T) {
868 synctestTest(t, testServer_Request_Get_Authority)
869 }
870 func testServer_Request_Get_Authority(t testing.TB) {
871 const host = "example.com"
872 testServerRequest(t, func(st *serverTester) {
873 st.writeHeaders(HeadersFrameParam{
874 StreamID: 1,
875 BlockFragment: st.encodeHeader(":authority", host),
876 EndStream: true,
877 EndHeaders: true,
878 })
879 }, func(r *http.Request) {
880 if r.Host != host {
881 t.Errorf("Host = %q; want %q", r.Host, host)
882 }
883 })
884 }
885
886 func TestServer_Request_WithContinuation(t *testing.T) {
887 synctestTest(t, testServer_Request_WithContinuation)
888 }
889 func testServer_Request_WithContinuation(t testing.TB) {
890 wantHeader := http.Header{
891 "Foo-One": []string{"value-one"},
892 "Foo-Two": []string{"value-two"},
893 "Foo-Three": []string{"value-three"},
894 }
895 testServerRequest(t, func(st *serverTester) {
896 fullHeaders := st.encodeHeader(
897 "foo-one", "value-one",
898 "foo-two", "value-two",
899 "foo-three", "value-three",
900 )
901 remain := fullHeaders
902 chunks := 0
903 for len(remain) > 0 {
904 const maxChunkSize = 5
905 chunk := remain
906 if len(chunk) > maxChunkSize {
907 chunk = chunk[:maxChunkSize]
908 }
909 remain = remain[len(chunk):]
910
911 if chunks == 0 {
912 st.writeHeaders(HeadersFrameParam{
913 StreamID: 1,
914 BlockFragment: chunk,
915 EndStream: true,
916 EndHeaders: false,
917 })
918 } else {
919 err := st.fr.WriteContinuation(1, len(remain) == 0, chunk)
920 if err != nil {
921 t.Fatal(err)
922 }
923 }
924 chunks++
925 }
926 if chunks < 2 {
927 t.Fatal("too few chunks")
928 }
929 }, func(r *http.Request) {
930 if !reflect.DeepEqual(r.Header, wantHeader) {
931 t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
932 }
933 })
934 }
935
936
937 func TestServer_Request_CookieConcat(t *testing.T) { synctestTest(t, testServer_Request_CookieConcat) }
938 func testServer_Request_CookieConcat(t testing.TB) {
939 const host = "example.com"
940 testServerRequest(t, func(st *serverTester) {
941 st.bodylessReq1(
942 ":authority", host,
943 "cookie", "a=b",
944 "cookie", "c=d",
945 "cookie", "e=f",
946 )
947 }, func(r *http.Request) {
948 const want = "a=b; c=d; e=f"
949 if got := r.Header.Get("Cookie"); got != want {
950 t.Errorf("Cookie = %q; want %q", got, want)
951 }
952 })
953 }
954
955 func TestServer_Request_Reject_CapitalHeader(t *testing.T) {
956 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("UPPER", "v") })
957 }
958
959 func TestServer_Request_Reject_HeaderFieldNameColon(t *testing.T) {
960 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("has:colon", "v") })
961 }
962
963 func TestServer_Request_Reject_HeaderFieldNameNULL(t *testing.T) {
964 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("has\x00null", "v") })
965 }
966
967 func TestServer_Request_Reject_HeaderFieldNameEmpty(t *testing.T) {
968 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("", "v") })
969 }
970
971 func TestServer_Request_Reject_HeaderFieldValueNewline(t *testing.T) {
972 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("foo", "has\nnewline") })
973 }
974
975 func TestServer_Request_Reject_HeaderFieldValueCR(t *testing.T) {
976 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("foo", "has\rcarriage") })
977 }
978
979 func TestServer_Request_Reject_HeaderFieldValueDEL(t *testing.T) {
980 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("foo", "has\x7fdel") })
981 }
982
983 func TestServer_Request_Reject_Pseudo_Missing_method(t *testing.T) {
984 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "") })
985 }
986
987 func TestServer_Request_Reject_Pseudo_ExactlyOne(t *testing.T) {
988
989
990 testRejectRequest(t, func(st *serverTester) {
991 st.addLogFilter("duplicate pseudo-header")
992 st.bodylessReq1(":method", "GET", ":method", "POST")
993 })
994 }
995
996 func TestServer_Request_Reject_Pseudo_AfterRegular(t *testing.T) {
997
998
999
1000
1001
1002
1003 testRejectRequest(t, func(st *serverTester) {
1004 st.addLogFilter("pseudo-header after regular header")
1005 var buf bytes.Buffer
1006 enc := hpack.NewEncoder(&buf)
1007 enc.WriteField(hpack.HeaderField{Name: ":method", Value: "GET"})
1008 enc.WriteField(hpack.HeaderField{Name: "regular", Value: "foobar"})
1009 enc.WriteField(hpack.HeaderField{Name: ":path", Value: "/"})
1010 enc.WriteField(hpack.HeaderField{Name: ":scheme", Value: "https"})
1011 st.writeHeaders(HeadersFrameParam{
1012 StreamID: 1,
1013 BlockFragment: buf.Bytes(),
1014 EndStream: true,
1015 EndHeaders: true,
1016 })
1017 })
1018 }
1019
1020 func TestServer_Request_Reject_Pseudo_Missing_path(t *testing.T) {
1021 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":path", "") })
1022 }
1023
1024 func TestServer_Request_Reject_Pseudo_Missing_scheme(t *testing.T) {
1025 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "") })
1026 }
1027
1028 func TestServer_Request_Reject_Pseudo_scheme_invalid(t *testing.T) {
1029 testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "bogus") })
1030 }
1031
1032 func TestServer_Request_Reject_Pseudo_Unknown(t *testing.T) {
1033 testRejectRequest(t, func(st *serverTester) {
1034 st.addLogFilter(`invalid pseudo-header ":unknown_thing"`)
1035 st.bodylessReq1(":unknown_thing", "")
1036 })
1037 }
1038
1039 func TestServer_Request_Reject_Authority_Userinfo(t *testing.T) {
1040
1041
1042
1043 testRejectRequest(t, func(st *serverTester) {
1044 var buf bytes.Buffer
1045 enc := hpack.NewEncoder(&buf)
1046 enc.WriteField(hpack.HeaderField{Name: ":authority", Value: "userinfo@example.tld"})
1047 enc.WriteField(hpack.HeaderField{Name: ":method", Value: "GET"})
1048 enc.WriteField(hpack.HeaderField{Name: ":path", Value: "/"})
1049 enc.WriteField(hpack.HeaderField{Name: ":scheme", Value: "https"})
1050 st.writeHeaders(HeadersFrameParam{
1051 StreamID: 1,
1052 BlockFragment: buf.Bytes(),
1053 EndStream: true,
1054 EndHeaders: true,
1055 })
1056 })
1057 }
1058
1059 func testRejectRequest(t *testing.T, send func(*serverTester)) {
1060 synctestTest(t, func(t testing.TB) {
1061 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
1062 t.Error("server request made it to handler; should've been rejected")
1063 })
1064 defer st.Close()
1065
1066 st.greet()
1067 send(st)
1068 st.wantRSTStream(1, ErrCodeProtocol)
1069 })
1070 }
1071
1072 func newServerTesterForError(t testing.TB) *serverTester {
1073 t.Helper()
1074 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
1075 t.Error("server request made it to handler; should've been rejected")
1076 }, optQuiet)
1077 st.greet()
1078 return st
1079 }
1080
1081
1082
1083
1084 func TestRejectFrameOnIdle_WindowUpdate(t *testing.T) {
1085 synctestTest(t, testRejectFrameOnIdle_WindowUpdate)
1086 }
1087 func testRejectFrameOnIdle_WindowUpdate(t testing.TB) {
1088 st := newServerTesterForError(t)
1089 st.fr.WriteWindowUpdate(123, 456)
1090 st.wantGoAway(123, ErrCodeProtocol)
1091 }
1092 func TestRejectFrameOnIdle_Data(t *testing.T) { synctestTest(t, testRejectFrameOnIdle_Data) }
1093 func testRejectFrameOnIdle_Data(t testing.TB) {
1094 st := newServerTesterForError(t)
1095 st.fr.WriteData(123, true, nil)
1096 st.wantGoAway(123, ErrCodeProtocol)
1097 }
1098 func TestRejectFrameOnIdle_RSTStream(t *testing.T) { synctestTest(t, testRejectFrameOnIdle_RSTStream) }
1099 func testRejectFrameOnIdle_RSTStream(t testing.TB) {
1100 st := newServerTesterForError(t)
1101 st.fr.WriteRSTStream(123, ErrCodeCancel)
1102 st.wantGoAway(123, ErrCodeProtocol)
1103 }
1104
1105 func TestServer_Request_Connect(t *testing.T) { synctestTest(t, testServer_Request_Connect) }
1106 func testServer_Request_Connect(t testing.TB) {
1107 testServerRequest(t, func(st *serverTester) {
1108 st.writeHeaders(HeadersFrameParam{
1109 StreamID: 1,
1110 BlockFragment: st.encodeHeaderRaw(
1111 ":method", "CONNECT",
1112 ":authority", "example.com:123",
1113 ),
1114 EndStream: true,
1115 EndHeaders: true,
1116 })
1117 }, func(r *http.Request) {
1118 if g, w := r.Method, "CONNECT"; g != w {
1119 t.Errorf("Method = %q; want %q", g, w)
1120 }
1121 if g, w := r.RequestURI, "example.com:123"; g != w {
1122 t.Errorf("RequestURI = %q; want %q", g, w)
1123 }
1124 if g, w := r.URL.Host, "example.com:123"; g != w {
1125 t.Errorf("URL.Host = %q; want %q", g, w)
1126 }
1127 })
1128 }
1129
1130 func TestServer_Request_Connect_InvalidPath(t *testing.T) {
1131 synctestTest(t, testServer_Request_Connect_InvalidPath)
1132 }
1133 func testServer_Request_Connect_InvalidPath(t testing.TB) {
1134 testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) {
1135 st.writeHeaders(HeadersFrameParam{
1136 StreamID: 1,
1137 BlockFragment: st.encodeHeaderRaw(
1138 ":method", "CONNECT",
1139 ":authority", "example.com:123",
1140 ":path", "/bogus",
1141 ),
1142 EndStream: true,
1143 EndHeaders: true,
1144 })
1145 })
1146 }
1147
1148 func TestServer_Request_Connect_InvalidScheme(t *testing.T) {
1149 synctestTest(t, testServer_Request_Connect_InvalidScheme)
1150 }
1151 func testServer_Request_Connect_InvalidScheme(t testing.TB) {
1152 testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) {
1153 st.writeHeaders(HeadersFrameParam{
1154 StreamID: 1,
1155 BlockFragment: st.encodeHeaderRaw(
1156 ":method", "CONNECT",
1157 ":authority", "example.com:123",
1158 ":scheme", "https",
1159 ),
1160 EndStream: true,
1161 EndHeaders: true,
1162 })
1163 })
1164 }
1165
1166 func TestServer_Ping(t *testing.T) { synctestTest(t, testServer_Ping) }
1167 func testServer_Ping(t testing.TB) {
1168 st := newServerTester(t, nil)
1169 defer st.Close()
1170 st.greet()
1171
1172
1173 ackPingData := [8]byte{1, 2, 4, 8, 16, 32, 64, 128}
1174 if err := st.fr.WritePing(true, ackPingData); err != nil {
1175 t.Fatal(err)
1176 }
1177
1178
1179 pingData := [8]byte{1, 2, 3, 4, 5, 6, 7, 8}
1180 if err := st.fr.WritePing(false, pingData); err != nil {
1181 t.Fatal(err)
1182 }
1183
1184 pf := readFrame[*PingFrame](t, st)
1185 if !pf.Flags.Has(FlagPingAck) {
1186 t.Error("response ping doesn't have ACK set")
1187 }
1188 if pf.Data != pingData {
1189 t.Errorf("response ping has data %q; want %q", pf.Data, pingData)
1190 }
1191 }
1192
1193 type filterListener struct {
1194 net.Listener
1195 accept func(conn net.Conn) (net.Conn, error)
1196 }
1197
1198 func (l *filterListener) Accept() (net.Conn, error) {
1199 c, err := l.Listener.Accept()
1200 if err != nil {
1201 return nil, err
1202 }
1203 return l.accept(c)
1204 }
1205
1206 func TestServer_MaxQueuedControlFrames(t *testing.T) {
1207 synctestTest(t, testServer_MaxQueuedControlFrames)
1208 }
1209 func testServer_MaxQueuedControlFrames(t testing.TB) {
1210
1211 DisableGoroutineTracking(t)
1212
1213 st := newServerTester(t, nil)
1214 st.greet()
1215
1216 st.cc.(*tls.Conn).NetConn().(*synctestNetConn).SetReadBufferSize(0)
1217
1218
1219
1220 const extraPings = 2
1221 for i := 0; i < MaxQueuedControlFrames+extraPings; i++ {
1222 pingData := [8]byte{1, 2, 3, 4, 5, 6, 7, 8}
1223 st.fr.WritePing(false, pingData)
1224 }
1225 synctest.Wait()
1226
1227
1228
1229 st.cc.(*tls.Conn).NetConn().(*synctestNetConn).SetReadBufferSize(math.MaxInt)
1230
1231 st.advance(GoAwayTimeout)
1232
1233 for i := 0; i < 10; i++ {
1234 if st.readFrame() == nil {
1235 break
1236 }
1237 }
1238 st.wantClosed()
1239 }
1240
1241 func TestServer_RejectsLargeFrames(t *testing.T) { synctestTest(t, testServer_RejectsLargeFrames) }
1242 func testServer_RejectsLargeFrames(t testing.TB) {
1243 if runtime.GOOS == "windows" || runtime.GOOS == "plan9" || runtime.GOOS == "zos" {
1244 t.Skip("see golang.org/issue/13434, golang.org/issue/37321")
1245 }
1246 st := newServerTester(t, nil)
1247 defer st.Close()
1248 st.greet()
1249
1250
1251
1252
1253 st.fr.WriteRawFrame(0xff, 0, 0, make([]byte, DefaultMaxReadFrameSize+1))
1254
1255 st.wantGoAway(0, ErrCodeFrameSize)
1256 st.advance(GoAwayTimeout)
1257 st.wantClosed()
1258 }
1259
1260 func TestServer_Handler_Sends_WindowUpdate(t *testing.T) {
1261 synctestTest(t, testServer_Handler_Sends_WindowUpdate)
1262 }
1263 func testServer_Handler_Sends_WindowUpdate(t testing.TB) {
1264
1265
1266
1267
1268 const windowSize = 65535 * 2
1269 st := newServerTester(t, nil, func(h2 *http.HTTP2Config) {
1270 h2.MaxReceiveBufferPerConnection = windowSize
1271 h2.MaxReceiveBufferPerStream = windowSize
1272 })
1273 defer st.Close()
1274
1275 st.greet()
1276 st.writeHeaders(HeadersFrameParam{
1277 StreamID: 1,
1278 BlockFragment: st.encodeHeader(":method", "POST"),
1279 EndStream: false,
1280 EndHeaders: true,
1281 })
1282 call := st.nextHandlerCall()
1283
1284
1285
1286
1287 data := make([]byte, windowSize)
1288 st.writeData(1, false, data[:1024])
1289 call.do(readBodyHandler(t, string(data[:1024])))
1290
1291
1292
1293 st.writeData(1, false, data[1024:])
1294 st.wantWindowUpdate(0, 1024)
1295 st.wantWindowUpdate(1, 1024)
1296
1297
1298 call.do(readBodyHandler(t, string(data[1024:])))
1299 st.wantWindowUpdate(0, windowSize-1024)
1300 st.wantWindowUpdate(1, windowSize-1024)
1301 }
1302
1303
1304
1305 func TestServer_Handler_Sends_WindowUpdate_Padding(t *testing.T) {
1306 synctestTest(t, testServer_Handler_Sends_WindowUpdate_Padding)
1307 }
1308 func testServer_Handler_Sends_WindowUpdate_Padding(t testing.TB) {
1309 const windowSize = 65535 * 2
1310 st := newServerTester(t, nil, func(h2 *http.HTTP2Config) {
1311 h2.MaxReceiveBufferPerConnection = windowSize
1312 h2.MaxReceiveBufferPerStream = windowSize
1313 })
1314 defer st.Close()
1315
1316 st.greet()
1317 st.writeHeaders(HeadersFrameParam{
1318 StreamID: 1,
1319 BlockFragment: st.encodeHeader(":method", "POST"),
1320 EndStream: false,
1321 EndHeaders: true,
1322 })
1323 call := st.nextHandlerCall()
1324
1325
1326
1327
1328 data := make([]byte, windowSize/2)
1329 pad := make([]byte, 4)
1330 st.writeDataPadded(1, false, data, pad)
1331
1332
1333
1334
1335 call.do(readBodyHandler(t, string(data)))
1336 st.wantWindowUpdate(0, uint32(len(data)+1+len(pad)))
1337 st.wantWindowUpdate(1, uint32(len(data)+1+len(pad)))
1338 }
1339
1340 func TestServer_Send_GoAway_After_Bogus_WindowUpdate(t *testing.T) {
1341 synctestTest(t, testServer_Send_GoAway_After_Bogus_WindowUpdate)
1342 }
1343 func testServer_Send_GoAway_After_Bogus_WindowUpdate(t testing.TB) {
1344 st := newServerTester(t, nil)
1345 defer st.Close()
1346 st.greet()
1347 if err := st.fr.WriteWindowUpdate(0, 1<<31-1); err != nil {
1348 t.Fatal(err)
1349 }
1350 st.wantGoAway(0, ErrCodeFlowControl)
1351 }
1352
1353 func TestServer_Send_RstStream_After_Bogus_WindowUpdate(t *testing.T) {
1354 synctestTest(t, testServer_Send_RstStream_After_Bogus_WindowUpdate)
1355 }
1356 func testServer_Send_RstStream_After_Bogus_WindowUpdate(t testing.TB) {
1357 inHandler := make(chan bool)
1358 blockHandler := make(chan bool)
1359 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
1360 inHandler <- true
1361 <-blockHandler
1362 })
1363 defer st.Close()
1364 defer close(blockHandler)
1365 st.greet()
1366 st.writeHeaders(HeadersFrameParam{
1367 StreamID: 1,
1368 BlockFragment: st.encodeHeader(":method", "POST"),
1369 EndStream: false,
1370 EndHeaders: true,
1371 })
1372 <-inHandler
1373
1374 if err := st.fr.WriteWindowUpdate(1, 1<<31-1); err != nil {
1375 t.Fatal(err)
1376 }
1377 st.wantRSTStream(1, ErrCodeFlowControl)
1378 }
1379
1380
1381
1382
1383 func testServerPostUnblock(t testing.TB,
1384 handler func(http.ResponseWriter, *http.Request) error,
1385 fn func(*serverTester),
1386 checkErr func(error),
1387 otherHeaders ...string) {
1388 inHandler := make(chan bool)
1389 errc := make(chan error, 1)
1390 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
1391 inHandler <- true
1392 errc <- handler(w, r)
1393 })
1394 defer st.Close()
1395 st.greet()
1396 st.writeHeaders(HeadersFrameParam{
1397 StreamID: 1,
1398 BlockFragment: st.encodeHeader(append([]string{":method", "POST"}, otherHeaders...)...),
1399 EndStream: false,
1400 EndHeaders: true,
1401 })
1402 <-inHandler
1403 fn(st)
1404 err := <-errc
1405 if checkErr != nil {
1406 checkErr(err)
1407 }
1408 }
1409
1410 func TestServer_RSTStream_Unblocks_Read(t *testing.T) {
1411 synctestTest(t, testServer_RSTStream_Unblocks_Read)
1412 }
1413 func testServer_RSTStream_Unblocks_Read(t testing.TB) {
1414 testServerPostUnblock(t,
1415 func(w http.ResponseWriter, r *http.Request) (err error) {
1416 _, err = r.Body.Read(make([]byte, 1))
1417 return
1418 },
1419 func(st *serverTester) {
1420 if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
1421 t.Fatal(err)
1422 }
1423 },
1424 func(err error) {
1425 want := StreamError{StreamID: 0x1, Code: 0x8}
1426 if !reflect.DeepEqual(err, want) {
1427 t.Errorf("Read error = %v; want %v", err, want)
1428 }
1429 },
1430 )
1431 }
1432
1433 func TestServer_RSTStream_Unblocks_Header_Write(t *testing.T) {
1434
1435
1436 n := 50
1437 if testing.Short() {
1438 n = 5
1439 }
1440 for i := 0; i < n; i++ {
1441 synctestTest(t, testServer_RSTStream_Unblocks_Header_Write)
1442 }
1443 }
1444
1445 func testServer_RSTStream_Unblocks_Header_Write(t testing.TB) {
1446 inHandler := make(chan bool, 1)
1447 unblockHandler := make(chan bool, 1)
1448 headerWritten := make(chan bool, 1)
1449 wroteRST := make(chan bool, 1)
1450
1451 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
1452 inHandler <- true
1453 <-wroteRST
1454 w.Header().Set("foo", "bar")
1455 w.WriteHeader(200)
1456 w.(http.Flusher).Flush()
1457 headerWritten <- true
1458 <-unblockHandler
1459 })
1460 defer st.Close()
1461
1462 st.greet()
1463 st.writeHeaders(HeadersFrameParam{
1464 StreamID: 1,
1465 BlockFragment: st.encodeHeader(":method", "POST"),
1466 EndStream: false,
1467 EndHeaders: true,
1468 })
1469 <-inHandler
1470 if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
1471 t.Fatal(err)
1472 }
1473 wroteRST <- true
1474 synctest.Wait()
1475 <-headerWritten
1476 unblockHandler <- true
1477 }
1478
1479 func TestServer_DeadConn_Unblocks_Read(t *testing.T) {
1480 synctestTest(t, testServer_DeadConn_Unblocks_Read)
1481 }
1482 func testServer_DeadConn_Unblocks_Read(t testing.TB) {
1483 testServerPostUnblock(t,
1484 func(w http.ResponseWriter, r *http.Request) (err error) {
1485 _, err = r.Body.Read(make([]byte, 1))
1486 return
1487 },
1488 func(st *serverTester) { st.cc.Close() },
1489 func(err error) {
1490 if err == nil {
1491 t.Error("unexpected nil error from Request.Body.Read")
1492 }
1493 },
1494 )
1495 }
1496
1497 var blockUntilClosed = func(w http.ResponseWriter, r *http.Request) error {
1498 <-w.(http.CloseNotifier).CloseNotify()
1499 return nil
1500 }
1501
1502 func TestServer_CloseNotify_After_RSTStream(t *testing.T) {
1503 synctestTest(t, testServer_CloseNotify_After_RSTStream)
1504 }
1505 func testServer_CloseNotify_After_RSTStream(t testing.TB) {
1506 testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) {
1507 if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
1508 t.Fatal(err)
1509 }
1510 }, nil)
1511 }
1512
1513 func TestServer_CloseNotify_After_ConnClose(t *testing.T) {
1514 synctestTest(t, testServer_CloseNotify_After_ConnClose)
1515 }
1516 func testServer_CloseNotify_After_ConnClose(t testing.TB) {
1517 testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { st.cc.Close() }, nil)
1518 }
1519
1520
1521
1522
1523 func TestServer_CloseNotify_After_StreamError(t *testing.T) {
1524 synctestTest(t, testServer_CloseNotify_After_StreamError)
1525 }
1526 func testServer_CloseNotify_After_StreamError(t testing.TB) {
1527 testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) {
1528
1529 st.writeData(1, true, []byte("1234"))
1530 }, nil, "content-length", "3")
1531 }
1532
1533 func TestServer_StateTransitions(t *testing.T) { synctestTest(t, testServer_StateTransitions) }
1534 func testServer_StateTransitions(t testing.TB) {
1535 var st *serverTester
1536 inHandler := make(chan bool)
1537 writeData := make(chan bool)
1538 leaveHandler := make(chan bool)
1539 st = newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
1540 inHandler <- true
1541 if !st.streamExists(1) {
1542 t.Errorf("stream 1 does not exist in handler")
1543 }
1544 if got, want := st.streamState(1), StateOpen; got != want {
1545 t.Errorf("in handler, state is %v; want %v", got, want)
1546 }
1547 writeData <- true
1548 if n, err := r.Body.Read(make([]byte, 1)); n != 0 || err != io.EOF {
1549 t.Errorf("body read = %d, %v; want 0, EOF", n, err)
1550 }
1551 if got, want := st.streamState(1), StateHalfClosedRemote; got != want {
1552 t.Errorf("in handler, state is %v; want %v", got, want)
1553 }
1554
1555 <-leaveHandler
1556 })
1557 st.greet()
1558 if st.streamExists(1) {
1559 t.Fatal("stream 1 should be empty")
1560 }
1561 if got := st.streamState(1); got != StateIdle {
1562 t.Fatalf("stream 1 should be idle; got %v", got)
1563 }
1564
1565 st.writeHeaders(HeadersFrameParam{
1566 StreamID: 1,
1567 BlockFragment: st.encodeHeader(":method", "POST"),
1568 EndStream: false,
1569 EndHeaders: true,
1570 })
1571 <-inHandler
1572 <-writeData
1573 st.writeData(1, true, nil)
1574
1575 leaveHandler <- true
1576 st.wantHeaders(wantHeader{
1577 streamID: 1,
1578 endStream: true,
1579 })
1580
1581 if got, want := st.streamState(1), StateClosed; got != want {
1582 t.Errorf("at end, state is %v; want %v", got, want)
1583 }
1584 if st.streamExists(1) {
1585 t.Fatal("at end, stream 1 should be gone")
1586 }
1587 }
1588
1589
1590 func TestServer_Rejects_HeadersNoEnd_Then_Headers(t *testing.T) {
1591 synctestTest(t, testServer_Rejects_HeadersNoEnd_Then_Headers)
1592 }
1593 func testServer_Rejects_HeadersNoEnd_Then_Headers(t testing.TB) {
1594 st := newServerTesterForError(t)
1595 st.writeHeaders(HeadersFrameParam{
1596 StreamID: 1,
1597 BlockFragment: st.encodeHeader(),
1598 EndStream: true,
1599 EndHeaders: false,
1600 })
1601 st.writeHeaders(HeadersFrameParam{
1602 StreamID: 3,
1603 BlockFragment: st.encodeHeader(),
1604 EndStream: true,
1605 EndHeaders: true,
1606 })
1607 st.wantGoAway(0, ErrCodeProtocol)
1608 }
1609
1610
1611 func TestServer_Rejects_HeadersNoEnd_Then_Ping(t *testing.T) {
1612 synctestTest(t, testServer_Rejects_HeadersNoEnd_Then_Ping)
1613 }
1614 func testServer_Rejects_HeadersNoEnd_Then_Ping(t testing.TB) {
1615 st := newServerTesterForError(t)
1616 st.writeHeaders(HeadersFrameParam{
1617 StreamID: 1,
1618 BlockFragment: st.encodeHeader(),
1619 EndStream: true,
1620 EndHeaders: false,
1621 })
1622 if err := st.fr.WritePing(false, [8]byte{}); err != nil {
1623 t.Fatal(err)
1624 }
1625 st.wantGoAway(0, ErrCodeProtocol)
1626 }
1627
1628
1629 func TestServer_Rejects_HeadersEnd_Then_Continuation(t *testing.T) {
1630 synctestTest(t, testServer_Rejects_HeadersEnd_Then_Continuation)
1631 }
1632 func testServer_Rejects_HeadersEnd_Then_Continuation(t testing.TB) {
1633 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}, optQuiet)
1634 st.greet()
1635 st.writeHeaders(HeadersFrameParam{
1636 StreamID: 1,
1637 BlockFragment: st.encodeHeader(),
1638 EndStream: true,
1639 EndHeaders: true,
1640 })
1641 st.wantHeaders(wantHeader{
1642 streamID: 1,
1643 endStream: true,
1644 })
1645 if err := st.fr.WriteContinuation(1, true, EncodeHeaderRaw(t, "foo", "bar")); err != nil {
1646 t.Fatal(err)
1647 }
1648 st.wantGoAway(1, ErrCodeProtocol)
1649 }
1650
1651
1652 func TestServer_Rejects_HeadersNoEnd_Then_ContinuationWrongStream(t *testing.T) {
1653 synctestTest(t, testServer_Rejects_HeadersNoEnd_Then_ContinuationWrongStream)
1654 }
1655 func testServer_Rejects_HeadersNoEnd_Then_ContinuationWrongStream(t testing.TB) {
1656 st := newServerTesterForError(t)
1657 st.writeHeaders(HeadersFrameParam{
1658 StreamID: 1,
1659 BlockFragment: st.encodeHeader(),
1660 EndStream: true,
1661 EndHeaders: false,
1662 })
1663 if err := st.fr.WriteContinuation(3, true, EncodeHeaderRaw(t, "foo", "bar")); err != nil {
1664 t.Fatal(err)
1665 }
1666 st.wantGoAway(0, ErrCodeProtocol)
1667 }
1668
1669
1670 func TestServer_Rejects_Headers0(t *testing.T) { synctestTest(t, testServer_Rejects_Headers0) }
1671 func testServer_Rejects_Headers0(t testing.TB) {
1672 st := newServerTesterForError(t)
1673 st.fr.AllowIllegalWrites = true
1674 st.writeHeaders(HeadersFrameParam{
1675 StreamID: 0,
1676 BlockFragment: st.encodeHeader(),
1677 EndStream: true,
1678 EndHeaders: true,
1679 })
1680 st.wantGoAway(0, ErrCodeProtocol)
1681 }
1682
1683
1684 func TestServer_Rejects_Continuation0(t *testing.T) {
1685 synctestTest(t, testServer_Rejects_Continuation0)
1686 }
1687 func testServer_Rejects_Continuation0(t testing.TB) {
1688 st := newServerTesterForError(t)
1689 st.fr.AllowIllegalWrites = true
1690 if err := st.fr.WriteContinuation(0, true, st.encodeHeader()); err != nil {
1691 t.Fatal(err)
1692 }
1693 st.wantGoAway(0, ErrCodeProtocol)
1694 }
1695
1696
1697 func TestServer_Rejects_Priority0(t *testing.T) { synctestTest(t, testServer_Rejects_Priority0) }
1698 func testServer_Rejects_Priority0(t testing.TB) {
1699 st := newServerTesterForError(t)
1700 st.fr.AllowIllegalWrites = true
1701 st.writePriority(0, PriorityParam{StreamDep: 1})
1702 st.wantGoAway(0, ErrCodeProtocol)
1703 }
1704
1705
1706
1707 func TestServer_Rejects_PriorityUpdate0(t *testing.T) {
1708 synctestTest(t, testServer_Rejects_PriorityUpdate0)
1709 }
1710 func testServer_Rejects_PriorityUpdate0(t testing.TB) {
1711 st := newServerTesterForError(t)
1712 st.fr.AllowIllegalWrites = true
1713 st.writePriorityUpdate(0, "")
1714 st.wantGoAway(0, ErrCodeProtocol)
1715 }
1716
1717
1718 func TestServer_Rejects_PriorityUpdateUnparsable(t *testing.T) {
1719 synctestTest(t, testServer_Rejects_PriorityUnparsable)
1720 }
1721 func testServer_Rejects_PriorityUnparsable(t testing.TB) {
1722 st := newServerTester(t, nil)
1723 defer st.Close()
1724 st.greet()
1725 st.writePriorityUpdate(1, "Invalid dictionary: ((((")
1726 st.wantRSTStream(1, ErrCodeProtocol)
1727 }
1728
1729
1730 func TestServer_Rejects_HeadersSelfDependence(t *testing.T) {
1731 synctestTest(t, testServer_Rejects_HeadersSelfDependence)
1732 }
1733 func testServer_Rejects_HeadersSelfDependence(t testing.TB) {
1734 testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) {
1735 st.fr.AllowIllegalWrites = true
1736 st.writeHeaders(HeadersFrameParam{
1737 StreamID: 1,
1738 BlockFragment: st.encodeHeader(),
1739 EndStream: true,
1740 EndHeaders: true,
1741 Priority: PriorityParam{StreamDep: 1},
1742 })
1743 })
1744 }
1745
1746
1747 func TestServer_Rejects_PrioritySelfDependence(t *testing.T) {
1748 synctestTest(t, testServer_Rejects_PrioritySelfDependence)
1749 }
1750 func testServer_Rejects_PrioritySelfDependence(t testing.TB) {
1751 testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) {
1752 st.fr.AllowIllegalWrites = true
1753 st.writePriority(1, PriorityParam{StreamDep: 1})
1754 })
1755 }
1756
1757 func TestServer_Rejects_PushPromise(t *testing.T) { synctestTest(t, testServer_Rejects_PushPromise) }
1758 func testServer_Rejects_PushPromise(t testing.TB) {
1759 st := newServerTesterForError(t)
1760 pp := PushPromiseParam{
1761 StreamID: 1,
1762 PromiseID: 3,
1763 }
1764 if err := st.fr.WritePushPromise(pp); err != nil {
1765 t.Fatal(err)
1766 }
1767 st.wantGoAway(1, ErrCodeProtocol)
1768 }
1769
1770
1771
1772 func testServerRejectsStream(t testing.TB, code ErrCode, writeReq func(*serverTester)) {
1773 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {})
1774 defer st.Close()
1775 st.greet()
1776 writeReq(st)
1777 st.wantRSTStream(1, code)
1778 }
1779
1780
1781
1782
1783 func testServerRequest(t testing.TB, writeReq func(*serverTester), checkReq func(*http.Request)) {
1784 gotReq := make(chan bool, 1)
1785 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
1786 if r.Body == nil {
1787 t.Fatal("nil Body")
1788 }
1789 checkReq(r)
1790 gotReq <- true
1791 })
1792 defer st.Close()
1793
1794 st.greet()
1795 writeReq(st)
1796 <-gotReq
1797 }
1798
1799 func getSlash(st *serverTester) { st.bodylessReq1() }
1800
1801 func TestServer_Response_NoData(t *testing.T) { synctestTest(t, testServer_Response_NoData) }
1802 func testServer_Response_NoData(t testing.TB) {
1803 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
1804
1805 return nil
1806 }, func(st *serverTester) {
1807 getSlash(st)
1808 st.wantHeaders(wantHeader{
1809 streamID: 1,
1810 endStream: true,
1811 })
1812 })
1813 }
1814
1815 func TestServer_Response_NoData_Header_FooBar(t *testing.T) {
1816 synctestTest(t, testServer_Response_NoData_Header_FooBar)
1817 }
1818 func testServer_Response_NoData_Header_FooBar(t testing.TB) {
1819 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
1820 w.Header().Set("Foo-Bar", "some-value")
1821 return nil
1822 }, func(st *serverTester) {
1823 getSlash(st)
1824 st.wantHeaders(wantHeader{
1825 streamID: 1,
1826 endStream: true,
1827 header: http.Header{
1828 ":status": []string{"200"},
1829 "foo-bar": []string{"some-value"},
1830 "content-length": []string{"0"},
1831 },
1832 })
1833 })
1834 }
1835
1836
1837
1838 func TestServerIgnoresContentLengthSignWhenWritingChunks(t *testing.T) {
1839 synctestTest(t, testServerIgnoresContentLengthSignWhenWritingChunks)
1840 }
1841 func testServerIgnoresContentLengthSignWhenWritingChunks(t testing.TB) {
1842 tests := []struct {
1843 name string
1844 cl string
1845 wantCL string
1846 }{
1847 {
1848 name: "proper content-length",
1849 cl: "3",
1850 wantCL: "3",
1851 },
1852 {
1853 name: "ignore cl with plus sign",
1854 cl: "+3",
1855 wantCL: "0",
1856 },
1857 {
1858 name: "ignore cl with minus sign",
1859 cl: "-3",
1860 wantCL: "0",
1861 },
1862 {
1863 name: "max int64, for safe uint64->int64 conversion",
1864 cl: "9223372036854775807",
1865 wantCL: "9223372036854775807",
1866 },
1867 {
1868 name: "overflows int64, so ignored",
1869 cl: "9223372036854775808",
1870 wantCL: "0",
1871 },
1872 }
1873
1874 for _, tt := range tests {
1875 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
1876 w.Header().Set("content-length", tt.cl)
1877 return nil
1878 }, func(st *serverTester) {
1879 getSlash(st)
1880 st.wantHeaders(wantHeader{
1881 streamID: 1,
1882 endStream: true,
1883 header: http.Header{
1884 ":status": []string{"200"},
1885 "content-length": []string{tt.wantCL},
1886 },
1887 })
1888 })
1889 }
1890 }
1891
1892
1893
1894 func TestServerRejectsContentLengthWithSignNewRequests(t *testing.T) {
1895 tests := []struct {
1896 name string
1897 cl string
1898 wantCL int64
1899 }{
1900 {
1901 name: "proper content-length",
1902 cl: "3",
1903 wantCL: 3,
1904 },
1905 {
1906 name: "ignore cl with plus sign",
1907 cl: "+3",
1908 wantCL: 0,
1909 },
1910 {
1911 name: "ignore cl with minus sign",
1912 cl: "-3",
1913 wantCL: 0,
1914 },
1915 {
1916 name: "max int64, for safe uint64->int64 conversion",
1917 cl: "9223372036854775807",
1918 wantCL: 9223372036854775807,
1919 },
1920 {
1921 name: "overflows int64, so ignored",
1922 cl: "9223372036854775808",
1923 wantCL: 0,
1924 },
1925 }
1926
1927 for _, tt := range tests {
1928 tt := tt
1929 synctestSubtest(t, tt.name, func(t testing.TB) {
1930 writeReq := func(st *serverTester) {
1931 st.writeHeaders(HeadersFrameParam{
1932 StreamID: 1,
1933 BlockFragment: st.encodeHeader("content-length", tt.cl),
1934 EndStream: false,
1935 EndHeaders: true,
1936 })
1937 st.writeData(1, false, []byte(""))
1938 }
1939 checkReq := func(r *http.Request) {
1940 if r.ContentLength != tt.wantCL {
1941 t.Fatalf("Got: %d\nWant: %d", r.ContentLength, tt.wantCL)
1942 }
1943 }
1944 testServerRequest(t, writeReq, checkReq)
1945 })
1946 }
1947 }
1948
1949 func TestServer_Response_Data_Sniff_DoesntOverride(t *testing.T) {
1950 synctestTest(t, testServer_Response_Data_Sniff_DoesntOverride)
1951 }
1952 func testServer_Response_Data_Sniff_DoesntOverride(t testing.TB) {
1953 const msg = "<html>this is HTML."
1954 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
1955 w.Header().Set("Content-Type", "foo/bar")
1956 io.WriteString(w, msg)
1957 return nil
1958 }, func(st *serverTester) {
1959 getSlash(st)
1960 st.wantHeaders(wantHeader{
1961 streamID: 1,
1962 endStream: false,
1963 header: http.Header{
1964 ":status": []string{"200"},
1965 "content-type": []string{"foo/bar"},
1966 "content-length": []string{strconv.Itoa(len(msg))},
1967 },
1968 })
1969 st.wantData(wantData{
1970 streamID: 1,
1971 endStream: true,
1972 data: []byte(msg),
1973 })
1974 })
1975 }
1976
1977 func TestServer_Response_TransferEncoding_chunked(t *testing.T) {
1978 synctestTest(t, testServer_Response_TransferEncoding_chunked)
1979 }
1980 func testServer_Response_TransferEncoding_chunked(t testing.TB) {
1981 const msg = "hi"
1982 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
1983 w.Header().Set("Transfer-Encoding", "chunked")
1984 io.WriteString(w, msg)
1985 return nil
1986 }, func(st *serverTester) {
1987 getSlash(st)
1988 st.wantHeaders(wantHeader{
1989 streamID: 1,
1990 endStream: false,
1991 header: http.Header{
1992 ":status": []string{"200"},
1993 "content-type": []string{"text/plain; charset=utf-8"},
1994 "content-length": []string{strconv.Itoa(len(msg))},
1995 },
1996 })
1997 })
1998 }
1999
2000
2001 func TestServer_Response_Data_IgnoreHeaderAfterWrite_After(t *testing.T) {
2002 synctestTest(t, testServer_Response_Data_IgnoreHeaderAfterWrite_After)
2003 }
2004 func testServer_Response_Data_IgnoreHeaderAfterWrite_After(t testing.TB) {
2005 const msg = "<html>this is HTML."
2006 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2007 io.WriteString(w, msg)
2008 w.Header().Set("foo", "should be ignored")
2009 return nil
2010 }, func(st *serverTester) {
2011 getSlash(st)
2012 st.wantHeaders(wantHeader{
2013 streamID: 1,
2014 endStream: false,
2015 header: http.Header{
2016 ":status": []string{"200"},
2017 "content-type": []string{"text/html; charset=utf-8"},
2018 "content-length": []string{strconv.Itoa(len(msg))},
2019 },
2020 })
2021 })
2022 }
2023
2024
2025 func TestServer_Response_Data_IgnoreHeaderAfterWrite_Overwrite(t *testing.T) {
2026 synctestTest(t, testServer_Response_Data_IgnoreHeaderAfterWrite_Overwrite)
2027 }
2028 func testServer_Response_Data_IgnoreHeaderAfterWrite_Overwrite(t testing.TB) {
2029 const msg = "<html>this is HTML."
2030 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2031 w.Header().Set("foo", "proper value")
2032 io.WriteString(w, msg)
2033 w.Header().Set("foo", "should be ignored")
2034 return nil
2035 }, func(st *serverTester) {
2036 getSlash(st)
2037 st.wantHeaders(wantHeader{
2038 streamID: 1,
2039 endStream: false,
2040 header: http.Header{
2041 ":status": []string{"200"},
2042 "foo": []string{"proper value"},
2043 "content-type": []string{"text/html; charset=utf-8"},
2044 "content-length": []string{strconv.Itoa(len(msg))},
2045 },
2046 })
2047 })
2048 }
2049
2050 func TestServer_Response_Data_SniffLenType(t *testing.T) {
2051 synctestTest(t, testServer_Response_Data_SniffLenType)
2052 }
2053 func testServer_Response_Data_SniffLenType(t testing.TB) {
2054 const msg = "<html>this is HTML."
2055 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2056 io.WriteString(w, msg)
2057 return nil
2058 }, func(st *serverTester) {
2059 getSlash(st)
2060 st.wantHeaders(wantHeader{
2061 streamID: 1,
2062 endStream: false,
2063 header: http.Header{
2064 ":status": []string{"200"},
2065 "content-type": []string{"text/html; charset=utf-8"},
2066 "content-length": []string{strconv.Itoa(len(msg))},
2067 },
2068 })
2069 st.wantData(wantData{
2070 streamID: 1,
2071 endStream: true,
2072 data: []byte(msg),
2073 })
2074 })
2075 }
2076
2077 func TestServer_Response_Header_Flush_MidWrite(t *testing.T) {
2078 synctestTest(t, testServer_Response_Header_Flush_MidWrite)
2079 }
2080 func testServer_Response_Header_Flush_MidWrite(t testing.TB) {
2081 const msg = "<html>this is HTML"
2082 const msg2 = ", and this is the next chunk"
2083 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2084 io.WriteString(w, msg)
2085 w.(http.Flusher).Flush()
2086 io.WriteString(w, msg2)
2087 return nil
2088 }, func(st *serverTester) {
2089 getSlash(st)
2090 st.wantHeaders(wantHeader{
2091 streamID: 1,
2092 endStream: false,
2093 header: http.Header{
2094 ":status": []string{"200"},
2095 "content-type": []string{"text/html; charset=utf-8"},
2096
2097 },
2098 })
2099 st.wantData(wantData{
2100 streamID: 1,
2101 endStream: false,
2102 data: []byte(msg),
2103 })
2104 st.wantData(wantData{
2105 streamID: 1,
2106 endStream: true,
2107 data: []byte(msg2),
2108 })
2109 })
2110 }
2111
2112 func TestServer_Response_LargeWrite(t *testing.T) { synctestTest(t, testServer_Response_LargeWrite) }
2113 func testServer_Response_LargeWrite(t testing.TB) {
2114 const size = 1 << 20
2115 const maxFrameSize = 16 << 10
2116 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2117 n, err := w.Write(bytes.Repeat([]byte("a"), size))
2118 if err != nil {
2119 return fmt.Errorf("Write error: %v", err)
2120 }
2121 if n != size {
2122 return fmt.Errorf("wrong size %d from Write", n)
2123 }
2124 return nil
2125 }, func(st *serverTester) {
2126 if err := st.fr.WriteSettings(
2127 Setting{SettingInitialWindowSize, 0},
2128 Setting{SettingMaxFrameSize, maxFrameSize},
2129 ); err != nil {
2130 t.Fatal(err)
2131 }
2132 st.wantSettingsAck()
2133
2134 getSlash(st)
2135
2136
2137 if err := st.fr.WriteWindowUpdate(1, size); err != nil {
2138 t.Fatal(err)
2139 }
2140
2141
2142 if err := st.fr.WriteWindowUpdate(0, size); err != nil {
2143 t.Fatal(err)
2144 }
2145 st.wantHeaders(wantHeader{
2146 streamID: 1,
2147 endStream: false,
2148 header: http.Header{
2149 ":status": []string{"200"},
2150 "content-type": []string{"text/plain; charset=utf-8"},
2151
2152 },
2153 })
2154 var bytes, frames int
2155 for {
2156 df := readFrame[*DataFrame](t, st)
2157 bytes += len(df.Data())
2158 frames++
2159 for _, b := range df.Data() {
2160 if b != 'a' {
2161 t.Fatal("non-'a' byte seen in DATA")
2162 }
2163 }
2164 if df.StreamEnded() {
2165 break
2166 }
2167 }
2168 if bytes != size {
2169 t.Errorf("Got %d bytes; want %d", bytes, size)
2170 }
2171 if want := int(size / maxFrameSize); frames < want || frames > want*2 {
2172 t.Errorf("Got %d frames; want %d", frames, size)
2173 }
2174 })
2175 }
2176
2177
2178 func TestServer_Response_LargeWrite_FlowControlled(t *testing.T) {
2179 synctestTest(t, testServer_Response_LargeWrite_FlowControlled)
2180 }
2181 func testServer_Response_LargeWrite_FlowControlled(t testing.TB) {
2182
2183
2184 reads := []int{123, 1, 13, 127}
2185 size := 0
2186 for _, n := range reads {
2187 size += n
2188 }
2189
2190 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2191 w.(http.Flusher).Flush()
2192 n, err := w.Write(bytes.Repeat([]byte("a"), size))
2193 if err != nil {
2194 return fmt.Errorf("Write error: %v", err)
2195 }
2196 if n != size {
2197 return fmt.Errorf("wrong size %d from Write", n)
2198 }
2199 return nil
2200 }, func(st *serverTester) {
2201
2202
2203 if err := st.fr.WriteSettings(Setting{SettingInitialWindowSize, uint32(reads[0])}); err != nil {
2204 t.Fatal(err)
2205 }
2206 st.wantSettingsAck()
2207
2208 getSlash(st)
2209
2210 st.wantHeaders(wantHeader{
2211 streamID: 1,
2212 endStream: false,
2213 })
2214
2215 st.wantData(wantData{
2216 streamID: 1,
2217 endStream: false,
2218 size: reads[0],
2219 })
2220
2221 for i, quota := range reads[1:] {
2222 if err := st.fr.WriteWindowUpdate(1, uint32(quota)); err != nil {
2223 t.Fatal(err)
2224 }
2225 st.wantData(wantData{
2226 streamID: 1,
2227 endStream: i == len(reads[1:])-1,
2228 size: quota,
2229 })
2230 }
2231 })
2232 }
2233
2234
2235 func TestServer_Response_RST_Unblocks_LargeWrite(t *testing.T) {
2236 synctestTest(t, testServer_Response_RST_Unblocks_LargeWrite)
2237 }
2238 func testServer_Response_RST_Unblocks_LargeWrite(t testing.TB) {
2239 const size = 1 << 20
2240 const maxFrameSize = 16 << 10
2241 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2242 w.(http.Flusher).Flush()
2243 _, err := w.Write(bytes.Repeat([]byte("a"), size))
2244 if err == nil {
2245 return errors.New("unexpected nil error from Write in handler")
2246 }
2247 return nil
2248 }, func(st *serverTester) {
2249 if err := st.fr.WriteSettings(
2250 Setting{SettingInitialWindowSize, 0},
2251 Setting{SettingMaxFrameSize, maxFrameSize},
2252 ); err != nil {
2253 t.Fatal(err)
2254 }
2255 st.wantSettingsAck()
2256
2257 getSlash(st)
2258
2259 st.wantHeaders(wantHeader{
2260 streamID: 1,
2261 endStream: false,
2262 })
2263
2264 if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
2265 t.Fatal(err)
2266 }
2267 })
2268 }
2269
2270 func TestServer_Response_Empty_Data_Not_FlowControlled(t *testing.T) {
2271 synctestTest(t, testServer_Response_Empty_Data_Not_FlowControlled)
2272 }
2273 func testServer_Response_Empty_Data_Not_FlowControlled(t testing.TB) {
2274 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2275 w.(http.Flusher).Flush()
2276
2277 return nil
2278 }, func(st *serverTester) {
2279
2280 if err := st.fr.WriteSettings(Setting{SettingInitialWindowSize, 0}); err != nil {
2281 t.Fatal(err)
2282 }
2283 st.wantSettingsAck()
2284
2285 getSlash(st)
2286
2287 st.wantHeaders(wantHeader{
2288 streamID: 1,
2289 endStream: false,
2290 })
2291
2292 st.wantData(wantData{
2293 streamID: 1,
2294 endStream: true,
2295 size: 0,
2296 })
2297 })
2298 }
2299
2300 func TestServer_Response_Automatic100Continue(t *testing.T) {
2301 synctestTest(t, testServer_Response_Automatic100Continue)
2302 }
2303 func testServer_Response_Automatic100Continue(t testing.TB) {
2304 const msg = "foo"
2305 const reply = "bar"
2306 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2307 if v := r.Header.Get("Expect"); v != "" {
2308 t.Errorf("Expect header = %q; want empty", v)
2309 }
2310 buf := make([]byte, len(msg))
2311
2312 if n, err := io.ReadFull(r.Body, buf); err != nil || n != len(msg) || string(buf) != msg {
2313 return fmt.Errorf("ReadFull = %q, %v; want %q, nil", buf[:n], err, msg)
2314 }
2315 _, err := io.WriteString(w, reply)
2316 return err
2317 }, func(st *serverTester) {
2318 st.writeHeaders(HeadersFrameParam{
2319 StreamID: 1,
2320 BlockFragment: st.encodeHeader(":method", "POST", "expect", "100-Continue"),
2321 EndStream: false,
2322 EndHeaders: true,
2323 })
2324 st.wantHeaders(wantHeader{
2325 streamID: 1,
2326 endStream: false,
2327 header: http.Header{
2328 ":status": []string{"100"},
2329 },
2330 })
2331
2332
2333
2334 st.writeData(1, true, []byte(msg))
2335
2336 st.wantHeaders(wantHeader{
2337 streamID: 1,
2338 endStream: false,
2339 header: http.Header{
2340 ":status": []string{"200"},
2341 "content-type": []string{"text/plain; charset=utf-8"},
2342 "content-length": []string{strconv.Itoa(len(reply))},
2343 },
2344 })
2345
2346 st.wantData(wantData{
2347 streamID: 1,
2348 endStream: true,
2349 data: []byte(reply),
2350 })
2351 })
2352 }
2353
2354 func TestServer_HandlerWriteErrorOnDisconnect(t *testing.T) {
2355 synctestTest(t, testServer_HandlerWriteErrorOnDisconnect)
2356 }
2357 func testServer_HandlerWriteErrorOnDisconnect(t testing.TB) {
2358 errc := make(chan error, 1)
2359 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2360 p := []byte("some data.\n")
2361 for {
2362 _, err := w.Write(p)
2363 if err != nil {
2364 errc <- err
2365 return nil
2366 }
2367 }
2368 }, func(st *serverTester) {
2369 st.writeHeaders(HeadersFrameParam{
2370 StreamID: 1,
2371 BlockFragment: st.encodeHeader(),
2372 EndStream: false,
2373 EndHeaders: true,
2374 })
2375 st.wantHeaders(wantHeader{
2376 streamID: 1,
2377 endStream: false,
2378 })
2379
2380 st.cc.Close()
2381 _ = <-errc
2382 })
2383 }
2384
2385 func TestServer_Rejects_Too_Many_Streams(t *testing.T) {
2386 synctestTest(t, testServer_Rejects_Too_Many_Streams)
2387 }
2388 func testServer_Rejects_Too_Many_Streams(t testing.TB) {
2389 st := newServerTester(t, nil)
2390 st.greet()
2391 nextStreamID := uint32(1)
2392 streamID := func() uint32 {
2393 defer func() { nextStreamID += 2 }()
2394 return nextStreamID
2395 }
2396 sendReq := func(id uint32) {
2397 st.writeHeaders(HeadersFrameParam{
2398 StreamID: id,
2399 BlockFragment: st.encodeHeader(
2400 ":path", fmt.Sprintf("/%v", id),
2401 ),
2402 EndStream: true,
2403 EndHeaders: true,
2404 })
2405 }
2406 var calls []*serverHandlerCall
2407 for i := 0; i < DefaultMaxStreams; i++ {
2408 sendReq(streamID())
2409 calls = append(calls, st.nextHandlerCall())
2410 }
2411
2412
2413
2414
2415 rejectID := streamID()
2416 headerBlock := st.encodeHeader(":path", fmt.Sprintf("/%v", rejectID))
2417 frag1, frag2 := headerBlock[:3], headerBlock[3:]
2418 st.writeHeaders(HeadersFrameParam{
2419 StreamID: rejectID,
2420 BlockFragment: frag1,
2421 EndStream: true,
2422 EndHeaders: false,
2423 })
2424 if err := st.fr.WriteContinuation(rejectID, true, frag2); err != nil {
2425 t.Fatal(err)
2426 }
2427 st.sync()
2428 st.wantRSTStream(rejectID, ErrCodeProtocol)
2429
2430
2431 calls[0].exit()
2432 st.sync()
2433 st.wantHeaders(wantHeader{
2434 streamID: 1,
2435 endStream: true,
2436 })
2437
2438
2439 goodID := streamID()
2440 sendReq(goodID)
2441 call := st.nextHandlerCall()
2442 if got, want := call.req.URL.Path, fmt.Sprintf("/%d", goodID); got != want {
2443 t.Errorf("Got request for %q, want %q", got, want)
2444 }
2445 }
2446
2447
2448 func TestServer_Response_ManyHeaders_With_Continuation(t *testing.T) {
2449 synctestTest(t, testServer_Response_ManyHeaders_With_Continuation)
2450 }
2451 func testServer_Response_ManyHeaders_With_Continuation(t testing.TB) {
2452 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2453 h := w.Header()
2454 for i := 0; i < 5000; i++ {
2455 h.Set(fmt.Sprintf("x-header-%d", i), fmt.Sprintf("x-value-%d", i))
2456 }
2457 return nil
2458 }, func(st *serverTester) {
2459 getSlash(st)
2460 hf := readFrame[*HeadersFrame](t, st)
2461 if hf.HeadersEnded() {
2462 t.Fatal("got unwanted END_HEADERS flag")
2463 }
2464 n := 0
2465 for {
2466 n++
2467 cf := readFrame[*ContinuationFrame](t, st)
2468 if cf.HeadersEnded() {
2469 break
2470 }
2471 }
2472 if n < 5 {
2473 t.Errorf("Only got %d CONTINUATION frames; expected 5+ (currently 6)", n)
2474 }
2475 })
2476 }
2477
2478
2479
2480
2481
2482
2483
2484
2485 func TestServer_NoCrash_HandlerClose_Then_ClientClose(t *testing.T) {
2486 synctestTest(t, testServer_NoCrash_HandlerClose_Then_ClientClose)
2487 }
2488 func testServer_NoCrash_HandlerClose_Then_ClientClose(t testing.TB) {
2489 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2490
2491 return nil
2492 }, func(st *serverTester) {
2493 st.writeHeaders(HeadersFrameParam{
2494 StreamID: 1,
2495 BlockFragment: st.encodeHeader(),
2496 EndStream: false,
2497 EndHeaders: true,
2498 })
2499 st.wantHeaders(wantHeader{
2500 streamID: 1,
2501 endStream: true,
2502 })
2503
2504
2505
2506 st.wantRSTStream(1, ErrCodeNo)
2507
2508
2509
2510
2511
2512
2513 st.writeData(1, true, []byte("foo"))
2514
2515
2516
2517
2518
2519 st.wantRSTStream(1, ErrCodeStreamClosed)
2520
2521
2522
2523 st.wantConnFlowControlConsumed(0)
2524
2525
2526
2527 var (
2528 panMu sync.Mutex
2529 panicVal interface{}
2530 )
2531
2532 SetTestHookOnPanic(t, func(sc *ServerConn, pv interface{}) bool {
2533 panMu.Lock()
2534 panicVal = pv
2535 panMu.Unlock()
2536 return true
2537 })
2538
2539
2540 st.cc.Close()
2541 synctest.Wait()
2542
2543 panMu.Lock()
2544 got := panicVal
2545 panMu.Unlock()
2546 if got != nil {
2547 t.Errorf("Got panic: %v", got)
2548 }
2549 })
2550 }
2551
2552 func TestServer_Rejects_TLS10(t *testing.T) { testRejectTLS(t, tls.VersionTLS10) }
2553 func TestServer_Rejects_TLS11(t *testing.T) { testRejectTLS(t, tls.VersionTLS11) }
2554
2555 func testRejectTLS(t *testing.T, version uint16) {
2556 synctestTest(t, func(t testing.TB) {
2557 st := newServerTester(t, nil, func(state *tls.ConnectionState) {
2558
2559
2560
2561 state.Version = version
2562 })
2563 defer st.Close()
2564 st.wantGoAway(0, ErrCodeInadequateSecurity)
2565 })
2566 }
2567
2568 func TestServer_Rejects_TLSBadCipher(t *testing.T) { synctestTest(t, testServer_Rejects_TLSBadCipher) }
2569 func testServer_Rejects_TLSBadCipher(t testing.TB) {
2570 st := newServerTester(t, nil, func(state *tls.ConnectionState) {
2571 state.Version = tls.VersionTLS12
2572 state.CipherSuite = tls.TLS_RSA_WITH_RC4_128_SHA
2573 })
2574 defer st.Close()
2575 st.wantGoAway(0, ErrCodeInadequateSecurity)
2576 }
2577
2578 func TestServer_Advertises_Common_Cipher(t *testing.T) {
2579 synctestTest(t, testServer_Advertises_Common_Cipher)
2580 }
2581 func testServer_Advertises_Common_Cipher(t testing.TB) {
2582 ts := newTestServer(t, func(w http.ResponseWriter, r *http.Request) {
2583 }, func(srv *http.Server) {
2584
2585
2586 srv.TLSConfig = nil
2587 })
2588
2589
2590 const requiredSuite = tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
2591 tlsConfig := tlsConfigInsecure.Clone()
2592 tlsConfig.MaxVersion = tls.VersionTLS12
2593 tlsConfig.CipherSuites = []uint16{requiredSuite}
2594 tr := &http.Transport{
2595 TLSClientConfig: tlsConfig,
2596 Protocols: protocols("h2"),
2597 }
2598 defer tr.CloseIdleConnections()
2599
2600 req, err := http.NewRequest("GET", ts.URL, nil)
2601 if err != nil {
2602 t.Fatal(err)
2603 }
2604 res, err := tr.RoundTrip(req)
2605 if err != nil {
2606 t.Fatal(err)
2607 }
2608 res.Body.Close()
2609 }
2610
2611
2612
2613 func testServerResponse(t testing.TB,
2614 handler func(http.ResponseWriter, *http.Request) error,
2615 client func(*serverTester),
2616 ) {
2617 errc := make(chan error, 1)
2618 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
2619 if r.Body == nil {
2620 t.Fatal("nil Body")
2621 }
2622 err := handler(w, r)
2623 select {
2624 case errc <- err:
2625 default:
2626 t.Errorf("unexpected duplicate request")
2627 }
2628 })
2629 defer st.Close()
2630
2631 st.greet()
2632 client(st)
2633
2634 if err := <-errc; err != nil {
2635 t.Fatalf("Error in handler: %v", err)
2636 }
2637 }
2638
2639
2640
2641
2642 func readBodyHandler(t testing.TB, want string) func(w http.ResponseWriter, r *http.Request) {
2643 return func(w http.ResponseWriter, r *http.Request) {
2644 buf := make([]byte, len(want))
2645 _, err := io.ReadFull(r.Body, buf)
2646 if err != nil {
2647 t.Error(err)
2648 return
2649 }
2650 if string(buf) != want {
2651 t.Errorf("read %q; want %q", buf, want)
2652 }
2653 }
2654 }
2655
2656 func TestServer_MaxDecoderHeaderTableSize(t *testing.T) {
2657 synctestTest(t, testServer_MaxDecoderHeaderTableSize)
2658 }
2659 func testServer_MaxDecoderHeaderTableSize(t testing.TB) {
2660 wantHeaderTableSize := uint32(InitialHeaderTableSize * 2)
2661 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}, func(h2 *http.HTTP2Config) {
2662 h2.MaxDecoderHeaderTableSize = int(wantHeaderTableSize)
2663 })
2664 defer st.Close()
2665
2666 var advHeaderTableSize *uint32
2667 st.greetAndCheckSettings(func(s Setting) error {
2668 switch s.ID {
2669 case SettingHeaderTableSize:
2670 advHeaderTableSize = &s.Val
2671 }
2672 return nil
2673 })
2674
2675 if advHeaderTableSize == nil {
2676 t.Errorf("server didn't advertise a header table size")
2677 } else if got, want := *advHeaderTableSize, wantHeaderTableSize; got != want {
2678 t.Errorf("server advertised a header table size of %d, want %d", got, want)
2679 }
2680 }
2681
2682 func TestServer_MaxEncoderHeaderTableSize(t *testing.T) {
2683 synctestTest(t, testServer_MaxEncoderHeaderTableSize)
2684 }
2685 func testServer_MaxEncoderHeaderTableSize(t testing.TB) {
2686 wantHeaderTableSize := uint32(InitialHeaderTableSize / 2)
2687 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}, func(h2 *http.HTTP2Config) {
2688 h2.MaxEncoderHeaderTableSize = int(wantHeaderTableSize)
2689 })
2690 defer st.Close()
2691
2692 st.greet()
2693
2694 if got, want := st.sc.TestHPACKEncoder().MaxDynamicTableSize(), wantHeaderTableSize; got != want {
2695 t.Errorf("server encoder is using a header table size of %d, want %d", got, want)
2696 }
2697 }
2698
2699
2700 func TestServerDoS_MaxHeaderListSize(t *testing.T) { synctestTest(t, testServerDoS_MaxHeaderListSize) }
2701 func testServerDoS_MaxHeaderListSize(t testing.TB) {
2702 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {})
2703 defer st.Close()
2704
2705
2706 frameSize := DefaultMaxReadFrameSize
2707 var advHeaderListSize *uint32
2708 st.greetAndCheckSettings(func(s Setting) error {
2709 switch s.ID {
2710 case SettingMaxFrameSize:
2711 if s.Val < MinMaxFrameSize {
2712 frameSize = MinMaxFrameSize
2713 } else if s.Val > MaxFrameSize {
2714 frameSize = MaxFrameSize
2715 } else {
2716 frameSize = int(s.Val)
2717 }
2718 case SettingMaxHeaderListSize:
2719 advHeaderListSize = &s.Val
2720 }
2721 return nil
2722 })
2723
2724 if advHeaderListSize == nil {
2725 t.Errorf("server didn't advertise a max header list size")
2726 } else if *advHeaderListSize == 0 {
2727 t.Errorf("server advertised a max header list size of 0")
2728 }
2729
2730 st.encodeHeaderField(":method", "GET")
2731 st.encodeHeaderField(":path", "/")
2732 st.encodeHeaderField(":scheme", "https")
2733 cookie := strings.Repeat("*", 4058)
2734 st.encodeHeaderField("cookie", cookie)
2735 st.writeHeaders(HeadersFrameParam{
2736 StreamID: 1,
2737 BlockFragment: st.headerBuf.Bytes(),
2738 EndStream: true,
2739 EndHeaders: false,
2740 })
2741
2742
2743
2744 st.headerBuf.Reset()
2745 st.encodeHeaderField("cookie", cookie)
2746
2747
2748 const size = 1 << 20
2749 b := bytes.Repeat(st.headerBuf.Bytes(), size/st.headerBuf.Len())
2750 for len(b) > 0 {
2751 chunk := b
2752 if len(chunk) > frameSize {
2753 chunk = chunk[:frameSize]
2754 }
2755 b = b[len(chunk):]
2756 st.fr.WriteContinuation(1, len(b) == 0, chunk)
2757 }
2758
2759 st.wantHeaders(wantHeader{
2760 streamID: 1,
2761 endStream: false,
2762 header: http.Header{
2763 ":status": []string{"431"},
2764 "content-type": []string{"text/html; charset=utf-8"},
2765 "content-length": []string{"63"},
2766 },
2767 })
2768 }
2769
2770 func TestServer_Response_Stream_With_Missing_Trailer(t *testing.T) {
2771 synctestTest(t, testServer_Response_Stream_With_Missing_Trailer)
2772 }
2773 func testServer_Response_Stream_With_Missing_Trailer(t testing.TB) {
2774 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2775 w.Header().Set("Trailer", "test-trailer")
2776 return nil
2777 }, func(st *serverTester) {
2778 getSlash(st)
2779 st.wantHeaders(wantHeader{
2780 streamID: 1,
2781 endStream: false,
2782 })
2783 st.wantData(wantData{
2784 streamID: 1,
2785 endStream: true,
2786 size: 0,
2787 })
2788 })
2789 }
2790
2791 func TestCompressionErrorOnWrite(t *testing.T) { synctestTest(t, testCompressionErrorOnWrite) }
2792 func testCompressionErrorOnWrite(t testing.TB) {
2793 const maxStrLen = 8 << 10
2794 var serverConfig *http.Server
2795 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
2796
2797 }, func(s *http.Server) {
2798 serverConfig = s
2799 serverConfig.MaxHeaderBytes = maxStrLen
2800 })
2801 st.addLogFilter("connection error: COMPRESSION_ERROR")
2802 defer st.Close()
2803 st.greet()
2804
2805 maxAllowed := st.sc.TestFramerMaxHeaderStringLen()
2806
2807
2808
2809
2810
2811
2812 serverConfig.MaxHeaderBytes = 1 << 20
2813
2814
2815
2816
2817
2818 hbf := st.encodeHeader("foo", strings.Repeat("a", maxAllowed))
2819
2820 st.writeHeaders(HeadersFrameParam{
2821 StreamID: 1,
2822 BlockFragment: hbf,
2823 EndStream: true,
2824 EndHeaders: true,
2825 })
2826 st.wantHeaders(wantHeader{
2827 streamID: 1,
2828 endStream: false,
2829 header: http.Header{
2830 ":status": []string{"431"},
2831 "content-type": []string{"text/html; charset=utf-8"},
2832 "content-length": []string{"63"},
2833 },
2834 })
2835 df := readFrame[*DataFrame](t, st)
2836 if !strings.Contains(string(df.Data()), "HTTP Error 431") {
2837 t.Errorf("Unexpected data body: %q", df.Data())
2838 }
2839 if !df.StreamEnded() {
2840 t.Fatalf("expect data stream end")
2841 }
2842
2843
2844 hbf = st.encodeHeader("bar", strings.Repeat("b", maxAllowed+1))
2845 st.writeHeaders(HeadersFrameParam{
2846 StreamID: 3,
2847 BlockFragment: hbf,
2848 EndStream: true,
2849 EndHeaders: true,
2850 })
2851 st.wantGoAway(3, ErrCodeCompression)
2852 }
2853
2854 func TestCompressionErrorOnClose(t *testing.T) { synctestTest(t, testCompressionErrorOnClose) }
2855 func testCompressionErrorOnClose(t testing.TB) {
2856 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
2857
2858 })
2859 st.addLogFilter("connection error: COMPRESSION_ERROR")
2860 defer st.Close()
2861 st.greet()
2862
2863 hbf := st.encodeHeader("foo", "bar")
2864 hbf = hbf[:len(hbf)-1]
2865 st.writeHeaders(HeadersFrameParam{
2866 StreamID: 1,
2867 BlockFragment: hbf,
2868 EndStream: true,
2869 EndHeaders: true,
2870 })
2871 st.wantGoAway(1, ErrCodeCompression)
2872 }
2873
2874
2875 func TestServerReadsTrailers(t *testing.T) { synctestTest(t, testServerReadsTrailers) }
2876 func testServerReadsTrailers(t testing.TB) {
2877 const testBody = "some test body"
2878 writeReq := func(st *serverTester) {
2879 st.writeHeaders(HeadersFrameParam{
2880 StreamID: 1,
2881 BlockFragment: st.encodeHeader("trailer", "Foo, Bar", "trailer", "Baz"),
2882 EndStream: false,
2883 EndHeaders: true,
2884 })
2885 st.writeData(1, false, []byte(testBody))
2886 st.writeHeaders(HeadersFrameParam{
2887 StreamID: 1,
2888 BlockFragment: st.encodeHeaderRaw(
2889 "foo", "foov",
2890 "bar", "barv",
2891 "baz", "bazv",
2892 "surprise", "wasn't declared; shouldn't show up",
2893 ),
2894 EndStream: true,
2895 EndHeaders: true,
2896 })
2897 }
2898 checkReq := func(r *http.Request) {
2899 wantTrailer := http.Header{
2900 "Foo": nil,
2901 "Bar": nil,
2902 "Baz": nil,
2903 }
2904 if !reflect.DeepEqual(r.Trailer, wantTrailer) {
2905 t.Errorf("initial Trailer = %v; want %v", r.Trailer, wantTrailer)
2906 }
2907 slurp, err := io.ReadAll(r.Body)
2908 if string(slurp) != testBody {
2909 t.Errorf("read body %q; want %q", slurp, testBody)
2910 }
2911 if err != nil {
2912 t.Fatalf("Body slurp: %v", err)
2913 }
2914 wantTrailerAfter := http.Header{
2915 "Foo": {"foov"},
2916 "Bar": {"barv"},
2917 "Baz": {"bazv"},
2918 }
2919 if !reflect.DeepEqual(r.Trailer, wantTrailerAfter) {
2920 t.Errorf("final Trailer = %v; want %v", r.Trailer, wantTrailerAfter)
2921 }
2922 }
2923 testServerRequest(t, writeReq, checkReq)
2924 }
2925
2926
2927 func TestServerWritesTrailers_WithFlush(t *testing.T) {
2928 synctestTest(t, func(t testing.TB) {
2929 testServerWritesTrailers(t, true)
2930 })
2931 }
2932 func TestServerWritesTrailers_WithoutFlush(t *testing.T) {
2933 synctestTest(t, func(t testing.TB) {
2934 testServerWritesTrailers(t, false)
2935 })
2936 }
2937
2938 func testServerWritesTrailers(t testing.TB, withFlush bool) {
2939
2940 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
2941 w.Header().Set("Trailer", "Server-Trailer-A, Server-Trailer-B")
2942 w.Header().Add("Trailer", "Server-Trailer-C")
2943 w.Header().Add("Trailer", "Transfer-Encoding, Content-Length, Trailer")
2944
2945
2946 w.Header().Set("Foo", "Bar")
2947 w.Header().Set("Content-Length", "5")
2948
2949 io.WriteString(w, "Hello")
2950 if withFlush {
2951 w.(http.Flusher).Flush()
2952 }
2953 w.Header().Set("Server-Trailer-A", "valuea")
2954 w.Header().Set("Server-Trailer-C", "valuec")
2955
2956 w.Header().Set("Server-Surpise", "surprise! this isn't predeclared!")
2957
2958
2959
2960 w.Header().Set("Trailer:Post-Header-Trailer", "hi1")
2961 w.Header().Set("Trailer:post-header-trailer2", "hi2")
2962 w.Header().Set("Trailer:Range", "invalid")
2963 w.Header().Set("Trailer:Foo\x01Bogus", "invalid")
2964 w.Header().Set("Transfer-Encoding", "should not be included; Forbidden by RFC 7230 4.1.2")
2965 w.Header().Set("Content-Length", "should not be included; Forbidden by RFC 7230 4.1.2")
2966 w.Header().Set("Trailer", "should not be included; Forbidden by RFC 7230 4.1.2")
2967 return nil
2968 }, func(st *serverTester) {
2969
2970 st.h1server.ErrorLog = log.New(io.Discard, "", 0)
2971 getSlash(st)
2972 st.wantHeaders(wantHeader{
2973 streamID: 1,
2974 endStream: false,
2975 header: http.Header{
2976 ":status": []string{"200"},
2977 "foo": []string{"Bar"},
2978 "trailer": []string{
2979 "Server-Trailer-A, Server-Trailer-B",
2980 "Server-Trailer-C",
2981 "Transfer-Encoding, Content-Length, Trailer",
2982 },
2983 "content-type": []string{"text/plain; charset=utf-8"},
2984 "content-length": []string{"5"},
2985 },
2986 })
2987 st.wantData(wantData{
2988 streamID: 1,
2989 endStream: false,
2990 data: []byte("Hello"),
2991 })
2992 st.wantHeaders(wantHeader{
2993 streamID: 1,
2994 endStream: true,
2995 header: http.Header{
2996 "post-header-trailer": []string{"hi1"},
2997 "post-header-trailer2": []string{"hi2"},
2998 "server-trailer-a": []string{"valuea"},
2999 "server-trailer-c": []string{"valuec"},
3000 },
3001 })
3002 })
3003 }
3004
3005 func TestServerWritesUndeclaredTrailers(t *testing.T) {
3006 synctestTest(t, testServerWritesUndeclaredTrailers)
3007 }
3008 func testServerWritesUndeclaredTrailers(t testing.TB) {
3009 const trailer = "Trailer-Header"
3010 const value = "hi1"
3011 ts := newTestServer(t, func(w http.ResponseWriter, r *http.Request) {
3012 w.Header().Set(http.TrailerPrefix+trailer, value)
3013 })
3014
3015 tr := &http.Transport{
3016 TLSClientConfig: tlsConfigInsecure,
3017 Protocols: protocols("h2"),
3018 }
3019 defer tr.CloseIdleConnections()
3020
3021 cl := &http.Client{Transport: tr}
3022 resp, err := cl.Get(ts.URL)
3023 if err != nil {
3024 t.Fatal(err)
3025 }
3026 io.Copy(io.Discard, resp.Body)
3027 resp.Body.Close()
3028
3029 if got, want := resp.Trailer.Get(trailer), value; got != want {
3030 t.Errorf("trailer %v = %q, want %q", trailer, got, want)
3031 }
3032 }
3033
3034
3035
3036 func TestServerDoesntWriteInvalidHeaders(t *testing.T) {
3037 synctestTest(t, testServerDoesntWriteInvalidHeaders)
3038 }
3039 func testServerDoesntWriteInvalidHeaders(t testing.TB) {
3040 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
3041 w.Header().Add("OK1", "x")
3042 w.Header().Add("Bad:Colon", "x")
3043 w.Header().Add("Bad1\x00", "x")
3044 w.Header().Add("Bad2", "x\x00y")
3045 return nil
3046 }, func(st *serverTester) {
3047 getSlash(st)
3048 st.wantHeaders(wantHeader{
3049 streamID: 1,
3050 endStream: true,
3051 header: http.Header{
3052 ":status": []string{"200"},
3053 "ok1": []string{"x"},
3054 "content-length": []string{"0"},
3055 },
3056 })
3057 })
3058 }
3059
3060 func TestIssue53(t *testing.T) { synctestTest(t, testIssue53) }
3061 func testIssue53(t testing.TB) {
3062 const data = "PRI * HTTP/2.0\r\n\r\nSM" +
3063 "\r\n\r\n\x00\x00\x00\x01\ainfinfin\ad"
3064 st := newServerTester(t, func(w http.ResponseWriter, req *http.Request) {
3065 w.Write([]byte("hello"))
3066 })
3067
3068 st.cc.Write([]byte(data))
3069 st.wantFrameType(FrameSettings)
3070 st.wantFrameType(FrameWindowUpdate)
3071 st.wantFrameType(FrameGoAway)
3072 time.Sleep(GoAwayTimeout)
3073 st.wantClosed()
3074 }
3075
3076 func TestServerServeNoBannedCiphers(t *testing.T) {
3077 tests := []struct {
3078 name string
3079 tlsConfig *tls.Config
3080 wantErr string
3081 }{
3082 {
3083 name: "empty CipherSuites",
3084 tlsConfig: &tls.Config{},
3085 },
3086 {
3087 name: "bad CipherSuites but MinVersion TLS 1.3",
3088 tlsConfig: &tls.Config{
3089 MinVersion: tls.VersionTLS13,
3090 CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384},
3091 },
3092 },
3093 {
3094 name: "just the required cipher suite",
3095 tlsConfig: &tls.Config{
3096 CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
3097 },
3098 },
3099 {
3100 name: "just the alternative required cipher suite",
3101 tlsConfig: &tls.Config{
3102 CipherSuites: []uint16{tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
3103 },
3104 },
3105 {
3106 name: "missing required cipher suite",
3107 tlsConfig: &tls.Config{
3108 CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384},
3109 },
3110 wantErr: "is missing an HTTP/2-required",
3111 },
3112 {
3113 name: "required after bad",
3114 tlsConfig: &tls.Config{
3115 CipherSuites: []uint16{tls.TLS_RSA_WITH_RC4_128_SHA, tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
3116 },
3117 },
3118 {
3119 name: "bad after required",
3120 tlsConfig: &tls.Config{
3121 CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, tls.TLS_RSA_WITH_RC4_128_SHA},
3122 },
3123 },
3124 }
3125 for _, tt := range tests {
3126 tt.tlsConfig.Certificates = testServerTLSConfig.Certificates
3127
3128 srv := &http.Server{
3129 TLSConfig: tt.tlsConfig,
3130 Protocols: protocols("h2"),
3131 }
3132
3133 err := srv.ServeTLS(errListener{}, "", "")
3134 if (err != net.ErrClosed) != (tt.wantErr != "") {
3135 if tt.wantErr != "" {
3136 t.Errorf("%s: success, but want error", tt.name)
3137 } else {
3138 t.Errorf("%s: unexpected error: %v", tt.name, err)
3139 }
3140 }
3141 if err != nil && tt.wantErr != "" && !strings.Contains(err.Error(), tt.wantErr) {
3142 t.Errorf("%s: err = %v; want substring %q", tt.name, err, tt.wantErr)
3143 }
3144 if err == nil && !srv.TLSConfig.PreferServerCipherSuites {
3145 t.Errorf("%s: PreferServerCipherSuite is false; want true", tt.name)
3146 }
3147 }
3148 }
3149
3150 type errListener struct{}
3151
3152 func (li errListener) Accept() (net.Conn, error) { return nil, net.ErrClosed }
3153 func (li errListener) Close() error { return nil }
3154 func (li errListener) Addr() net.Addr { return nil }
3155
3156 func TestServerNoAutoContentLengthOnHead(t *testing.T) {
3157 synctestTest(t, testServerNoAutoContentLengthOnHead)
3158 }
3159 func testServerNoAutoContentLengthOnHead(t testing.TB) {
3160 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
3161
3162 })
3163 defer st.Close()
3164 st.greet()
3165 st.writeHeaders(HeadersFrameParam{
3166 StreamID: 1,
3167 BlockFragment: st.encodeHeader(":method", "HEAD"),
3168 EndStream: true,
3169 EndHeaders: true,
3170 })
3171 st.wantHeaders(wantHeader{
3172 streamID: 1,
3173 endStream: true,
3174 header: http.Header{
3175 ":status": []string{"200"},
3176 },
3177 })
3178 }
3179
3180
3181 func TestServerNoDuplicateContentType(t *testing.T) {
3182 synctestTest(t, testServerNoDuplicateContentType)
3183 }
3184 func testServerNoDuplicateContentType(t testing.TB) {
3185 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
3186 w.Header()["Content-Type"] = []string{""}
3187 fmt.Fprintf(w, "<html><head></head><body>hi</body></html>")
3188 })
3189 defer st.Close()
3190 st.greet()
3191 st.writeHeaders(HeadersFrameParam{
3192 StreamID: 1,
3193 BlockFragment: st.encodeHeader(),
3194 EndStream: true,
3195 EndHeaders: true,
3196 })
3197 st.wantHeaders(wantHeader{
3198 streamID: 1,
3199 endStream: false,
3200 header: http.Header{
3201 ":status": []string{"200"},
3202 "content-type": []string{""},
3203 "content-length": []string{"41"},
3204 },
3205 })
3206 }
3207
3208 func TestServerContentLengthCanBeDisabled(t *testing.T) {
3209 synctestTest(t, testServerContentLengthCanBeDisabled)
3210 }
3211 func testServerContentLengthCanBeDisabled(t testing.TB) {
3212 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
3213 w.Header()["Content-Length"] = nil
3214 fmt.Fprintf(w, "OK")
3215 })
3216 defer st.Close()
3217 st.greet()
3218 st.writeHeaders(HeadersFrameParam{
3219 StreamID: 1,
3220 BlockFragment: st.encodeHeader(),
3221 EndStream: true,
3222 EndHeaders: true,
3223 })
3224 st.wantHeaders(wantHeader{
3225 streamID: 1,
3226 endStream: false,
3227 header: http.Header{
3228 ":status": []string{"200"},
3229 "content-type": []string{"text/plain; charset=utf-8"},
3230 },
3231 })
3232 }
3233
3234
3235 func TestServer_Rejects_ConnHeaders(t *testing.T) { synctestTest(t, testServer_Rejects_ConnHeaders) }
3236 func testServer_Rejects_ConnHeaders(t testing.TB) {
3237 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
3238 t.Error("should not get to Handler")
3239 })
3240 defer st.Close()
3241 st.greet()
3242 st.bodylessReq1("connection", "foo")
3243 st.wantHeaders(wantHeader{
3244 streamID: 1,
3245 endStream: false,
3246 header: http.Header{
3247 ":status": []string{"400"},
3248 "content-type": []string{"text/plain; charset=utf-8"},
3249 "x-content-type-options": []string{"nosniff"},
3250 "content-length": []string{"51"},
3251 },
3252 })
3253 }
3254
3255 type hpackEncoder struct {
3256 enc *hpack.Encoder
3257 buf bytes.Buffer
3258 }
3259
3260 func (he *hpackEncoder) encodeHeaderRaw(t testing.TB, headers ...string) []byte {
3261 if len(headers)%2 == 1 {
3262 panic("odd number of kv args")
3263 }
3264 he.buf.Reset()
3265 if he.enc == nil {
3266 he.enc = hpack.NewEncoder(&he.buf)
3267 }
3268 for len(headers) > 0 {
3269 k, v := headers[0], headers[1]
3270 err := he.enc.WriteField(hpack.HeaderField{Name: k, Value: v})
3271 if err != nil {
3272 t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err)
3273 }
3274 headers = headers[2:]
3275 }
3276 return he.buf.Bytes()
3277 }
3278
3279
3280 func TestExpect100ContinueAfterHandlerWrites(t *testing.T) {
3281 synctestTest(t, testExpect100ContinueAfterHandlerWrites)
3282 }
3283 func testExpect100ContinueAfterHandlerWrites(t testing.TB) {
3284 const msg = "Hello"
3285 const msg2 = "World"
3286
3287 doRead := make(chan bool, 1)
3288 defer close(doRead)
3289
3290 ts := newTestServer(t, func(w http.ResponseWriter, r *http.Request) {
3291 io.WriteString(w, msg)
3292 w.(http.Flusher).Flush()
3293
3294
3295 <-doRead
3296 r.Body.Read(make([]byte, 10))
3297
3298 io.WriteString(w, msg2)
3299 })
3300
3301 tr := &http.Transport{
3302 TLSClientConfig: tlsConfigInsecure,
3303 Protocols: protocols("h2"),
3304 }
3305 defer tr.CloseIdleConnections()
3306
3307 req, _ := http.NewRequest("POST", ts.URL, io.LimitReader(neverEnding('A'), 2<<20))
3308 req.Header.Set("Expect", "100-continue")
3309
3310 res, err := tr.RoundTrip(req)
3311 if err != nil {
3312 t.Fatal(err)
3313 }
3314 defer res.Body.Close()
3315
3316 buf := make([]byte, len(msg))
3317 if _, err := io.ReadFull(res.Body, buf); err != nil {
3318 t.Fatal(err)
3319 }
3320 if string(buf) != msg {
3321 t.Fatalf("msg = %q; want %q", buf, msg)
3322 }
3323
3324 doRead <- true
3325
3326 if _, err := io.ReadFull(res.Body, buf); err != nil {
3327 t.Fatal(err)
3328 }
3329 if string(buf) != msg2 {
3330 t.Fatalf("second msg = %q; want %q", buf, msg2)
3331 }
3332 }
3333
3334 type funcReader func([]byte) (n int, err error)
3335
3336 func (f funcReader) Read(p []byte) (n int, err error) { return f(p) }
3337
3338
3339
3340 func TestUnreadFlowControlReturned_Server(t *testing.T) {
3341 for _, tt := range []struct {
3342 name string
3343 reqFn func(r *http.Request)
3344 }{
3345 {
3346 "body-open",
3347 func(r *http.Request) {},
3348 },
3349 {
3350 "body-closed",
3351 func(r *http.Request) {
3352 r.Body.Close()
3353 },
3354 },
3355 {
3356 "read-1-byte-and-close",
3357 func(r *http.Request) {
3358 b := make([]byte, 1)
3359 r.Body.Read(b)
3360 r.Body.Close()
3361 },
3362 },
3363 } {
3364 synctestSubtest(t, tt.name, func(t testing.TB) {
3365 unblock := make(chan bool, 1)
3366 defer close(unblock)
3367
3368 ts := newTestServer(t, func(w http.ResponseWriter, r *http.Request) {
3369
3370
3371
3372 tt.reqFn(r)
3373 <-unblock
3374 })
3375
3376 tr := &http.Transport{
3377 TLSClientConfig: tlsConfigInsecure,
3378 Protocols: protocols("h2"),
3379 }
3380 defer tr.CloseIdleConnections()
3381
3382
3383 iters := 100
3384 if testing.Short() {
3385 iters = 20
3386 }
3387 for i := 0; i < iters; i++ {
3388 body := io.MultiReader(
3389 io.LimitReader(neverEnding('A'), 16<<10),
3390 funcReader(func([]byte) (n int, err error) {
3391 unblock <- true
3392 return 0, io.EOF
3393 }),
3394 )
3395 req, _ := http.NewRequest("POST", ts.URL, body)
3396 res, err := tr.RoundTrip(req)
3397 if err != nil {
3398 t.Fatal(tt.name, err)
3399 }
3400 res.Body.Close()
3401 }
3402 })
3403 }
3404 }
3405
3406 func TestServerReturnsStreamAndConnFlowControlOnBodyClose(t *testing.T) {
3407 synctestTest(t, testServerReturnsStreamAndConnFlowControlOnBodyClose)
3408 }
3409 func testServerReturnsStreamAndConnFlowControlOnBodyClose(t testing.TB) {
3410 unblockHandler := make(chan struct{})
3411 defer close(unblockHandler)
3412
3413 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
3414 r.Body.Close()
3415 w.WriteHeader(200)
3416 w.(http.Flusher).Flush()
3417 <-unblockHandler
3418 })
3419 defer st.Close()
3420
3421 st.greet()
3422 st.writeHeaders(HeadersFrameParam{
3423 StreamID: 1,
3424 BlockFragment: st.encodeHeader(),
3425 EndHeaders: true,
3426 })
3427 st.wantHeaders(wantHeader{
3428 streamID: 1,
3429 endStream: false,
3430 })
3431 const size = InflowMinRefresh
3432 st.writeData(1, false, make([]byte, size))
3433 st.wantWindowUpdate(0, size)
3434 unblockHandler <- struct{}{}
3435 st.wantData(wantData{
3436 streamID: 1,
3437 endStream: true,
3438 })
3439 }
3440
3441 func TestServerIdleTimeout(t *testing.T) { synctestTest(t, testServerIdleTimeout) }
3442 func testServerIdleTimeout(t testing.TB) {
3443 if testing.Short() {
3444 t.Skip("skipping in short mode")
3445 }
3446
3447 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
3448 }, func(s *http.Server) {
3449 s.IdleTimeout = 500 * time.Millisecond
3450 })
3451 defer st.Close()
3452
3453 st.greet()
3454 st.advance(500 * time.Millisecond)
3455 st.wantGoAway(0, ErrCodeNo)
3456 }
3457
3458 func TestServerIdleTimeout_AfterRequest(t *testing.T) {
3459 synctestTest(t, testServerIdleTimeout_AfterRequest)
3460 }
3461 func testServerIdleTimeout_AfterRequest(t testing.TB) {
3462 if testing.Short() {
3463 t.Skip("skipping in short mode")
3464 }
3465 const (
3466 requestTimeout = 2 * time.Second
3467 idleTimeout = 1 * time.Second
3468 )
3469
3470 var st *serverTester
3471 st = newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
3472 time.Sleep(requestTimeout)
3473 }, func(s *http.Server) {
3474 s.IdleTimeout = idleTimeout
3475 })
3476 defer st.Close()
3477
3478 st.greet()
3479
3480
3481
3482 st.bodylessReq1()
3483 st.advance(requestTimeout)
3484 st.wantHeaders(wantHeader{
3485 streamID: 1,
3486 endStream: true,
3487 })
3488
3489
3490
3491 st.advance(idleTimeout)
3492 st.wantGoAway(1, ErrCodeNo)
3493 }
3494
3495
3496
3497
3498 func TestRequestBodyReadCloseRace(t *testing.T) { synctestTest(t, testRequestBodyReadCloseRace) }
3499 func testRequestBodyReadCloseRace(t testing.TB) {
3500 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
3501 go r.Body.Close()
3502 io.Copy(io.Discard, r.Body)
3503 })
3504 st.greet()
3505
3506 data := make([]byte, 1024)
3507 for i := range 100 {
3508 streamID := uint32(1 + (i * 2))
3509 st.writeHeaders(HeadersFrameParam{
3510 StreamID: streamID,
3511 BlockFragment: st.encodeHeader(),
3512 EndHeaders: true,
3513 })
3514 st.writeData(1, false, data)
3515
3516 for {
3517
3518
3519 fr := st.readFrame()
3520 if fr == nil {
3521 t.Fatalf("got no RSTStreamFrame, want one")
3522 }
3523 rst, ok := fr.(*RSTStreamFrame)
3524 if !ok {
3525 continue
3526 }
3527
3528 if rst.ErrCode != ErrCodeNo && rst.ErrCode != ErrCodeStreamClosed {
3529 t.Fatalf("got RSTStreamFrame with error code %v, want ErrCodeNo or ErrCodeStreamClosed", rst.ErrCode)
3530 }
3531 break
3532 }
3533 }
3534 }
3535
3536 func TestIssue20704Race(t *testing.T) { synctestTest(t, testIssue20704Race) }
3537 func testIssue20704Race(t testing.TB) {
3538 if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
3539 t.Skip("skipping in short mode")
3540 }
3541 const (
3542 itemSize = 1 << 10
3543 itemCount = 100
3544 )
3545
3546 ts := newTestServer(t, func(w http.ResponseWriter, r *http.Request) {
3547 for i := 0; i < itemCount; i++ {
3548 _, err := w.Write(make([]byte, itemSize))
3549 if err != nil {
3550 return
3551 }
3552 }
3553 })
3554
3555 tr := &http.Transport{
3556 TLSClientConfig: tlsConfigInsecure,
3557 Protocols: protocols("h2"),
3558 }
3559 defer tr.CloseIdleConnections()
3560 cl := &http.Client{Transport: tr}
3561
3562 for i := 0; i < 1000; i++ {
3563 resp, err := cl.Get(ts.URL)
3564 if err != nil {
3565 t.Fatal(err)
3566 }
3567
3568
3569 resp.Body.Close()
3570 }
3571 }
3572
3573 func TestServer_Rejects_TooSmall(t *testing.T) { synctestTest(t, testServer_Rejects_TooSmall) }
3574 func testServer_Rejects_TooSmall(t testing.TB) {
3575 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
3576 io.ReadAll(r.Body)
3577 return nil
3578 }, func(st *serverTester) {
3579 st.writeHeaders(HeadersFrameParam{
3580 StreamID: 1,
3581 BlockFragment: st.encodeHeader(
3582 ":method", "POST",
3583 "content-length", "4",
3584 ),
3585 EndStream: false,
3586 EndHeaders: true,
3587 })
3588 st.writeData(1, true, []byte("12345"))
3589 st.wantRSTStream(1, ErrCodeProtocol)
3590 st.wantConnFlowControlConsumed(0)
3591 })
3592 }
3593
3594
3595
3596 func TestServerHandlerConnectionClose(t *testing.T) {
3597 synctestTest(t, testServerHandlerConnectionClose)
3598 }
3599 func testServerHandlerConnectionClose(t testing.TB) {
3600 unblockHandler := make(chan bool, 1)
3601 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
3602 w.Header().Set("Connection", "close")
3603 w.Header().Set("Foo", "bar")
3604 w.(http.Flusher).Flush()
3605 <-unblockHandler
3606 return nil
3607 }, func(st *serverTester) {
3608 defer close(unblockHandler)
3609 st.writeHeaders(HeadersFrameParam{
3610 StreamID: 1,
3611 BlockFragment: st.encodeHeader(),
3612 EndStream: true,
3613 EndHeaders: true,
3614 })
3615 var sawGoAway bool
3616 var sawRes bool
3617 var sawWindowUpdate bool
3618 for {
3619 f := st.readFrame()
3620 if f == nil {
3621 break
3622 }
3623 switch f := f.(type) {
3624 case *GoAwayFrame:
3625 sawGoAway = true
3626 if f.LastStreamID != 1 || f.ErrCode != ErrCodeNo {
3627 t.Errorf("unexpected GOAWAY frame: %v", SummarizeFrame(f))
3628 }
3629
3630
3631 st.writeHeaders(HeadersFrameParam{
3632 StreamID: 3,
3633 BlockFragment: st.encodeHeader(),
3634 EndStream: false,
3635 EndHeaders: true,
3636 })
3637 st.fr.WriteRSTStream(3, ErrCodeCancel)
3638
3639
3640
3641 st.writeHeaders(HeadersFrameParam{
3642 StreamID: 5,
3643 BlockFragment: st.encodeHeader(),
3644 EndStream: false,
3645 EndHeaders: true,
3646 })
3647
3648 st.writeData(5, true, make([]byte, 1<<19))
3649 case *HeadersFrame:
3650 goth := st.decodeHeader(f.HeaderBlockFragment())
3651 wanth := [][2]string{
3652 {":status", "200"},
3653 {"foo", "bar"},
3654 }
3655 if !reflect.DeepEqual(goth, wanth) {
3656 t.Errorf("got headers %v; want %v", goth, wanth)
3657 }
3658 sawRes = true
3659 case *DataFrame:
3660 if f.StreamID != 1 || !f.StreamEnded() || len(f.Data()) != 0 {
3661 t.Errorf("unexpected DATA frame: %v", SummarizeFrame(f))
3662 }
3663 case *WindowUpdateFrame:
3664 if !sawGoAway {
3665 t.Errorf("unexpected WINDOW_UPDATE frame: %v", SummarizeFrame(f))
3666 return
3667 }
3668 if f.StreamID != 0 {
3669 st.t.Fatalf("WindowUpdate StreamID = %d; want 5", f.FrameHeader.StreamID)
3670 return
3671 }
3672 sawWindowUpdate = true
3673 unblockHandler <- true
3674 st.sync()
3675 st.advance(GoAwayTimeout)
3676 default:
3677 t.Logf("unexpected frame: %v", SummarizeFrame(f))
3678 }
3679 }
3680 if !sawGoAway {
3681 t.Errorf("didn't see GOAWAY")
3682 }
3683 if !sawRes {
3684 t.Errorf("didn't see response")
3685 }
3686 if !sawWindowUpdate {
3687 t.Errorf("didn't see WINDOW_UPDATE")
3688 }
3689 })
3690 }
3691
3692 func TestServer_Headers_HalfCloseRemote(t *testing.T) {
3693 synctestTest(t, testServer_Headers_HalfCloseRemote)
3694 }
3695 func testServer_Headers_HalfCloseRemote(t testing.TB) {
3696 var st *serverTester
3697 writeData := make(chan bool)
3698 writeHeaders := make(chan bool)
3699 leaveHandler := make(chan bool)
3700 st = newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
3701 if !st.streamExists(1) {
3702 t.Errorf("stream 1 does not exist in handler")
3703 }
3704 if got, want := st.streamState(1), StateOpen; got != want {
3705 t.Errorf("in handler, state is %v; want %v", got, want)
3706 }
3707 writeData <- true
3708 if n, err := r.Body.Read(make([]byte, 1)); n != 0 || err != io.EOF {
3709 t.Errorf("body read = %d, %v; want 0, EOF", n, err)
3710 }
3711 if got, want := st.streamState(1), StateHalfClosedRemote; got != want {
3712 t.Errorf("in handler, state is %v; want %v", got, want)
3713 }
3714 writeHeaders <- true
3715
3716 <-leaveHandler
3717 })
3718 st.greet()
3719
3720 st.writeHeaders(HeadersFrameParam{
3721 StreamID: 1,
3722 BlockFragment: st.encodeHeader(),
3723 EndStream: false,
3724 EndHeaders: true,
3725 })
3726 <-writeData
3727 st.writeData(1, true, nil)
3728
3729 <-writeHeaders
3730
3731 st.writeHeaders(HeadersFrameParam{
3732 StreamID: 1,
3733 BlockFragment: st.encodeHeader(),
3734 EndStream: false,
3735 EndHeaders: true,
3736 })
3737
3738 defer close(leaveHandler)
3739
3740 st.wantRSTStream(1, ErrCodeStreamClosed)
3741 }
3742
3743 func TestServerGracefulShutdown(t *testing.T) { synctestTest(t, testServerGracefulShutdown) }
3744 func testServerGracefulShutdown(t testing.TB) {
3745 handlerDone := make(chan struct{})
3746 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
3747 <-handlerDone
3748 w.Header().Set("x-foo", "bar")
3749 })
3750 defer st.Close()
3751
3752 st.greet()
3753 st.bodylessReq1()
3754
3755 st.sync()
3756
3757 shutdownc := make(chan struct{})
3758 go func() {
3759 defer close(shutdownc)
3760 st.h1server.Shutdown(context.Background())
3761 }()
3762
3763 st.wantGoAway(1, ErrCodeNo)
3764
3765 close(handlerDone)
3766 st.sync()
3767
3768 st.wantHeaders(wantHeader{
3769 streamID: 1,
3770 endStream: true,
3771 header: http.Header{
3772 ":status": []string{"200"},
3773 "x-foo": []string{"bar"},
3774 "content-length": []string{"0"},
3775 },
3776 })
3777
3778 n, err := st.cc.Read([]byte{0})
3779 if n != 0 || err == nil {
3780 t.Errorf("Read = %v, %v; want 0, non-nil", n, err)
3781 }
3782
3783
3784 <-shutdownc
3785 }
3786
3787
3788 func TestContentEncodingNoSniffing(t *testing.T) {
3789 type resp struct {
3790 name string
3791 body []byte
3792
3793
3794
3795 contentEncoding interface{}
3796 wantContentType string
3797 }
3798
3799 resps := []*resp{
3800 {
3801 name: "gzip content-encoding, gzipped",
3802 contentEncoding: "application/gzip",
3803 wantContentType: "",
3804 body: func() []byte {
3805 buf := new(bytes.Buffer)
3806 gzw := gzip.NewWriter(buf)
3807 gzw.Write([]byte("doctype html><p>Hello</p>"))
3808 gzw.Close()
3809 return buf.Bytes()
3810 }(),
3811 },
3812 {
3813 name: "zlib content-encoding, zlibbed",
3814 contentEncoding: "application/zlib",
3815 wantContentType: "",
3816 body: func() []byte {
3817 buf := new(bytes.Buffer)
3818 zw := zlib.NewWriter(buf)
3819 zw.Write([]byte("doctype html><p>Hello</p>"))
3820 zw.Close()
3821 return buf.Bytes()
3822 }(),
3823 },
3824 {
3825 name: "no content-encoding",
3826 wantContentType: "application/x-gzip",
3827 body: func() []byte {
3828 buf := new(bytes.Buffer)
3829 gzw := gzip.NewWriter(buf)
3830 gzw.Write([]byte("doctype html><p>Hello</p>"))
3831 gzw.Close()
3832 return buf.Bytes()
3833 }(),
3834 },
3835 {
3836 name: "phony content-encoding",
3837 contentEncoding: "foo/bar",
3838 body: []byte("doctype html><p>Hello</p>"),
3839 },
3840 {
3841 name: "empty but set content-encoding",
3842 contentEncoding: "",
3843 wantContentType: "audio/mpeg",
3844 body: []byte("ID3"),
3845 },
3846 }
3847
3848 for _, tt := range resps {
3849 synctestSubtest(t, tt.name, func(t testing.TB) {
3850 ts := newTestServer(t, func(w http.ResponseWriter, r *http.Request) {
3851 if tt.contentEncoding != nil {
3852 w.Header().Set("Content-Encoding", tt.contentEncoding.(string))
3853 }
3854 w.Write(tt.body)
3855 })
3856
3857 tr := &http.Transport{
3858 TLSClientConfig: tlsConfigInsecure,
3859 Protocols: protocols("h2"),
3860 }
3861 defer tr.CloseIdleConnections()
3862
3863 req, _ := http.NewRequest("GET", ts.URL, nil)
3864 res, err := tr.RoundTrip(req)
3865 if err != nil {
3866 t.Fatalf("GET %s: %v", ts.URL, err)
3867 }
3868 defer res.Body.Close()
3869
3870 g := res.Header.Get("Content-Encoding")
3871 t.Logf("%s: Content-Encoding: %s", ts.URL, g)
3872
3873 if w := tt.contentEncoding; g != w {
3874 if w != nil {
3875 t.Errorf("Content-Encoding mismatch\n\tgot: %q\n\twant: %q", g, w)
3876 } else if g != "" {
3877 t.Errorf("Unexpected Content-Encoding %q", g)
3878 }
3879 }
3880
3881 g = res.Header.Get("Content-Type")
3882 if w := tt.wantContentType; g != w {
3883 t.Errorf("Content-Type mismatch\n\tgot: %q\n\twant: %q", g, w)
3884 }
3885 t.Logf("%s: Content-Type: %s", ts.URL, g)
3886 })
3887 }
3888 }
3889
3890 func TestServerWindowUpdateOnBodyClose(t *testing.T) {
3891 synctestTest(t, testServerWindowUpdateOnBodyClose)
3892 }
3893 func testServerWindowUpdateOnBodyClose(t testing.TB) {
3894 const windowSize = 65535 * 2
3895 content := make([]byte, windowSize)
3896 errc := make(chan error)
3897 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
3898 buf := make([]byte, 4)
3899 n, err := io.ReadFull(r.Body, buf)
3900 if err != nil {
3901 errc <- err
3902 return
3903 }
3904 if n != len(buf) {
3905 errc <- fmt.Errorf("too few bytes read: %d", n)
3906 return
3907 }
3908 r.Body.Close()
3909 errc <- nil
3910 }, func(h2 *http.HTTP2Config) {
3911 h2.MaxReceiveBufferPerConnection = windowSize
3912 h2.MaxReceiveBufferPerStream = windowSize
3913 })
3914 defer st.Close()
3915
3916 st.greet()
3917 st.writeHeaders(HeadersFrameParam{
3918 StreamID: 1,
3919 BlockFragment: st.encodeHeader(
3920 ":method", "POST",
3921 "content-length", strconv.Itoa(len(content)),
3922 ),
3923 EndStream: false,
3924 EndHeaders: true,
3925 })
3926 st.writeData(1, false, content[:windowSize/2])
3927 if err := <-errc; err != nil {
3928 t.Fatal(err)
3929 }
3930
3931
3932 increments := windowSize / 2
3933 for {
3934 f := st.readFrame()
3935 if f == nil {
3936 break
3937 }
3938 if wu, ok := f.(*WindowUpdateFrame); ok && wu.StreamID == 0 {
3939 increments -= int(wu.Increment)
3940 if increments == 0 {
3941 break
3942 }
3943 }
3944 }
3945
3946
3947 st.writeData(1, false, content[windowSize/2:])
3948 st.wantWindowUpdate(0, windowSize/2)
3949 }
3950
3951 func TestNoErrorLoggedOnPostAfterGOAWAY(t *testing.T) {
3952 synctestTest(t, testNoErrorLoggedOnPostAfterGOAWAY)
3953 }
3954 func testNoErrorLoggedOnPostAfterGOAWAY(t testing.TB) {
3955 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {})
3956 defer st.Close()
3957
3958 st.greet()
3959
3960 content := "some content"
3961 st.writeHeaders(HeadersFrameParam{
3962 StreamID: 1,
3963 BlockFragment: st.encodeHeader(
3964 ":method", "POST",
3965 "content-length", strconv.Itoa(len(content)),
3966 ),
3967 EndStream: false,
3968 EndHeaders: true,
3969 })
3970 st.wantHeaders(wantHeader{
3971 streamID: 1,
3972 endStream: true,
3973 })
3974
3975 st.sc.StartGracefulShutdown()
3976 st.wantRSTStream(1, ErrCodeNo)
3977 st.wantGoAway(1, ErrCodeNo)
3978
3979 st.writeData(1, true, []byte(content))
3980 st.Close()
3981
3982 if bytes.Contains(st.serverLogBuf.Bytes(), []byte("PROTOCOL_ERROR")) {
3983 t.Error("got protocol error")
3984 }
3985 }
3986
3987 func TestServerSendsProcessing(t *testing.T) { synctestTest(t, testServerSendsProcessing) }
3988 func testServerSendsProcessing(t testing.TB) {
3989 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
3990 w.WriteHeader(http.StatusProcessing)
3991 w.Write([]byte("stuff"))
3992
3993 return nil
3994 }, func(st *serverTester) {
3995 getSlash(st)
3996 st.wantHeaders(wantHeader{
3997 streamID: 1,
3998 endStream: false,
3999 header: http.Header{
4000 ":status": []string{"102"},
4001 },
4002 })
4003 st.wantHeaders(wantHeader{
4004 streamID: 1,
4005 endStream: false,
4006 header: http.Header{
4007 ":status": []string{"200"},
4008 "content-type": []string{"text/plain; charset=utf-8"},
4009 "content-length": []string{"5"},
4010 },
4011 })
4012 })
4013 }
4014
4015 func TestServerSendsEarlyHints(t *testing.T) { synctestTest(t, testServerSendsEarlyHints) }
4016 func testServerSendsEarlyHints(t testing.TB) {
4017 testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
4018 h := w.Header()
4019 h.Add("Content-Length", "123")
4020 h.Add("Link", "</style.css>; rel=preload; as=style")
4021 h.Add("Link", "</script.js>; rel=preload; as=script")
4022 w.WriteHeader(http.StatusEarlyHints)
4023
4024 h.Add("Link", "</foo.js>; rel=preload; as=script")
4025 w.WriteHeader(http.StatusEarlyHints)
4026
4027 w.Write([]byte("stuff"))
4028
4029 return nil
4030 }, func(st *serverTester) {
4031 getSlash(st)
4032 st.wantHeaders(wantHeader{
4033 streamID: 1,
4034 endStream: false,
4035 header: http.Header{
4036 ":status": []string{"103"},
4037 "link": []string{
4038 "</style.css>; rel=preload; as=style",
4039 "</script.js>; rel=preload; as=script",
4040 },
4041 },
4042 })
4043 st.wantHeaders(wantHeader{
4044 streamID: 1,
4045 endStream: false,
4046 header: http.Header{
4047 ":status": []string{"103"},
4048 "link": []string{
4049 "</style.css>; rel=preload; as=style",
4050 "</script.js>; rel=preload; as=script",
4051 "</foo.js>; rel=preload; as=script",
4052 },
4053 },
4054 })
4055 st.wantHeaders(wantHeader{
4056 streamID: 1,
4057 endStream: false,
4058 header: http.Header{
4059 ":status": []string{"200"},
4060 "link": []string{
4061 "</style.css>; rel=preload; as=style",
4062 "</script.js>; rel=preload; as=script",
4063 "</foo.js>; rel=preload; as=script",
4064 },
4065 "content-type": []string{"text/plain; charset=utf-8"},
4066 "content-length": []string{"123"},
4067 },
4068 })
4069 })
4070 }
4071
4072 func TestProtocolErrorAfterGoAway(t *testing.T) { synctestTest(t, testProtocolErrorAfterGoAway) }
4073 func testProtocolErrorAfterGoAway(t testing.TB) {
4074 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
4075 io.Copy(io.Discard, r.Body)
4076 })
4077 defer st.Close()
4078
4079 st.greet()
4080 content := "some content"
4081 st.writeHeaders(HeadersFrameParam{
4082 StreamID: 1,
4083 BlockFragment: st.encodeHeader(
4084 ":method", "POST",
4085 "content-length", strconv.Itoa(len(content)),
4086 ),
4087 EndStream: false,
4088 EndHeaders: true,
4089 })
4090 st.writeData(1, false, []byte(content[:5]))
4091
4092
4093
4094 if err := st.fr.WriteGoAway(1, ErrCodeNo, nil); err != nil {
4095 t.Fatal(err)
4096 }
4097 if err := st.fr.WriteWindowUpdate(0, 1<<31-1); err != nil {
4098 t.Fatal(err)
4099 }
4100
4101 st.advance(GoAwayTimeout)
4102 st.wantGoAway(1, ErrCodeNo)
4103 st.wantClosed()
4104 }
4105
4106 func TestServerInitialFlowControlWindow(t *testing.T) {
4107 for _, want := range []int32{
4108 65535,
4109 1 << 19,
4110 1 << 21,
4111
4112
4113
4114
4115
4116 65535 * 2,
4117 } {
4118 synctestSubtest(t, fmt.Sprint(want), func(t testing.TB) {
4119
4120 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
4121 }, func(h2 *http.HTTP2Config) {
4122 h2.MaxReceiveBufferPerConnection = int(want)
4123 })
4124 st.writePreface()
4125 st.writeSettings()
4126 _ = readFrame[*SettingsFrame](t, st)
4127 st.writeSettingsAck()
4128 st.writeHeaders(HeadersFrameParam{
4129 StreamID: 1,
4130 BlockFragment: st.encodeHeader(),
4131 EndStream: true,
4132 EndHeaders: true,
4133 })
4134 window := 65535
4135 Frames:
4136 for {
4137 f := st.readFrame()
4138 switch f := f.(type) {
4139 case *WindowUpdateFrame:
4140 if f.FrameHeader.StreamID != 0 {
4141 t.Errorf("WindowUpdate StreamID = %d; want 0", f.FrameHeader.StreamID)
4142 return
4143 }
4144 window += int(f.Increment)
4145 case *HeadersFrame:
4146 break Frames
4147 case nil:
4148 break Frames
4149 default:
4150 }
4151 }
4152 if window != int(want) {
4153 t.Errorf("got initial flow control window = %v, want %v", window, want)
4154 }
4155 })
4156 }
4157 }
4158
4159
4160
4161
4162
4163
4164 func TestServerWriteDoesNotRetainBufferAfterReturn(t *testing.T) {
4165 synctestTest(t, testServerWriteDoesNotRetainBufferAfterReturn)
4166 }
4167 func testServerWriteDoesNotRetainBufferAfterReturn(t testing.TB) {
4168 donec := make(chan struct{})
4169 ts := newTestServer(t, func(w http.ResponseWriter, r *http.Request) {
4170 defer close(donec)
4171 buf := make([]byte, 1<<20)
4172 var i byte
4173 for {
4174 i++
4175 _, err := w.Write(buf)
4176 for j := range buf {
4177 buf[j] = byte(i)
4178 }
4179 if err != nil {
4180 return
4181 }
4182 }
4183 })
4184
4185 tr := &http.Transport{
4186 TLSClientConfig: tlsConfigInsecure,
4187 Protocols: protocols("h2"),
4188 }
4189 defer tr.CloseIdleConnections()
4190
4191 req, _ := http.NewRequest("GET", ts.URL, nil)
4192 res, err := tr.RoundTrip(req)
4193 if err != nil {
4194 t.Fatal(err)
4195 }
4196 res.Body.Close()
4197 <-donec
4198 }
4199
4200
4201
4202
4203
4204
4205 func TestServerWriteDoesNotRetainBufferAfterServerClose(t *testing.T) {
4206 synctestTest(t, testServerWriteDoesNotRetainBufferAfterServerClose)
4207 }
4208 func testServerWriteDoesNotRetainBufferAfterServerClose(t testing.TB) {
4209 donec := make(chan struct{}, 1)
4210 ts := newTestServer(t, func(w http.ResponseWriter, r *http.Request) {
4211 donec <- struct{}{}
4212 defer close(donec)
4213 buf := make([]byte, 1<<20)
4214 var i byte
4215 for {
4216 i++
4217 _, err := w.Write(buf)
4218 for j := range buf {
4219 buf[j] = byte(i)
4220 }
4221 if err != nil {
4222 return
4223 }
4224 }
4225 })
4226
4227 tr := &http.Transport{
4228 TLSClientConfig: tlsConfigInsecure,
4229 Protocols: protocols("h2"),
4230 }
4231 defer tr.CloseIdleConnections()
4232
4233 req, _ := http.NewRequest("GET", ts.URL, nil)
4234 res, err := tr.RoundTrip(req)
4235 if err != nil {
4236 t.Fatal(err)
4237 }
4238 defer res.Body.Close()
4239 <-donec
4240 ts.Config.Close()
4241 <-donec
4242 }
4243
4244 func TestServerMaxHandlerGoroutines(t *testing.T) { synctestTest(t, testServerMaxHandlerGoroutines) }
4245 func testServerMaxHandlerGoroutines(t testing.TB) {
4246 const maxHandlers = 10
4247 handlerc := make(chan chan bool)
4248 donec := make(chan struct{})
4249 defer close(donec)
4250 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
4251 stopc := make(chan bool, 1)
4252 select {
4253 case handlerc <- stopc:
4254 case <-donec:
4255 }
4256 select {
4257 case shouldPanic := <-stopc:
4258 if shouldPanic {
4259 panic(http.ErrAbortHandler)
4260 }
4261 case <-donec:
4262 }
4263 }, func(h2 *http.HTTP2Config) {
4264 h2.MaxConcurrentStreams = maxHandlers
4265 })
4266 defer st.Close()
4267
4268 st.greet()
4269
4270
4271
4272 var stops []chan bool
4273 streamID := uint32(1)
4274 for i := 0; i < maxHandlers; i++ {
4275 st.writeHeaders(HeadersFrameParam{
4276 StreamID: streamID,
4277 BlockFragment: st.encodeHeader(),
4278 EndStream: true,
4279 EndHeaders: true,
4280 })
4281 stops = append(stops, <-handlerc)
4282 st.fr.WriteRSTStream(streamID, ErrCodeCancel)
4283 streamID += 2
4284 }
4285
4286
4287 st.writeHeaders(HeadersFrameParam{
4288 StreamID: streamID,
4289 BlockFragment: st.encodeHeader(),
4290 EndStream: true,
4291 EndHeaders: true,
4292 })
4293 st.fr.WriteRSTStream(streamID, ErrCodeCancel)
4294 streamID += 2
4295
4296
4297 for i := 0; i < 2; i++ {
4298 st.writeHeaders(HeadersFrameParam{
4299 StreamID: streamID,
4300 BlockFragment: st.encodeHeader(),
4301 EndStream: true,
4302 EndHeaders: true,
4303 })
4304 streamID += 2
4305 }
4306
4307
4308
4309 select {
4310 case <-handlerc:
4311 t.Errorf("handler unexpectedly started while maxHandlers are already running")
4312 case <-time.After(1 * time.Millisecond):
4313 }
4314
4315
4316
4317 stops[0] <- false
4318 stops[1] <- true
4319 stops = stops[2:]
4320 stops = append(stops, <-handlerc)
4321 stops = append(stops, <-handlerc)
4322
4323
4324
4325 for i := 0; i < 5*maxHandlers; i++ {
4326 st.writeHeaders(HeadersFrameParam{
4327 StreamID: streamID,
4328 BlockFragment: st.encodeHeader(),
4329 EndStream: true,
4330 EndHeaders: true,
4331 })
4332 st.fr.WriteRSTStream(streamID, ErrCodeCancel)
4333 streamID += 2
4334 }
4335 fr := readFrame[*GoAwayFrame](t, st)
4336 if fr.ErrCode != ErrCodeEnhanceYourCalm {
4337 t.Errorf("err code = %v; want %v", fr.ErrCode, ErrCodeEnhanceYourCalm)
4338 }
4339
4340 for _, s := range stops {
4341 close(s)
4342 }
4343 }
4344
4345 func TestServerContinuationFlood(t *testing.T) { synctestTest(t, testServerContinuationFlood) }
4346 func testServerContinuationFlood(t testing.TB) {
4347 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
4348 fmt.Println(r.Header)
4349 }, func(s *http.Server) {
4350 s.MaxHeaderBytes = 4096
4351 })
4352 defer st.Close()
4353
4354 st.greet()
4355
4356 st.writeHeaders(HeadersFrameParam{
4357 StreamID: 1,
4358 BlockFragment: st.encodeHeader(),
4359 EndStream: true,
4360 })
4361 for i := 0; i < 1000; i++ {
4362 st.fr.WriteContinuation(1, false, st.encodeHeaderRaw(
4363 fmt.Sprintf("x-%v", i), "1234567890",
4364 ))
4365 }
4366 st.fr.WriteContinuation(1, true, st.encodeHeaderRaw(
4367 "x-last-header", "1",
4368 ))
4369
4370 for {
4371 f := st.readFrame()
4372 if f == nil {
4373 break
4374 }
4375 switch f := f.(type) {
4376 case *HeadersFrame:
4377 t.Fatalf("received HEADERS frame; want GOAWAY and a closed connection")
4378 case *GoAwayFrame:
4379
4380
4381
4382 if got, want := f.LastStreamID, uint32(1); got != want {
4383 t.Errorf("received GOAWAY with LastStreamId %v, want %v", got, want)
4384 }
4385
4386 }
4387 }
4388
4389
4390
4391
4392
4393
4394
4395
4396 }
4397
4398 func TestServerContinuationAfterInvalidHeader(t *testing.T) {
4399 synctestTest(t, testServerContinuationAfterInvalidHeader)
4400 }
4401 func testServerContinuationAfterInvalidHeader(t testing.TB) {
4402 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
4403 fmt.Println(r.Header)
4404 })
4405 defer st.Close()
4406
4407 st.greet()
4408
4409 st.writeHeaders(HeadersFrameParam{
4410 StreamID: 1,
4411 BlockFragment: st.encodeHeader(),
4412 EndStream: true,
4413 })
4414 st.fr.WriteContinuation(1, false, st.encodeHeaderRaw(
4415 "x-invalid-header", "\x00",
4416 ))
4417 st.fr.WriteContinuation(1, true, st.encodeHeaderRaw(
4418 "x-valid-header", "1",
4419 ))
4420
4421 var sawGoAway bool
4422 for {
4423 f := st.readFrame()
4424 if f == nil {
4425 break
4426 }
4427 switch f.(type) {
4428 case *GoAwayFrame:
4429 sawGoAway = true
4430 case *HeadersFrame:
4431 t.Fatalf("received HEADERS frame; want GOAWAY")
4432 }
4433 }
4434 if !sawGoAway {
4435 t.Errorf("connection closed with no GOAWAY frame; want one")
4436 }
4437 }
4438
4439
4440 func TestServerRequestCancelOnError(t *testing.T) { synctestTest(t, testServerRequestCancelOnError) }
4441 func testServerRequestCancelOnError(t testing.TB) {
4442 recvc := make(chan struct{})
4443 donec := make(chan struct{})
4444 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
4445 close(recvc)
4446 <-r.Context().Done()
4447 close(donec)
4448 })
4449 defer st.Close()
4450
4451 st.greet()
4452
4453
4454 st.writeHeaders(HeadersFrameParam{
4455 StreamID: 1,
4456 BlockFragment: st.encodeHeader(),
4457 EndStream: true,
4458 EndHeaders: true,
4459 })
4460 <-recvc
4461
4462
4463
4464
4465 st.writeHeaders(HeadersFrameParam{
4466 StreamID: 1,
4467 BlockFragment: st.encodeHeader(),
4468 EndStream: true,
4469 EndHeaders: true,
4470 })
4471 <-donec
4472 }
4473
4474 func TestServerSetReadWriteDeadlineRace(t *testing.T) {
4475 synctestTest(t, testServerSetReadWriteDeadlineRace)
4476 }
4477 func testServerSetReadWriteDeadlineRace(t testing.TB) {
4478 ts := newTestServer(t, func(w http.ResponseWriter, r *http.Request) {
4479 ctl := http.NewResponseController(w)
4480 ctl.SetReadDeadline(time.Now().Add(3600 * time.Second))
4481 ctl.SetWriteDeadline(time.Now().Add(3600 * time.Second))
4482 })
4483 resp, err := ts.Client().Get(ts.URL)
4484 if err != nil {
4485 t.Fatal(err)
4486 }
4487 resp.Body.Close()
4488 }
4489
4490 func TestServerWriteByteTimeout(t *testing.T) { synctestTest(t, testServerWriteByteTimeout) }
4491 func testServerWriteByteTimeout(t testing.TB) {
4492 const timeout = 1 * time.Second
4493 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
4494 w.Write(make([]byte, 100))
4495 }, func(s *http.Server) {
4496
4497
4498
4499 s.Protocols = protocols("h2c")
4500 }, func(h2 *http.HTTP2Config) {
4501 h2.WriteByteTimeout = timeout
4502 })
4503 st.greet()
4504
4505 st.cc.(*synctestNetConn).SetReadBufferSize(1)
4506 st.writeHeaders(HeadersFrameParam{
4507 StreamID: 1,
4508 BlockFragment: st.encodeHeader(),
4509 EndStream: true,
4510 EndHeaders: true,
4511 })
4512
4513
4514 for i := 0; i < 10; i++ {
4515 st.advance(timeout - 1)
4516 if n, err := st.cc.Read(make([]byte, 1)); n != 1 || err != nil {
4517 t.Fatalf("read %v: %v, %v; want 1, nil", i, n, err)
4518 }
4519 }
4520
4521
4522
4523 st.advance(1 * time.Second)
4524 st.advance(1 * time.Second)
4525 st.wantClosed()
4526 }
4527
4528 func TestServerPingSent(t *testing.T) { synctestTest(t, testServerPingSent) }
4529 func testServerPingSent(t testing.TB) {
4530 const sendPingTimeout = 15 * time.Second
4531 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
4532 }, func(h2 *http.HTTP2Config) {
4533 h2.SendPingTimeout = sendPingTimeout
4534 })
4535 st.greet()
4536
4537 st.wantIdle()
4538
4539 st.advance(sendPingTimeout)
4540 _ = readFrame[*PingFrame](t, st)
4541 st.wantIdle()
4542
4543 st.advance(14 * time.Second)
4544 st.wantIdle()
4545 st.advance(1 * time.Second)
4546 st.wantClosed()
4547 }
4548
4549 func TestServerPingResponded(t *testing.T) { synctestTest(t, testServerPingResponded) }
4550 func testServerPingResponded(t testing.TB) {
4551 const sendPingTimeout = 15 * time.Second
4552 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
4553 }, func(h2 *http.HTTP2Config) {
4554 h2.SendPingTimeout = sendPingTimeout
4555 })
4556 st.greet()
4557
4558 st.wantIdle()
4559
4560 st.advance(sendPingTimeout)
4561 pf := readFrame[*PingFrame](t, st)
4562 st.wantIdle()
4563
4564 st.advance(14 * time.Second)
4565 st.wantIdle()
4566
4567 st.writePing(true, pf.Data)
4568
4569 st.advance(2 * time.Second)
4570 st.wantIdle()
4571 }
4572
4573
4574
4575
4576
4577 func TestServerSendDataAfterRequestBodyClose(t *testing.T) {
4578 synctestTest(t, testServerSendDataAfterRequestBodyClose)
4579 }
4580 func testServerSendDataAfterRequestBodyClose(t testing.TB) {
4581 st := newServerTester(t, nil)
4582 st.greet()
4583
4584 st.writeHeaders(HeadersFrameParam{
4585 StreamID: 1,
4586 BlockFragment: st.encodeHeader(),
4587 EndStream: false,
4588 EndHeaders: true,
4589 })
4590
4591
4592 call := st.nextHandlerCall()
4593 call.do(func(w http.ResponseWriter, req *http.Request) {
4594 w.Write([]byte("one"))
4595 http.NewResponseController(w).Flush()
4596 })
4597 st.wantFrameType(FrameHeaders)
4598 st.wantData(wantData{
4599 streamID: 1,
4600 endStream: false,
4601 data: []byte("one"),
4602 })
4603 st.wantIdle()
4604
4605
4606
4607 call.do(func(w http.ResponseWriter, req *http.Request) {
4608 req.Body.Close()
4609 })
4610 st.wantIdle()
4611
4612
4613 st.writeData(1, false, []byte("client-sent data"))
4614 st.wantIdle()
4615
4616
4617
4618 call.do(func(w http.ResponseWriter, req *http.Request) {
4619 w.Write([]byte("two"))
4620 http.NewResponseController(w).Flush()
4621 })
4622 st.wantData(wantData{
4623 streamID: 1,
4624 endStream: false,
4625 data: []byte("two"),
4626 })
4627 st.wantIdle()
4628 }
4629
4630 func TestServerSettingNoRFC7540Priorities(t *testing.T) {
4631 synctestTest(t, testServerSettingNoRFC7540Priorities)
4632 }
4633 func testServerSettingNoRFC7540Priorities(t testing.TB) {
4634 const wantNoRFC7540Setting = true
4635 st := newServerTester(t, nil)
4636 defer st.Close()
4637
4638 var gotNoRFC7540Setting bool
4639 st.greetAndCheckSettings(func(s Setting) error {
4640 if s.ID != SettingNoRFC7540Priorities {
4641 return nil
4642 }
4643 gotNoRFC7540Setting = s.Val == 1
4644 return nil
4645 })
4646 if wantNoRFC7540Setting != gotNoRFC7540Setting {
4647 t.Errorf("want SETTINGS_NO_RFC7540_PRIORITIES to be %v, got %v", wantNoRFC7540Setting, gotNoRFC7540Setting)
4648 }
4649 }
4650
4651 func TestServerSettingNoRFC7540PrioritiesInvalid(t *testing.T) {
4652 synctestTest(t, testServerSettingNoRFC7540PrioritiesInvalid)
4653 }
4654 func testServerSettingNoRFC7540PrioritiesInvalid(t testing.TB) {
4655 st := newServerTester(t, nil)
4656 defer st.Close()
4657
4658 st.writePreface()
4659 st.writeSettings(Setting{ID: SettingNoRFC7540Priorities, Val: 2})
4660 synctest.Wait()
4661 st.readFrame()
4662 st.readFrame()
4663 st.wantGoAway(0, ErrCodeProtocol)
4664 }
4665
4666
4667
4668 func TestServerRFC9218PrioritySmallPayload(t *testing.T) {
4669 synctestTest(t, testServerRFC9218PrioritySmallPayload)
4670 }
4671 func testServerRFC9218PrioritySmallPayload(t testing.TB) {
4672 endTest := false
4673 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
4674 for !endTest {
4675 w.Write([]byte("a"))
4676 if f, ok := w.(http.Flusher); ok {
4677 f.Flush()
4678 }
4679 }
4680 }, func(s *http.Server) {
4681 s.Protocols = protocols("h2c")
4682 })
4683 st.greet()
4684 if syncConn, ok := st.cc.(*synctestNetConn); ok {
4685 syncConn.SetReadBufferSize(1)
4686 } else {
4687 t.Fatal("Server connection is not synctestNetConn")
4688 }
4689 defer st.Close()
4690 defer func() { endTest = true }()
4691
4692
4693
4694
4695
4696
4697 for i := 1; i <= 19; i += 2 {
4698 urgency := uint8(0)
4699 if i > 10 {
4700 urgency = 7
4701 }
4702 st.writeHeaders(HeadersFrameParam{
4703 StreamID: uint32(i),
4704 BlockFragment: st.encodeHeader("priority", fmt.Sprintf("u=%d", urgency)),
4705 EndStream: true,
4706 EndHeaders: true,
4707 })
4708 synctest.Wait()
4709 }
4710
4711
4712
4713 streamWriteCount := make(map[uint32]int)
4714 totalWriteCount := 10000
4715 for range totalWriteCount {
4716 f := st.readFrame()
4717 if f == nil {
4718 break
4719 }
4720 streamWriteCount[f.Header().StreamID] += 1
4721 }
4722 for streamID, writeCount := range streamWriteCount {
4723 expectedWriteCount := totalWriteCount / len(streamWriteCount)
4724 errorMargin := expectedWriteCount / 100
4725 if writeCount >= expectedWriteCount+errorMargin || writeCount <= expectedWriteCount-errorMargin {
4726 t.Errorf("Expected stream %v to receive %v±%v writes, got %v", streamID, expectedWriteCount, errorMargin, writeCount)
4727 }
4728 }
4729 }
4730
4731 func TestServerRFC9218Priority(t *testing.T) {
4732 synctestTest(t, testServerRFC9218Priority)
4733 }
4734 func testServerRFC9218Priority(t testing.TB) {
4735 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
4736 w.Write(slices.Repeat([]byte("a"), 16<<20))
4737 if f, ok := w.(http.Flusher); ok {
4738 f.Flush()
4739 }
4740 }, func(s *http.Server) {
4741 s.Protocols = protocols("h2c")
4742 })
4743 defer st.Close()
4744 st.greet()
4745 if syncConn, ok := st.cc.(*synctestNetConn); ok {
4746 syncConn.SetReadBufferSize(1)
4747 } else {
4748 t.Fatal("Server connection is not synctestNetConn")
4749 }
4750 st.writeWindowUpdate(0, 1<<30)
4751 synctest.Wait()
4752
4753
4754
4755 for i := range 8 {
4756 streamID := uint32(i*2 + 1)
4757 urgency := 7 - i
4758 st.writeHeaders(HeadersFrameParam{
4759 StreamID: streamID,
4760 BlockFragment: st.encodeHeader("priority", fmt.Sprintf("u=%d", urgency)),
4761 EndStream: true,
4762 EndHeaders: true,
4763 })
4764 }
4765 synctest.Wait()
4766
4767
4768
4769 lastFrame := make(map[uint32]int)
4770 for i := 0; ; i++ {
4771 f := st.readFrame()
4772 if f == nil {
4773 break
4774 }
4775 lastFrame[f.Header().StreamID] = i
4776 }
4777 for i := range 7 {
4778 streamID := uint32(i*2 + 1)
4779 nextStreamID := streamID + 2
4780 if lastFrame[streamID] < lastFrame[nextStreamID] {
4781 t.Errorf("stream %d finished before stream %d unexpectedly", streamID, nextStreamID)
4782 }
4783 }
4784 }
4785
4786 func TestServerRFC9218PriorityIgnoredWhenProxied(t *testing.T) {
4787 synctestTest(t, testServerRFC9218PriorityIgnoredWhenProxied)
4788 }
4789 func testServerRFC9218PriorityIgnoredWhenProxied(t testing.TB) {
4790 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
4791 w.Write(slices.Repeat([]byte("a"), 16<<20))
4792 if f, ok := w.(http.Flusher); ok {
4793 f.Flush()
4794 }
4795 }, func(s *http.Server) {
4796 s.Protocols = protocols("h2c")
4797 })
4798 defer st.Close()
4799 st.greet()
4800 if syncConn, ok := st.cc.(*synctestNetConn); ok {
4801 syncConn.SetReadBufferSize(1)
4802 } else {
4803 t.Fatal("Server connection is not synctestNetConn")
4804 }
4805 st.writeWindowUpdate(0, 1<<30)
4806 synctest.Wait()
4807
4808
4809
4810
4811 for i := range 8 {
4812 streamID := uint32(i*2 + 1)
4813 urgency := 7 - i
4814 st.writeHeaders(HeadersFrameParam{
4815 StreamID: streamID,
4816 BlockFragment: st.encodeHeader("priority", fmt.Sprintf("u=%d", urgency), "via", "a proxy"),
4817 EndStream: true,
4818 EndHeaders: true,
4819 })
4820 }
4821 synctest.Wait()
4822 var streamFrameOrder []uint32
4823 for f := st.readFrame(); f != nil; f = st.readFrame() {
4824 streamFrameOrder = append(streamFrameOrder, f.Header().StreamID)
4825 }
4826
4827
4828
4829 half := streamFrameOrder[len(streamFrameOrder)/4 : len(streamFrameOrder)*3/4]
4830 if !slices.Equal(slices.Compact(half), half) {
4831 t.Errorf("want stream to be processed in round-robin manner when proxied, got: %v", streamFrameOrder)
4832 }
4833 }
4834
4835 func TestServerRFC9218PriorityAware(t *testing.T) {
4836 synctestTest(t, testServerRFC9218PriorityAware)
4837 }
4838 func testServerRFC9218PriorityAware(t testing.TB) {
4839 st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
4840 w.Write(slices.Repeat([]byte("a"), 16<<20))
4841 if f, ok := w.(http.Flusher); ok {
4842 f.Flush()
4843 }
4844 }, func(s *http.Server) {
4845 s.Protocols = protocols("h2c")
4846 })
4847 defer st.Close()
4848 st.greet()
4849 if syncConn, ok := st.cc.(*synctestNetConn); ok {
4850 syncConn.SetReadBufferSize(1)
4851 } else {
4852 t.Fatal("Server connection is not synctestNetConn")
4853 }
4854 st.writeWindowUpdate(0, 1<<30)
4855 synctest.Wait()
4856
4857
4858
4859 streamCount := 10
4860 for i := range streamCount {
4861 streamID := uint32(i*2 + 1)
4862 st.writeHeaders(HeadersFrameParam{
4863 StreamID: streamID,
4864 BlockFragment: st.encodeHeader(),
4865 EndStream: true,
4866 EndHeaders: true,
4867 })
4868 }
4869 synctest.Wait()
4870 var streamFrameOrder []uint32
4871 for f := st.readFrame(); f != nil; f = st.readFrame() {
4872 streamFrameOrder = append(streamFrameOrder, f.Header().StreamID)
4873 }
4874
4875
4876
4877 half := streamFrameOrder[len(streamFrameOrder)/4 : len(streamFrameOrder)*3/4]
4878 if !slices.Equal(slices.Compact(half), half) {
4879 t.Errorf("want stream to be processed in round-robin manner when unaware of priority, got: %v", streamFrameOrder)
4880 }
4881
4882
4883
4884
4885 st.writePriorityUpdate(1, "")
4886 synctest.Wait()
4887
4888
4889
4890
4891
4892 streamFrameOrder = []uint32{}
4893 for i := range streamCount {
4894 i += streamCount
4895 streamID := uint32(i*2 + 1)
4896 st.writeHeaders(HeadersFrameParam{
4897 StreamID: streamID,
4898 BlockFragment: st.encodeHeader(),
4899 EndStream: true,
4900 EndHeaders: true,
4901 })
4902 }
4903 for f := st.readFrame(); f != nil; f = st.readFrame() {
4904 streamFrameOrder = append(streamFrameOrder, f.Header().StreamID)
4905 }
4906 if !slices.Equal(slices.Compact(half), half) {
4907 t.Errorf("want stream to be processed one-by-one to completion when aware of priority, got: %v", streamFrameOrder)
4908 }
4909 }
4910
4911 func TestConsistentConstants(t *testing.T) {
4912 if h1, h2 := http.DefaultMaxHeaderBytes, http2.DefaultMaxHeaderBytes; h1 != h2 {
4913 t.Errorf("DefaultMaxHeaderBytes: http (%v) != http2 (%v)", h1, h2)
4914 }
4915 if h1, h2 := http.TimeFormat, http2.TimeFormat; h1 != h2 {
4916 t.Errorf("TimeFormat: http (%v) != http2 (%v)", h1, h2)
4917 }
4918 }
4919
4920 var (
4921 testServerTLSConfig *tls.Config
4922 testClientTLSConfig *tls.Config
4923 )
4924
4925 func init() {
4926 cert, err := tls.X509KeyPair(testcert.LocalhostCert, testcert.LocalhostKey)
4927 if err != nil {
4928 panic(err)
4929 }
4930 testServerTLSConfig = &tls.Config{
4931 Certificates: []tls.Certificate{cert},
4932 NextProtos: []string{"h2"},
4933 }
4934
4935 x509Cert, err := x509.ParseCertificate(cert.Certificate[0])
4936 if err != nil {
4937 panic(err)
4938 }
4939 certpool := x509.NewCertPool()
4940 certpool.AddCert(x509Cert)
4941 testClientTLSConfig = &tls.Config{
4942 InsecureSkipVerify: true,
4943 RootCAs: certpool,
4944 NextProtos: []string{"h2"},
4945 }
4946 }
4947
4948 func protocols(protos ...string) *http.Protocols {
4949 p := new(http.Protocols)
4950 for _, s := range protos {
4951 switch s {
4952 case "h1":
4953 p.SetHTTP1(true)
4954 case "h2":
4955 p.SetHTTP2(true)
4956 case "h2c":
4957 p.SetUnencryptedHTTP2(true)
4958 default:
4959 panic("unknown protocol: " + s)
4960 }
4961 }
4962 return p
4963 }
4964
4965
4966 func transportFromH1Transport(tr *http.Transport) any
4967
View as plain text