Source file src/net/http/h2_bundle.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package http
18
19 import (
20 "bufio"
21 "bytes"
22 "compress/gzip"
23 "context"
24 "crypto/tls"
25 "encoding/binary"
26 "errors"
27 "fmt"
28 "io"
29 "io/ioutil"
30 "log"
31 "math"
32 "net"
33 "net/http/httptrace"
34 "net/textproto"
35 "net/url"
36 "os"
37 "reflect"
38 "runtime"
39 "sort"
40 "strconv"
41 "strings"
42 "sync"
43 "time"
44
45 "golang_org/x/net/http2/hpack"
46 "golang_org/x/net/lex/httplex"
47 )
48
49
50 type http2ClientConnPool interface {
51 GetClientConn(req *Request, addr string) (*http2ClientConn, error)
52 MarkDead(*http2ClientConn)
53 }
54
55
56
57 type http2clientConnPoolIdleCloser interface {
58 http2ClientConnPool
59 closeIdleConnections()
60 }
61
62 var (
63 _ http2clientConnPoolIdleCloser = (*http2clientConnPool)(nil)
64 _ http2clientConnPoolIdleCloser = http2noDialClientConnPool{}
65 )
66
67
68 type http2clientConnPool struct {
69 t *http2Transport
70
71 mu sync.Mutex
72
73
74 conns map[string][]*http2ClientConn
75 dialing map[string]*http2dialCall
76 keys map[*http2ClientConn][]string
77 addConnCalls map[string]*http2addConnCall
78 }
79
80 func (p *http2clientConnPool) GetClientConn(req *Request, addr string) (*http2ClientConn, error) {
81 return p.getClientConn(req, addr, http2dialOnMiss)
82 }
83
84 const (
85 http2dialOnMiss = true
86 http2noDialOnMiss = false
87 )
88
89 func (p *http2clientConnPool) getClientConn(req *Request, addr string, dialOnMiss bool) (*http2ClientConn, error) {
90 if http2isConnectionCloseRequest(req) && dialOnMiss {
91
92 const singleUse = true
93 cc, err := p.t.dialClientConn(addr, singleUse)
94 if err != nil {
95 return nil, err
96 }
97 return cc, nil
98 }
99 p.mu.Lock()
100 for _, cc := range p.conns[addr] {
101 if cc.CanTakeNewRequest() {
102 p.mu.Unlock()
103 return cc, nil
104 }
105 }
106 if !dialOnMiss {
107 p.mu.Unlock()
108 return nil, http2ErrNoCachedConn
109 }
110 call := p.getStartDialLocked(addr)
111 p.mu.Unlock()
112 <-call.done
113 return call.res, call.err
114 }
115
116
117 type http2dialCall struct {
118 p *http2clientConnPool
119 done chan struct{}
120 res *http2ClientConn
121 err error
122 }
123
124
125 func (p *http2clientConnPool) getStartDialLocked(addr string) *http2dialCall {
126 if call, ok := p.dialing[addr]; ok {
127
128 return call
129 }
130 call := &http2dialCall{p: p, done: make(chan struct{})}
131 if p.dialing == nil {
132 p.dialing = make(map[string]*http2dialCall)
133 }
134 p.dialing[addr] = call
135 go call.dial(addr)
136 return call
137 }
138
139
140 func (c *http2dialCall) dial(addr string) {
141 const singleUse = false
142 c.res, c.err = c.p.t.dialClientConn(addr, singleUse)
143 close(c.done)
144
145 c.p.mu.Lock()
146 delete(c.p.dialing, addr)
147 if c.err == nil {
148 c.p.addConnLocked(addr, c.res)
149 }
150 c.p.mu.Unlock()
151 }
152
153
154
155
156
157
158
159
160
161 func (p *http2clientConnPool) addConnIfNeeded(key string, t *http2Transport, c *tls.Conn) (used bool, err error) {
162 p.mu.Lock()
163 for _, cc := range p.conns[key] {
164 if cc.CanTakeNewRequest() {
165 p.mu.Unlock()
166 return false, nil
167 }
168 }
169 call, dup := p.addConnCalls[key]
170 if !dup {
171 if p.addConnCalls == nil {
172 p.addConnCalls = make(map[string]*http2addConnCall)
173 }
174 call = &http2addConnCall{
175 p: p,
176 done: make(chan struct{}),
177 }
178 p.addConnCalls[key] = call
179 go call.run(t, key, c)
180 }
181 p.mu.Unlock()
182
183 <-call.done
184 if call.err != nil {
185 return false, call.err
186 }
187 return !dup, nil
188 }
189
190 type http2addConnCall struct {
191 p *http2clientConnPool
192 done chan struct{}
193 err error
194 }
195
196 func (c *http2addConnCall) run(t *http2Transport, key string, tc *tls.Conn) {
197 cc, err := t.NewClientConn(tc)
198
199 p := c.p
200 p.mu.Lock()
201 if err != nil {
202 c.err = err
203 } else {
204 p.addConnLocked(key, cc)
205 }
206 delete(p.addConnCalls, key)
207 p.mu.Unlock()
208 close(c.done)
209 }
210
211 func (p *http2clientConnPool) addConn(key string, cc *http2ClientConn) {
212 p.mu.Lock()
213 p.addConnLocked(key, cc)
214 p.mu.Unlock()
215 }
216
217
218 func (p *http2clientConnPool) addConnLocked(key string, cc *http2ClientConn) {
219 for _, v := range p.conns[key] {
220 if v == cc {
221 return
222 }
223 }
224 if p.conns == nil {
225 p.conns = make(map[string][]*http2ClientConn)
226 }
227 if p.keys == nil {
228 p.keys = make(map[*http2ClientConn][]string)
229 }
230 p.conns[key] = append(p.conns[key], cc)
231 p.keys[cc] = append(p.keys[cc], key)
232 }
233
234 func (p *http2clientConnPool) MarkDead(cc *http2ClientConn) {
235 p.mu.Lock()
236 defer p.mu.Unlock()
237 for _, key := range p.keys[cc] {
238 vv, ok := p.conns[key]
239 if !ok {
240 continue
241 }
242 newList := http2filterOutClientConn(vv, cc)
243 if len(newList) > 0 {
244 p.conns[key] = newList
245 } else {
246 delete(p.conns, key)
247 }
248 }
249 delete(p.keys, cc)
250 }
251
252 func (p *http2clientConnPool) closeIdleConnections() {
253 p.mu.Lock()
254 defer p.mu.Unlock()
255
256 for _, vv := range p.conns {
257 for _, cc := range vv {
258 cc.closeIfIdle()
259 }
260 }
261 }
262
263 func http2filterOutClientConn(in []*http2ClientConn, exclude *http2ClientConn) []*http2ClientConn {
264 out := in[:0]
265 for _, v := range in {
266 if v != exclude {
267 out = append(out, v)
268 }
269 }
270
271 if len(in) != len(out) {
272 in[len(in)-1] = nil
273 }
274 return out
275 }
276
277
278
279
280 type http2noDialClientConnPool struct{ *http2clientConnPool }
281
282 func (p http2noDialClientConnPool) GetClientConn(req *Request, addr string) (*http2ClientConn, error) {
283 return p.getClientConn(req, addr, http2noDialOnMiss)
284 }
285
286 func http2configureTransport(t1 *Transport) (*http2Transport, error) {
287 connPool := new(http2clientConnPool)
288 t2 := &http2Transport{
289 ConnPool: http2noDialClientConnPool{connPool},
290 t1: t1,
291 }
292 connPool.t = t2
293 if err := http2registerHTTPSProtocol(t1, http2noDialH2RoundTripper{t2}); err != nil {
294 return nil, err
295 }
296 if t1.TLSClientConfig == nil {
297 t1.TLSClientConfig = new(tls.Config)
298 }
299 if !http2strSliceContains(t1.TLSClientConfig.NextProtos, "h2") {
300 t1.TLSClientConfig.NextProtos = append([]string{"h2"}, t1.TLSClientConfig.NextProtos...)
301 }
302 if !http2strSliceContains(t1.TLSClientConfig.NextProtos, "http/1.1") {
303 t1.TLSClientConfig.NextProtos = append(t1.TLSClientConfig.NextProtos, "http/1.1")
304 }
305 upgradeFn := func(authority string, c *tls.Conn) RoundTripper {
306 addr := http2authorityAddr("https", authority)
307 if used, err := connPool.addConnIfNeeded(addr, t2, c); err != nil {
308 go c.Close()
309 return http2erringRoundTripper{err}
310 } else if !used {
311
312 go c.Close()
313 }
314 return t2
315 }
316 if m := t1.TLSNextProto; len(m) == 0 {
317 t1.TLSNextProto = map[string]func(string, *tls.Conn) RoundTripper{
318 "h2": upgradeFn,
319 }
320 } else {
321 m["h2"] = upgradeFn
322 }
323 return t2, nil
324 }
325
326
327
328 func http2registerHTTPSProtocol(t *Transport, rt RoundTripper) (err error) {
329 defer func() {
330 if e := recover(); e != nil {
331 err = fmt.Errorf("%v", e)
332 }
333 }()
334 t.RegisterProtocol("https", rt)
335 return nil
336 }
337
338
339
340 type http2noDialH2RoundTripper struct{ t *http2Transport }
341
342 func (rt http2noDialH2RoundTripper) RoundTrip(req *Request) (*Response, error) {
343 res, err := rt.t.RoundTrip(req)
344 if err == http2ErrNoCachedConn {
345 return nil, ErrSkipAltProtocol
346 }
347 return res, err
348 }
349
350
351 type http2ErrCode uint32
352
353 const (
354 http2ErrCodeNo http2ErrCode = 0x0
355 http2ErrCodeProtocol http2ErrCode = 0x1
356 http2ErrCodeInternal http2ErrCode = 0x2
357 http2ErrCodeFlowControl http2ErrCode = 0x3
358 http2ErrCodeSettingsTimeout http2ErrCode = 0x4
359 http2ErrCodeStreamClosed http2ErrCode = 0x5
360 http2ErrCodeFrameSize http2ErrCode = 0x6
361 http2ErrCodeRefusedStream http2ErrCode = 0x7
362 http2ErrCodeCancel http2ErrCode = 0x8
363 http2ErrCodeCompression http2ErrCode = 0x9
364 http2ErrCodeConnect http2ErrCode = 0xa
365 http2ErrCodeEnhanceYourCalm http2ErrCode = 0xb
366 http2ErrCodeInadequateSecurity http2ErrCode = 0xc
367 http2ErrCodeHTTP11Required http2ErrCode = 0xd
368 )
369
370 var http2errCodeName = map[http2ErrCode]string{
371 http2ErrCodeNo: "NO_ERROR",
372 http2ErrCodeProtocol: "PROTOCOL_ERROR",
373 http2ErrCodeInternal: "INTERNAL_ERROR",
374 http2ErrCodeFlowControl: "FLOW_CONTROL_ERROR",
375 http2ErrCodeSettingsTimeout: "SETTINGS_TIMEOUT",
376 http2ErrCodeStreamClosed: "STREAM_CLOSED",
377 http2ErrCodeFrameSize: "FRAME_SIZE_ERROR",
378 http2ErrCodeRefusedStream: "REFUSED_STREAM",
379 http2ErrCodeCancel: "CANCEL",
380 http2ErrCodeCompression: "COMPRESSION_ERROR",
381 http2ErrCodeConnect: "CONNECT_ERROR",
382 http2ErrCodeEnhanceYourCalm: "ENHANCE_YOUR_CALM",
383 http2ErrCodeInadequateSecurity: "INADEQUATE_SECURITY",
384 http2ErrCodeHTTP11Required: "HTTP_1_1_REQUIRED",
385 }
386
387 func (e http2ErrCode) String() string {
388 if s, ok := http2errCodeName[e]; ok {
389 return s
390 }
391 return fmt.Sprintf("unknown error code 0x%x", uint32(e))
392 }
393
394
395
396 type http2ConnectionError http2ErrCode
397
398 func (e http2ConnectionError) Error() string {
399 return fmt.Sprintf("connection error: %s", http2ErrCode(e))
400 }
401
402
403
404 type http2StreamError struct {
405 StreamID uint32
406 Code http2ErrCode
407 Cause error
408 }
409
410 func http2streamError(id uint32, code http2ErrCode) http2StreamError {
411 return http2StreamError{StreamID: id, Code: code}
412 }
413
414 func (e http2StreamError) Error() string {
415 if e.Cause != nil {
416 return fmt.Sprintf("stream error: stream ID %d; %v; %v", e.StreamID, e.Code, e.Cause)
417 }
418 return fmt.Sprintf("stream error: stream ID %d; %v", e.StreamID, e.Code)
419 }
420
421
422
423
424
425
426 type http2goAwayFlowError struct{}
427
428 func (http2goAwayFlowError) Error() string { return "connection exceeded flow control window size" }
429
430
431
432 type http2connError struct {
433 Code http2ErrCode
434 Reason string
435 }
436
437 func (e http2connError) Error() string {
438 return fmt.Sprintf("http2: connection error: %v: %v", e.Code, e.Reason)
439 }
440
441 type http2pseudoHeaderError string
442
443 func (e http2pseudoHeaderError) Error() string {
444 return fmt.Sprintf("invalid pseudo-header %q", string(e))
445 }
446
447 type http2duplicatePseudoHeaderError string
448
449 func (e http2duplicatePseudoHeaderError) Error() string {
450 return fmt.Sprintf("duplicate pseudo-header %q", string(e))
451 }
452
453 type http2headerFieldNameError string
454
455 func (e http2headerFieldNameError) Error() string {
456 return fmt.Sprintf("invalid header field name %q", string(e))
457 }
458
459 type http2headerFieldValueError string
460
461 func (e http2headerFieldValueError) Error() string {
462 return fmt.Sprintf("invalid header field value %q", string(e))
463 }
464
465 var (
466 http2errMixPseudoHeaderTypes = errors.New("mix of request and response pseudo headers")
467 http2errPseudoAfterRegular = errors.New("pseudo header field after regular")
468 )
469
470
471
472 type http2fixedBuffer struct {
473 buf []byte
474 r, w int
475 }
476
477 var (
478 http2errReadEmpty = errors.New("read from empty fixedBuffer")
479 http2errWriteFull = errors.New("write on full fixedBuffer")
480 )
481
482
483
484 func (b *http2fixedBuffer) Read(p []byte) (n int, err error) {
485 if b.r == b.w {
486 return 0, http2errReadEmpty
487 }
488 n = copy(p, b.buf[b.r:b.w])
489 b.r += n
490 if b.r == b.w {
491 b.r = 0
492 b.w = 0
493 }
494 return n, nil
495 }
496
497
498 func (b *http2fixedBuffer) Len() int {
499 return b.w - b.r
500 }
501
502
503
504 func (b *http2fixedBuffer) Write(p []byte) (n int, err error) {
505
506 if b.r > 0 && len(p) > len(b.buf)-b.w {
507 copy(b.buf, b.buf[b.r:b.w])
508 b.w -= b.r
509 b.r = 0
510 }
511
512 n = copy(b.buf[b.w:], p)
513 b.w += n
514 if n < len(p) {
515 err = http2errWriteFull
516 }
517 return n, err
518 }
519
520
521 type http2flow struct {
522
523
524 n int32
525
526
527
528
529 conn *http2flow
530 }
531
532 func (f *http2flow) setConnFlow(cf *http2flow) { f.conn = cf }
533
534 func (f *http2flow) available() int32 {
535 n := f.n
536 if f.conn != nil && f.conn.n < n {
537 n = f.conn.n
538 }
539 return n
540 }
541
542 func (f *http2flow) take(n int32) {
543 if n > f.available() {
544 panic("internal error: took too much")
545 }
546 f.n -= n
547 if f.conn != nil {
548 f.conn.n -= n
549 }
550 }
551
552
553
554 func (f *http2flow) add(n int32) bool {
555 remain := (1<<31 - 1) - f.n
556 if n > remain {
557 return false
558 }
559 f.n += n
560 return true
561 }
562
563 const http2frameHeaderLen = 9
564
565 var http2padZeros = make([]byte, 255)
566
567
568
569 type http2FrameType uint8
570
571 const (
572 http2FrameData http2FrameType = 0x0
573 http2FrameHeaders http2FrameType = 0x1
574 http2FramePriority http2FrameType = 0x2
575 http2FrameRSTStream http2FrameType = 0x3
576 http2FrameSettings http2FrameType = 0x4
577 http2FramePushPromise http2FrameType = 0x5
578 http2FramePing http2FrameType = 0x6
579 http2FrameGoAway http2FrameType = 0x7
580 http2FrameWindowUpdate http2FrameType = 0x8
581 http2FrameContinuation http2FrameType = 0x9
582 )
583
584 var http2frameName = map[http2FrameType]string{
585 http2FrameData: "DATA",
586 http2FrameHeaders: "HEADERS",
587 http2FramePriority: "PRIORITY",
588 http2FrameRSTStream: "RST_STREAM",
589 http2FrameSettings: "SETTINGS",
590 http2FramePushPromise: "PUSH_PROMISE",
591 http2FramePing: "PING",
592 http2FrameGoAway: "GOAWAY",
593 http2FrameWindowUpdate: "WINDOW_UPDATE",
594 http2FrameContinuation: "CONTINUATION",
595 }
596
597 func (t http2FrameType) String() string {
598 if s, ok := http2frameName[t]; ok {
599 return s
600 }
601 return fmt.Sprintf("UNKNOWN_FRAME_TYPE_%d", uint8(t))
602 }
603
604
605
606 type http2Flags uint8
607
608
609 func (f http2Flags) Has(v http2Flags) bool {
610 return (f & v) == v
611 }
612
613
614 const (
615
616 http2FlagDataEndStream http2Flags = 0x1
617 http2FlagDataPadded http2Flags = 0x8
618
619
620 http2FlagHeadersEndStream http2Flags = 0x1
621 http2FlagHeadersEndHeaders http2Flags = 0x4
622 http2FlagHeadersPadded http2Flags = 0x8
623 http2FlagHeadersPriority http2Flags = 0x20
624
625
626 http2FlagSettingsAck http2Flags = 0x1
627
628
629 http2FlagPingAck http2Flags = 0x1
630
631
632 http2FlagContinuationEndHeaders http2Flags = 0x4
633
634 http2FlagPushPromiseEndHeaders http2Flags = 0x4
635 http2FlagPushPromisePadded http2Flags = 0x8
636 )
637
638 var http2flagName = map[http2FrameType]map[http2Flags]string{
639 http2FrameData: {
640 http2FlagDataEndStream: "END_STREAM",
641 http2FlagDataPadded: "PADDED",
642 },
643 http2FrameHeaders: {
644 http2FlagHeadersEndStream: "END_STREAM",
645 http2FlagHeadersEndHeaders: "END_HEADERS",
646 http2FlagHeadersPadded: "PADDED",
647 http2FlagHeadersPriority: "PRIORITY",
648 },
649 http2FrameSettings: {
650 http2FlagSettingsAck: "ACK",
651 },
652 http2FramePing: {
653 http2FlagPingAck: "ACK",
654 },
655 http2FrameContinuation: {
656 http2FlagContinuationEndHeaders: "END_HEADERS",
657 },
658 http2FramePushPromise: {
659 http2FlagPushPromiseEndHeaders: "END_HEADERS",
660 http2FlagPushPromisePadded: "PADDED",
661 },
662 }
663
664
665
666
667 type http2frameParser func(fh http2FrameHeader, payload []byte) (http2Frame, error)
668
669 var http2frameParsers = map[http2FrameType]http2frameParser{
670 http2FrameData: http2parseDataFrame,
671 http2FrameHeaders: http2parseHeadersFrame,
672 http2FramePriority: http2parsePriorityFrame,
673 http2FrameRSTStream: http2parseRSTStreamFrame,
674 http2FrameSettings: http2parseSettingsFrame,
675 http2FramePushPromise: http2parsePushPromise,
676 http2FramePing: http2parsePingFrame,
677 http2FrameGoAway: http2parseGoAwayFrame,
678 http2FrameWindowUpdate: http2parseWindowUpdateFrame,
679 http2FrameContinuation: http2parseContinuationFrame,
680 }
681
682 func http2typeFrameParser(t http2FrameType) http2frameParser {
683 if f := http2frameParsers[t]; f != nil {
684 return f
685 }
686 return http2parseUnknownFrame
687 }
688
689
690
691
692 type http2FrameHeader struct {
693 valid bool
694
695
696
697
698 Type http2FrameType
699
700
701
702 Flags http2Flags
703
704
705
706
707 Length uint32
708
709
710
711 StreamID uint32
712 }
713
714
715
716 func (h http2FrameHeader) Header() http2FrameHeader { return h }
717
718 func (h http2FrameHeader) String() string {
719 var buf bytes.Buffer
720 buf.WriteString("[FrameHeader ")
721 h.writeDebug(&buf)
722 buf.WriteByte(']')
723 return buf.String()
724 }
725
726 func (h http2FrameHeader) writeDebug(buf *bytes.Buffer) {
727 buf.WriteString(h.Type.String())
728 if h.Flags != 0 {
729 buf.WriteString(" flags=")
730 set := 0
731 for i := uint8(0); i < 8; i++ {
732 if h.Flags&(1<<i) == 0 {
733 continue
734 }
735 set++
736 if set > 1 {
737 buf.WriteByte('|')
738 }
739 name := http2flagName[h.Type][http2Flags(1<<i)]
740 if name != "" {
741 buf.WriteString(name)
742 } else {
743 fmt.Fprintf(buf, "0x%x", 1<<i)
744 }
745 }
746 }
747 if h.StreamID != 0 {
748 fmt.Fprintf(buf, " stream=%d", h.StreamID)
749 }
750 fmt.Fprintf(buf, " len=%d", h.Length)
751 }
752
753 func (h *http2FrameHeader) checkValid() {
754 if !h.valid {
755 panic("Frame accessor called on non-owned Frame")
756 }
757 }
758
759 func (h *http2FrameHeader) invalidate() { h.valid = false }
760
761
762
763 var http2fhBytes = sync.Pool{
764 New: func() interface{} {
765 buf := make([]byte, http2frameHeaderLen)
766 return &buf
767 },
768 }
769
770
771
772 func http2ReadFrameHeader(r io.Reader) (http2FrameHeader, error) {
773 bufp := http2fhBytes.Get().(*[]byte)
774 defer http2fhBytes.Put(bufp)
775 return http2readFrameHeader(*bufp, r)
776 }
777
778 func http2readFrameHeader(buf []byte, r io.Reader) (http2FrameHeader, error) {
779 _, err := io.ReadFull(r, buf[:http2frameHeaderLen])
780 if err != nil {
781 return http2FrameHeader{}, err
782 }
783 return http2FrameHeader{
784 Length: (uint32(buf[0])<<16 | uint32(buf[1])<<8 | uint32(buf[2])),
785 Type: http2FrameType(buf[3]),
786 Flags: http2Flags(buf[4]),
787 StreamID: binary.BigEndian.Uint32(buf[5:]) & (1<<31 - 1),
788 valid: true,
789 }, nil
790 }
791
792
793
794
795
796
797 type http2Frame interface {
798 Header() http2FrameHeader
799
800
801
802
803 invalidate()
804 }
805
806
807 type http2Framer struct {
808 r io.Reader
809 lastFrame http2Frame
810 errDetail error
811
812
813
814 lastHeaderStream uint32
815
816 maxReadSize uint32
817 headerBuf [http2frameHeaderLen]byte
818
819
820
821
822 getReadBuf func(size uint32) []byte
823 readBuf []byte
824
825 maxWriteSize uint32
826
827 w io.Writer
828 wbuf []byte
829
830
831
832
833
834
835
836 AllowIllegalWrites bool
837
838
839
840
841
842
843 AllowIllegalReads bool
844
845
846
847
848 ReadMetaHeaders *hpack.Decoder
849
850
851
852
853
854 MaxHeaderListSize uint32
855
856 logReads bool
857
858 debugFramer *http2Framer
859 debugFramerBuf *bytes.Buffer
860 }
861
862 func (fr *http2Framer) maxHeaderListSize() uint32 {
863 if fr.MaxHeaderListSize == 0 {
864 return 16 << 20
865 }
866 return fr.MaxHeaderListSize
867 }
868
869 func (f *http2Framer) startWrite(ftype http2FrameType, flags http2Flags, streamID uint32) {
870
871 f.wbuf = append(f.wbuf[:0],
872 0,
873 0,
874 0,
875 byte(ftype),
876 byte(flags),
877 byte(streamID>>24),
878 byte(streamID>>16),
879 byte(streamID>>8),
880 byte(streamID))
881 }
882
883 func (f *http2Framer) endWrite() error {
884
885 length := len(f.wbuf) - http2frameHeaderLen
886 if length >= (1 << 24) {
887 return http2ErrFrameTooLarge
888 }
889 _ = append(f.wbuf[:0],
890 byte(length>>16),
891 byte(length>>8),
892 byte(length))
893 if http2logFrameWrites {
894 f.logWrite()
895 }
896
897 n, err := f.w.Write(f.wbuf)
898 if err == nil && n != len(f.wbuf) {
899 err = io.ErrShortWrite
900 }
901 return err
902 }
903
904 func (f *http2Framer) logWrite() {
905 if f.debugFramer == nil {
906 f.debugFramerBuf = new(bytes.Buffer)
907 f.debugFramer = http2NewFramer(nil, f.debugFramerBuf)
908 f.debugFramer.logReads = false
909
910 f.debugFramer.AllowIllegalReads = true
911 }
912 f.debugFramerBuf.Write(f.wbuf)
913 fr, err := f.debugFramer.ReadFrame()
914 if err != nil {
915 log.Printf("http2: Framer %p: failed to decode just-written frame", f)
916 return
917 }
918 log.Printf("http2: Framer %p: wrote %v", f, http2summarizeFrame(fr))
919 }
920
921 func (f *http2Framer) writeByte(v byte) { f.wbuf = append(f.wbuf, v) }
922
923 func (f *http2Framer) writeBytes(v []byte) { f.wbuf = append(f.wbuf, v...) }
924
925 func (f *http2Framer) writeUint16(v uint16) { f.wbuf = append(f.wbuf, byte(v>>8), byte(v)) }
926
927 func (f *http2Framer) writeUint32(v uint32) {
928 f.wbuf = append(f.wbuf, byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
929 }
930
931 const (
932 http2minMaxFrameSize = 1 << 14
933 http2maxFrameSize = 1<<24 - 1
934 )
935
936
937 func http2NewFramer(w io.Writer, r io.Reader) *http2Framer {
938 fr := &http2Framer{
939 w: w,
940 r: r,
941 logReads: http2logFrameReads,
942 }
943 fr.getReadBuf = func(size uint32) []byte {
944 if cap(fr.readBuf) >= int(size) {
945 return fr.readBuf[:size]
946 }
947 fr.readBuf = make([]byte, size)
948 return fr.readBuf
949 }
950 fr.SetMaxReadFrameSize(http2maxFrameSize)
951 return fr
952 }
953
954
955
956
957
958 func (fr *http2Framer) SetMaxReadFrameSize(v uint32) {
959 if v > http2maxFrameSize {
960 v = http2maxFrameSize
961 }
962 fr.maxReadSize = v
963 }
964
965
966
967
968
969
970
971
972 func (fr *http2Framer) ErrorDetail() error {
973 return fr.errDetail
974 }
975
976
977
978 var http2ErrFrameTooLarge = errors.New("http2: frame too large")
979
980
981
982 func http2terminalReadFrameError(err error) bool {
983 if _, ok := err.(http2StreamError); ok {
984 return false
985 }
986 return err != nil
987 }
988
989
990
991
992
993
994
995
996 func (fr *http2Framer) ReadFrame() (http2Frame, error) {
997 fr.errDetail = nil
998 if fr.lastFrame != nil {
999 fr.lastFrame.invalidate()
1000 }
1001 fh, err := http2readFrameHeader(fr.headerBuf[:], fr.r)
1002 if err != nil {
1003 return nil, err
1004 }
1005 if fh.Length > fr.maxReadSize {
1006 return nil, http2ErrFrameTooLarge
1007 }
1008 payload := fr.getReadBuf(fh.Length)
1009 if _, err := io.ReadFull(fr.r, payload); err != nil {
1010 return nil, err
1011 }
1012 f, err := http2typeFrameParser(fh.Type)(fh, payload)
1013 if err != nil {
1014 if ce, ok := err.(http2connError); ok {
1015 return nil, fr.connError(ce.Code, ce.Reason)
1016 }
1017 return nil, err
1018 }
1019 if err := fr.checkFrameOrder(f); err != nil {
1020 return nil, err
1021 }
1022 if fr.logReads {
1023 log.Printf("http2: Framer %p: read %v", fr, http2summarizeFrame(f))
1024 }
1025 if fh.Type == http2FrameHeaders && fr.ReadMetaHeaders != nil {
1026 return fr.readMetaFrame(f.(*http2HeadersFrame))
1027 }
1028 return f, nil
1029 }
1030
1031
1032
1033
1034
1035 func (fr *http2Framer) connError(code http2ErrCode, reason string) error {
1036 fr.errDetail = errors.New(reason)
1037 return http2ConnectionError(code)
1038 }
1039
1040
1041
1042
1043 func (fr *http2Framer) checkFrameOrder(f http2Frame) error {
1044 last := fr.lastFrame
1045 fr.lastFrame = f
1046 if fr.AllowIllegalReads {
1047 return nil
1048 }
1049
1050 fh := f.Header()
1051 if fr.lastHeaderStream != 0 {
1052 if fh.Type != http2FrameContinuation {
1053 return fr.connError(http2ErrCodeProtocol,
1054 fmt.Sprintf("got %s for stream %d; expected CONTINUATION following %s for stream %d",
1055 fh.Type, fh.StreamID,
1056 last.Header().Type, fr.lastHeaderStream))
1057 }
1058 if fh.StreamID != fr.lastHeaderStream {
1059 return fr.connError(http2ErrCodeProtocol,
1060 fmt.Sprintf("got CONTINUATION for stream %d; expected stream %d",
1061 fh.StreamID, fr.lastHeaderStream))
1062 }
1063 } else if fh.Type == http2FrameContinuation {
1064 return fr.connError(http2ErrCodeProtocol, fmt.Sprintf("unexpected CONTINUATION for stream %d", fh.StreamID))
1065 }
1066
1067 switch fh.Type {
1068 case http2FrameHeaders, http2FrameContinuation:
1069 if fh.Flags.Has(http2FlagHeadersEndHeaders) {
1070 fr.lastHeaderStream = 0
1071 } else {
1072 fr.lastHeaderStream = fh.StreamID
1073 }
1074 }
1075
1076 return nil
1077 }
1078
1079
1080
1081
1082 type http2DataFrame struct {
1083 http2FrameHeader
1084 data []byte
1085 }
1086
1087 func (f *http2DataFrame) StreamEnded() bool {
1088 return f.http2FrameHeader.Flags.Has(http2FlagDataEndStream)
1089 }
1090
1091
1092
1093
1094
1095 func (f *http2DataFrame) Data() []byte {
1096 f.checkValid()
1097 return f.data
1098 }
1099
1100 func http2parseDataFrame(fh http2FrameHeader, payload []byte) (http2Frame, error) {
1101 if fh.StreamID == 0 {
1102
1103 return nil, http2connError{http2ErrCodeProtocol, "DATA frame with stream ID 0"}
1104 }
1105 f := &http2DataFrame{
1106 http2FrameHeader: fh,
1107 }
1108 var padSize byte
1109 if fh.Flags.Has(http2FlagDataPadded) {
1110 var err error
1111 payload, padSize, err = http2readByte(payload)
1112 if err != nil {
1113 return nil, err
1114 }
1115 }
1116 if int(padSize) > len(payload) {
1117
1118 return nil, http2connError{http2ErrCodeProtocol, "pad size larger than data payload"}
1119 }
1120 f.data = payload[:len(payload)-int(padSize)]
1121 return f, nil
1122 }
1123
1124 var (
1125 http2errStreamID = errors.New("invalid stream ID")
1126 http2errDepStreamID = errors.New("invalid dependent stream ID")
1127 http2errPadLength = errors.New("pad length too large")
1128 )
1129
1130 func http2validStreamIDOrZero(streamID uint32) bool {
1131 return streamID&(1<<31) == 0
1132 }
1133
1134 func http2validStreamID(streamID uint32) bool {
1135 return streamID != 0 && streamID&(1<<31) == 0
1136 }
1137
1138
1139
1140
1141
1142
1143 func (f *http2Framer) WriteData(streamID uint32, endStream bool, data []byte) error {
1144 return f.WriteDataPadded(streamID, endStream, data, nil)
1145 }
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155 func (f *http2Framer) WriteDataPadded(streamID uint32, endStream bool, data, pad []byte) error {
1156 if !http2validStreamID(streamID) && !f.AllowIllegalWrites {
1157 return http2errStreamID
1158 }
1159 if len(pad) > 255 {
1160 return http2errPadLength
1161 }
1162 var flags http2Flags
1163 if endStream {
1164 flags |= http2FlagDataEndStream
1165 }
1166 if pad != nil {
1167 flags |= http2FlagDataPadded
1168 }
1169 f.startWrite(http2FrameData, flags, streamID)
1170 if pad != nil {
1171 f.wbuf = append(f.wbuf, byte(len(pad)))
1172 }
1173 f.wbuf = append(f.wbuf, data...)
1174 f.wbuf = append(f.wbuf, pad...)
1175 return f.endWrite()
1176 }
1177
1178
1179
1180
1181
1182
1183 type http2SettingsFrame struct {
1184 http2FrameHeader
1185 p []byte
1186 }
1187
1188 func http2parseSettingsFrame(fh http2FrameHeader, p []byte) (http2Frame, error) {
1189 if fh.Flags.Has(http2FlagSettingsAck) && fh.Length > 0 {
1190
1191 return nil, http2ConnectionError(http2ErrCodeFrameSize)
1192 }
1193 if fh.StreamID != 0 {
1194
1195 return nil, http2ConnectionError(http2ErrCodeProtocol)
1196 }
1197 if len(p)%6 != 0 {
1198
1199 return nil, http2ConnectionError(http2ErrCodeFrameSize)
1200 }
1201 f := &http2SettingsFrame{http2FrameHeader: fh, p: p}
1202 if v, ok := f.Value(http2SettingInitialWindowSize); ok && v > (1<<31)-1 {
1203
1204 return nil, http2ConnectionError(http2ErrCodeFlowControl)
1205 }
1206 return f, nil
1207 }
1208
1209 func (f *http2SettingsFrame) IsAck() bool {
1210 return f.http2FrameHeader.Flags.Has(http2FlagSettingsAck)
1211 }
1212
1213 func (f *http2SettingsFrame) Value(s http2SettingID) (v uint32, ok bool) {
1214 f.checkValid()
1215 buf := f.p
1216 for len(buf) > 0 {
1217 settingID := http2SettingID(binary.BigEndian.Uint16(buf[:2]))
1218 if settingID == s {
1219 return binary.BigEndian.Uint32(buf[2:6]), true
1220 }
1221 buf = buf[6:]
1222 }
1223 return 0, false
1224 }
1225
1226
1227
1228 func (f *http2SettingsFrame) ForeachSetting(fn func(http2Setting) error) error {
1229 f.checkValid()
1230 buf := f.p
1231 for len(buf) > 0 {
1232 if err := fn(http2Setting{
1233 http2SettingID(binary.BigEndian.Uint16(buf[:2])),
1234 binary.BigEndian.Uint32(buf[2:6]),
1235 }); err != nil {
1236 return err
1237 }
1238 buf = buf[6:]
1239 }
1240 return nil
1241 }
1242
1243
1244
1245
1246
1247
1248 func (f *http2Framer) WriteSettings(settings ...http2Setting) error {
1249 f.startWrite(http2FrameSettings, 0, 0)
1250 for _, s := range settings {
1251 f.writeUint16(uint16(s.ID))
1252 f.writeUint32(s.Val)
1253 }
1254 return f.endWrite()
1255 }
1256
1257
1258
1259
1260
1261 func (f *http2Framer) WriteSettingsAck() error {
1262 f.startWrite(http2FrameSettings, http2FlagSettingsAck, 0)
1263 return f.endWrite()
1264 }
1265
1266
1267
1268
1269
1270 type http2PingFrame struct {
1271 http2FrameHeader
1272 Data [8]byte
1273 }
1274
1275 func (f *http2PingFrame) IsAck() bool { return f.Flags.Has(http2FlagPingAck) }
1276
1277 func http2parsePingFrame(fh http2FrameHeader, payload []byte) (http2Frame, error) {
1278 if len(payload) != 8 {
1279 return nil, http2ConnectionError(http2ErrCodeFrameSize)
1280 }
1281 if fh.StreamID != 0 {
1282 return nil, http2ConnectionError(http2ErrCodeProtocol)
1283 }
1284 f := &http2PingFrame{http2FrameHeader: fh}
1285 copy(f.Data[:], payload)
1286 return f, nil
1287 }
1288
1289 func (f *http2Framer) WritePing(ack bool, data [8]byte) error {
1290 var flags http2Flags
1291 if ack {
1292 flags = http2FlagPingAck
1293 }
1294 f.startWrite(http2FramePing, flags, 0)
1295 f.writeBytes(data[:])
1296 return f.endWrite()
1297 }
1298
1299
1300
1301 type http2GoAwayFrame struct {
1302 http2FrameHeader
1303 LastStreamID uint32
1304 ErrCode http2ErrCode
1305 debugData []byte
1306 }
1307
1308
1309
1310
1311
1312 func (f *http2GoAwayFrame) DebugData() []byte {
1313 f.checkValid()
1314 return f.debugData
1315 }
1316
1317 func http2parseGoAwayFrame(fh http2FrameHeader, p []byte) (http2Frame, error) {
1318 if fh.StreamID != 0 {
1319 return nil, http2ConnectionError(http2ErrCodeProtocol)
1320 }
1321 if len(p) < 8 {
1322 return nil, http2ConnectionError(http2ErrCodeFrameSize)
1323 }
1324 return &http2GoAwayFrame{
1325 http2FrameHeader: fh,
1326 LastStreamID: binary.BigEndian.Uint32(p[:4]) & (1<<31 - 1),
1327 ErrCode: http2ErrCode(binary.BigEndian.Uint32(p[4:8])),
1328 debugData: p[8:],
1329 }, nil
1330 }
1331
1332 func (f *http2Framer) WriteGoAway(maxStreamID uint32, code http2ErrCode, debugData []byte) error {
1333 f.startWrite(http2FrameGoAway, 0, 0)
1334 f.writeUint32(maxStreamID & (1<<31 - 1))
1335 f.writeUint32(uint32(code))
1336 f.writeBytes(debugData)
1337 return f.endWrite()
1338 }
1339
1340
1341
1342 type http2UnknownFrame struct {
1343 http2FrameHeader
1344 p []byte
1345 }
1346
1347
1348
1349
1350
1351
1352 func (f *http2UnknownFrame) Payload() []byte {
1353 f.checkValid()
1354 return f.p
1355 }
1356
1357 func http2parseUnknownFrame(fh http2FrameHeader, p []byte) (http2Frame, error) {
1358 return &http2UnknownFrame{fh, p}, nil
1359 }
1360
1361
1362
1363 type http2WindowUpdateFrame struct {
1364 http2FrameHeader
1365 Increment uint32
1366 }
1367
1368 func http2parseWindowUpdateFrame(fh http2FrameHeader, p []byte) (http2Frame, error) {
1369 if len(p) != 4 {
1370 return nil, http2ConnectionError(http2ErrCodeFrameSize)
1371 }
1372 inc := binary.BigEndian.Uint32(p[:4]) & 0x7fffffff
1373 if inc == 0 {
1374
1375 if fh.StreamID == 0 {
1376 return nil, http2ConnectionError(http2ErrCodeProtocol)
1377 }
1378 return nil, http2streamError(fh.StreamID, http2ErrCodeProtocol)
1379 }
1380 return &http2WindowUpdateFrame{
1381 http2FrameHeader: fh,
1382 Increment: inc,
1383 }, nil
1384 }
1385
1386
1387
1388
1389
1390 func (f *http2Framer) WriteWindowUpdate(streamID, incr uint32) error {
1391
1392 if (incr < 1 || incr > 2147483647) && !f.AllowIllegalWrites {
1393 return errors.New("illegal window increment value")
1394 }
1395 f.startWrite(http2FrameWindowUpdate, 0, streamID)
1396 f.writeUint32(incr)
1397 return f.endWrite()
1398 }
1399
1400
1401
1402 type http2HeadersFrame struct {
1403 http2FrameHeader
1404
1405
1406 Priority http2PriorityParam
1407
1408 headerFragBuf []byte
1409 }
1410
1411 func (f *http2HeadersFrame) HeaderBlockFragment() []byte {
1412 f.checkValid()
1413 return f.headerFragBuf
1414 }
1415
1416 func (f *http2HeadersFrame) HeadersEnded() bool {
1417 return f.http2FrameHeader.Flags.Has(http2FlagHeadersEndHeaders)
1418 }
1419
1420 func (f *http2HeadersFrame) StreamEnded() bool {
1421 return f.http2FrameHeader.Flags.Has(http2FlagHeadersEndStream)
1422 }
1423
1424 func (f *http2HeadersFrame) HasPriority() bool {
1425 return f.http2FrameHeader.Flags.Has(http2FlagHeadersPriority)
1426 }
1427
1428 func http2parseHeadersFrame(fh http2FrameHeader, p []byte) (_ http2Frame, err error) {
1429 hf := &http2HeadersFrame{
1430 http2FrameHeader: fh,
1431 }
1432 if fh.StreamID == 0 {
1433
1434 return nil, http2connError{http2ErrCodeProtocol, "HEADERS frame with stream ID 0"}
1435 }
1436 var padLength uint8
1437 if fh.Flags.Has(http2FlagHeadersPadded) {
1438 if p, padLength, err = http2readByte(p); err != nil {
1439 return
1440 }
1441 }
1442 if fh.Flags.Has(http2FlagHeadersPriority) {
1443 var v uint32
1444 p, v, err = http2readUint32(p)
1445 if err != nil {
1446 return nil, err
1447 }
1448 hf.Priority.StreamDep = v & 0x7fffffff
1449 hf.Priority.Exclusive = (v != hf.Priority.StreamDep)
1450 p, hf.Priority.Weight, err = http2readByte(p)
1451 if err != nil {
1452 return nil, err
1453 }
1454 }
1455 if len(p)-int(padLength) <= 0 {
1456 return nil, http2streamError(fh.StreamID, http2ErrCodeProtocol)
1457 }
1458 hf.headerFragBuf = p[:len(p)-int(padLength)]
1459 return hf, nil
1460 }
1461
1462
1463 type http2HeadersFrameParam struct {
1464
1465 StreamID uint32
1466
1467 BlockFragment []byte
1468
1469
1470
1471
1472
1473 EndStream bool
1474
1475
1476
1477
1478 EndHeaders bool
1479
1480
1481
1482 PadLength uint8
1483
1484
1485
1486 Priority http2PriorityParam
1487 }
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497 func (f *http2Framer) WriteHeaders(p http2HeadersFrameParam) error {
1498 if !http2validStreamID(p.StreamID) && !f.AllowIllegalWrites {
1499 return http2errStreamID
1500 }
1501 var flags http2Flags
1502 if p.PadLength != 0 {
1503 flags |= http2FlagHeadersPadded
1504 }
1505 if p.EndStream {
1506 flags |= http2FlagHeadersEndStream
1507 }
1508 if p.EndHeaders {
1509 flags |= http2FlagHeadersEndHeaders
1510 }
1511 if !p.Priority.IsZero() {
1512 flags |= http2FlagHeadersPriority
1513 }
1514 f.startWrite(http2FrameHeaders, flags, p.StreamID)
1515 if p.PadLength != 0 {
1516 f.writeByte(p.PadLength)
1517 }
1518 if !p.Priority.IsZero() {
1519 v := p.Priority.StreamDep
1520 if !http2validStreamIDOrZero(v) && !f.AllowIllegalWrites {
1521 return http2errDepStreamID
1522 }
1523 if p.Priority.Exclusive {
1524 v |= 1 << 31
1525 }
1526 f.writeUint32(v)
1527 f.writeByte(p.Priority.Weight)
1528 }
1529 f.wbuf = append(f.wbuf, p.BlockFragment...)
1530 f.wbuf = append(f.wbuf, http2padZeros[:p.PadLength]...)
1531 return f.endWrite()
1532 }
1533
1534
1535
1536 type http2PriorityFrame struct {
1537 http2FrameHeader
1538 http2PriorityParam
1539 }
1540
1541
1542 type http2PriorityParam struct {
1543
1544
1545
1546 StreamDep uint32
1547
1548
1549 Exclusive bool
1550
1551
1552
1553
1554
1555 Weight uint8
1556 }
1557
1558 func (p http2PriorityParam) IsZero() bool {
1559 return p == http2PriorityParam{}
1560 }
1561
1562 func http2parsePriorityFrame(fh http2FrameHeader, payload []byte) (http2Frame, error) {
1563 if fh.StreamID == 0 {
1564 return nil, http2connError{http2ErrCodeProtocol, "PRIORITY frame with stream ID 0"}
1565 }
1566 if len(payload) != 5 {
1567 return nil, http2connError{http2ErrCodeFrameSize, fmt.Sprintf("PRIORITY frame payload size was %d; want 5", len(payload))}
1568 }
1569 v := binary.BigEndian.Uint32(payload[:4])
1570 streamID := v & 0x7fffffff
1571 return &http2PriorityFrame{
1572 http2FrameHeader: fh,
1573 http2PriorityParam: http2PriorityParam{
1574 Weight: payload[4],
1575 StreamDep: streamID,
1576 Exclusive: streamID != v,
1577 },
1578 }, nil
1579 }
1580
1581
1582
1583
1584
1585 func (f *http2Framer) WritePriority(streamID uint32, p http2PriorityParam) error {
1586 if !http2validStreamID(streamID) && !f.AllowIllegalWrites {
1587 return http2errStreamID
1588 }
1589 if !http2validStreamIDOrZero(p.StreamDep) {
1590 return http2errDepStreamID
1591 }
1592 f.startWrite(http2FramePriority, 0, streamID)
1593 v := p.StreamDep
1594 if p.Exclusive {
1595 v |= 1 << 31
1596 }
1597 f.writeUint32(v)
1598 f.writeByte(p.Weight)
1599 return f.endWrite()
1600 }
1601
1602
1603
1604 type http2RSTStreamFrame struct {
1605 http2FrameHeader
1606 ErrCode http2ErrCode
1607 }
1608
1609 func http2parseRSTStreamFrame(fh http2FrameHeader, p []byte) (http2Frame, error) {
1610 if len(p) != 4 {
1611 return nil, http2ConnectionError(http2ErrCodeFrameSize)
1612 }
1613 if fh.StreamID == 0 {
1614 return nil, http2ConnectionError(http2ErrCodeProtocol)
1615 }
1616 return &http2RSTStreamFrame{fh, http2ErrCode(binary.BigEndian.Uint32(p[:4]))}, nil
1617 }
1618
1619
1620
1621
1622
1623 func (f *http2Framer) WriteRSTStream(streamID uint32, code http2ErrCode) error {
1624 if !http2validStreamID(streamID) && !f.AllowIllegalWrites {
1625 return http2errStreamID
1626 }
1627 f.startWrite(http2FrameRSTStream, 0, streamID)
1628 f.writeUint32(uint32(code))
1629 return f.endWrite()
1630 }
1631
1632
1633
1634 type http2ContinuationFrame struct {
1635 http2FrameHeader
1636 headerFragBuf []byte
1637 }
1638
1639 func http2parseContinuationFrame(fh http2FrameHeader, p []byte) (http2Frame, error) {
1640 if fh.StreamID == 0 {
1641 return nil, http2connError{http2ErrCodeProtocol, "CONTINUATION frame with stream ID 0"}
1642 }
1643 return &http2ContinuationFrame{fh, p}, nil
1644 }
1645
1646 func (f *http2ContinuationFrame) HeaderBlockFragment() []byte {
1647 f.checkValid()
1648 return f.headerFragBuf
1649 }
1650
1651 func (f *http2ContinuationFrame) HeadersEnded() bool {
1652 return f.http2FrameHeader.Flags.Has(http2FlagContinuationEndHeaders)
1653 }
1654
1655
1656
1657
1658
1659 func (f *http2Framer) WriteContinuation(streamID uint32, endHeaders bool, headerBlockFragment []byte) error {
1660 if !http2validStreamID(streamID) && !f.AllowIllegalWrites {
1661 return http2errStreamID
1662 }
1663 var flags http2Flags
1664 if endHeaders {
1665 flags |= http2FlagContinuationEndHeaders
1666 }
1667 f.startWrite(http2FrameContinuation, flags, streamID)
1668 f.wbuf = append(f.wbuf, headerBlockFragment...)
1669 return f.endWrite()
1670 }
1671
1672
1673
1674 type http2PushPromiseFrame struct {
1675 http2FrameHeader
1676 PromiseID uint32
1677 headerFragBuf []byte
1678 }
1679
1680 func (f *http2PushPromiseFrame) HeaderBlockFragment() []byte {
1681 f.checkValid()
1682 return f.headerFragBuf
1683 }
1684
1685 func (f *http2PushPromiseFrame) HeadersEnded() bool {
1686 return f.http2FrameHeader.Flags.Has(http2FlagPushPromiseEndHeaders)
1687 }
1688
1689 func http2parsePushPromise(fh http2FrameHeader, p []byte) (_ http2Frame, err error) {
1690 pp := &http2PushPromiseFrame{
1691 http2FrameHeader: fh,
1692 }
1693 if pp.StreamID == 0 {
1694
1695 return nil, http2ConnectionError(http2ErrCodeProtocol)
1696 }
1697
1698
1699 var padLength uint8
1700 if fh.Flags.Has(http2FlagPushPromisePadded) {
1701 if p, padLength, err = http2readByte(p); err != nil {
1702 return
1703 }
1704 }
1705
1706 p, pp.PromiseID, err = http2readUint32(p)
1707 if err != nil {
1708 return
1709 }
1710 pp.PromiseID = pp.PromiseID & (1<<31 - 1)
1711
1712 if int(padLength) > len(p) {
1713
1714 return nil, http2ConnectionError(http2ErrCodeProtocol)
1715 }
1716 pp.headerFragBuf = p[:len(p)-int(padLength)]
1717 return pp, nil
1718 }
1719
1720
1721 type http2PushPromiseParam struct {
1722
1723 StreamID uint32
1724
1725
1726
1727 PromiseID uint32
1728
1729
1730 BlockFragment []byte
1731
1732
1733
1734
1735 EndHeaders bool
1736
1737
1738
1739 PadLength uint8
1740 }
1741
1742
1743
1744
1745
1746
1747
1748
1749 func (f *http2Framer) WritePushPromise(p http2PushPromiseParam) error {
1750 if !http2validStreamID(p.StreamID) && !f.AllowIllegalWrites {
1751 return http2errStreamID
1752 }
1753 var flags http2Flags
1754 if p.PadLength != 0 {
1755 flags |= http2FlagPushPromisePadded
1756 }
1757 if p.EndHeaders {
1758 flags |= http2FlagPushPromiseEndHeaders
1759 }
1760 f.startWrite(http2FramePushPromise, flags, p.StreamID)
1761 if p.PadLength != 0 {
1762 f.writeByte(p.PadLength)
1763 }
1764 if !http2validStreamID(p.PromiseID) && !f.AllowIllegalWrites {
1765 return http2errStreamID
1766 }
1767 f.writeUint32(p.PromiseID)
1768 f.wbuf = append(f.wbuf, p.BlockFragment...)
1769 f.wbuf = append(f.wbuf, http2padZeros[:p.PadLength]...)
1770 return f.endWrite()
1771 }
1772
1773
1774
1775 func (f *http2Framer) WriteRawFrame(t http2FrameType, flags http2Flags, streamID uint32, payload []byte) error {
1776 f.startWrite(t, flags, streamID)
1777 f.writeBytes(payload)
1778 return f.endWrite()
1779 }
1780
1781 func http2readByte(p []byte) (remain []byte, b byte, err error) {
1782 if len(p) == 0 {
1783 return nil, 0, io.ErrUnexpectedEOF
1784 }
1785 return p[1:], p[0], nil
1786 }
1787
1788 func http2readUint32(p []byte) (remain []byte, v uint32, err error) {
1789 if len(p) < 4 {
1790 return nil, 0, io.ErrUnexpectedEOF
1791 }
1792 return p[4:], binary.BigEndian.Uint32(p[:4]), nil
1793 }
1794
1795 type http2streamEnder interface {
1796 StreamEnded() bool
1797 }
1798
1799 type http2headersEnder interface {
1800 HeadersEnded() bool
1801 }
1802
1803 type http2headersOrContinuation interface {
1804 http2headersEnder
1805 HeaderBlockFragment() []byte
1806 }
1807
1808
1809
1810
1811
1812
1813
1814 type http2MetaHeadersFrame struct {
1815 *http2HeadersFrame
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827 Fields []hpack.HeaderField
1828
1829
1830
1831
1832 Truncated bool
1833 }
1834
1835
1836
1837 func (mh *http2MetaHeadersFrame) PseudoValue(pseudo string) string {
1838 for _, hf := range mh.Fields {
1839 if !hf.IsPseudo() {
1840 return ""
1841 }
1842 if hf.Name[1:] == pseudo {
1843 return hf.Value
1844 }
1845 }
1846 return ""
1847 }
1848
1849
1850
1851 func (mh *http2MetaHeadersFrame) RegularFields() []hpack.HeaderField {
1852 for i, hf := range mh.Fields {
1853 if !hf.IsPseudo() {
1854 return mh.Fields[i:]
1855 }
1856 }
1857 return nil
1858 }
1859
1860
1861
1862 func (mh *http2MetaHeadersFrame) PseudoFields() []hpack.HeaderField {
1863 for i, hf := range mh.Fields {
1864 if !hf.IsPseudo() {
1865 return mh.Fields[:i]
1866 }
1867 }
1868 return mh.Fields
1869 }
1870
1871 func (mh *http2MetaHeadersFrame) checkPseudos() error {
1872 var isRequest, isResponse bool
1873 pf := mh.PseudoFields()
1874 for i, hf := range pf {
1875 switch hf.Name {
1876 case ":method", ":path", ":scheme", ":authority":
1877 isRequest = true
1878 case ":status":
1879 isResponse = true
1880 default:
1881 return http2pseudoHeaderError(hf.Name)
1882 }
1883
1884 for _, hf2 := range pf[:i] {
1885 if hf.Name == hf2.Name {
1886 return http2duplicatePseudoHeaderError(hf.Name)
1887 }
1888 }
1889 }
1890 if isRequest && isResponse {
1891 return http2errMixPseudoHeaderTypes
1892 }
1893 return nil
1894 }
1895
1896 func (fr *http2Framer) maxHeaderStringLen() int {
1897 v := fr.maxHeaderListSize()
1898 if uint32(int(v)) == v {
1899 return int(v)
1900 }
1901
1902 return 0
1903 }
1904
1905
1906
1907
1908 func (fr *http2Framer) readMetaFrame(hf *http2HeadersFrame) (*http2MetaHeadersFrame, error) {
1909 if fr.AllowIllegalReads {
1910 return nil, errors.New("illegal use of AllowIllegalReads with ReadMetaHeaders")
1911 }
1912 mh := &http2MetaHeadersFrame{
1913 http2HeadersFrame: hf,
1914 }
1915 var remainSize = fr.maxHeaderListSize()
1916 var sawRegular bool
1917
1918 var invalid error
1919 hdec := fr.ReadMetaHeaders
1920 hdec.SetEmitEnabled(true)
1921 hdec.SetMaxStringLength(fr.maxHeaderStringLen())
1922 hdec.SetEmitFunc(func(hf hpack.HeaderField) {
1923 if http2VerboseLogs && http2logFrameReads {
1924 log.Printf("http2: decoded hpack field %+v", hf)
1925 }
1926 if !httplex.ValidHeaderFieldValue(hf.Value) {
1927 invalid = http2headerFieldValueError(hf.Value)
1928 }
1929 isPseudo := strings.HasPrefix(hf.Name, ":")
1930 if isPseudo {
1931 if sawRegular {
1932 invalid = http2errPseudoAfterRegular
1933 }
1934 } else {
1935 sawRegular = true
1936 if !http2validWireHeaderFieldName(hf.Name) {
1937 invalid = http2headerFieldNameError(hf.Name)
1938 }
1939 }
1940
1941 if invalid != nil {
1942 hdec.SetEmitEnabled(false)
1943 return
1944 }
1945
1946 size := hf.Size()
1947 if size > remainSize {
1948 hdec.SetEmitEnabled(false)
1949 mh.Truncated = true
1950 return
1951 }
1952 remainSize -= size
1953
1954 mh.Fields = append(mh.Fields, hf)
1955 })
1956
1957 defer hdec.SetEmitFunc(func(hf hpack.HeaderField) {})
1958
1959 var hc http2headersOrContinuation = hf
1960 for {
1961 frag := hc.HeaderBlockFragment()
1962 if _, err := hdec.Write(frag); err != nil {
1963 return nil, http2ConnectionError(http2ErrCodeCompression)
1964 }
1965
1966 if hc.HeadersEnded() {
1967 break
1968 }
1969 if f, err := fr.ReadFrame(); err != nil {
1970 return nil, err
1971 } else {
1972 hc = f.(*http2ContinuationFrame)
1973 }
1974 }
1975
1976 mh.http2HeadersFrame.headerFragBuf = nil
1977 mh.http2HeadersFrame.invalidate()
1978
1979 if err := hdec.Close(); err != nil {
1980 return nil, http2ConnectionError(http2ErrCodeCompression)
1981 }
1982 if invalid != nil {
1983 fr.errDetail = invalid
1984 if http2VerboseLogs {
1985 log.Printf("http2: invalid header: %v", invalid)
1986 }
1987 return nil, http2StreamError{mh.StreamID, http2ErrCodeProtocol, invalid}
1988 }
1989 if err := mh.checkPseudos(); err != nil {
1990 fr.errDetail = err
1991 if http2VerboseLogs {
1992 log.Printf("http2: invalid pseudo headers: %v", err)
1993 }
1994 return nil, http2StreamError{mh.StreamID, http2ErrCodeProtocol, err}
1995 }
1996 return mh, nil
1997 }
1998
1999 func http2summarizeFrame(f http2Frame) string {
2000 var buf bytes.Buffer
2001 f.Header().writeDebug(&buf)
2002 switch f := f.(type) {
2003 case *http2SettingsFrame:
2004 n := 0
2005 f.ForeachSetting(func(s http2Setting) error {
2006 n++
2007 if n == 1 {
2008 buf.WriteString(", settings:")
2009 }
2010 fmt.Fprintf(&buf, " %v=%v,", s.ID, s.Val)
2011 return nil
2012 })
2013 if n > 0 {
2014 buf.Truncate(buf.Len() - 1)
2015 }
2016 case *http2DataFrame:
2017 data := f.Data()
2018 const max = 256
2019 if len(data) > max {
2020 data = data[:max]
2021 }
2022 fmt.Fprintf(&buf, " data=%q", data)
2023 if len(f.Data()) > max {
2024 fmt.Fprintf(&buf, " (%d bytes omitted)", len(f.Data())-max)
2025 }
2026 case *http2WindowUpdateFrame:
2027 if f.StreamID == 0 {
2028 buf.WriteString(" (conn)")
2029 }
2030 fmt.Fprintf(&buf, " incr=%v", f.Increment)
2031 case *http2PingFrame:
2032 fmt.Fprintf(&buf, " ping=%q", f.Data[:])
2033 case *http2GoAwayFrame:
2034 fmt.Fprintf(&buf, " LastStreamID=%v ErrCode=%v Debug=%q",
2035 f.LastStreamID, f.ErrCode, f.debugData)
2036 case *http2RSTStreamFrame:
2037 fmt.Fprintf(&buf, " ErrCode=%v", f.ErrCode)
2038 }
2039 return buf.String()
2040 }
2041
2042 func http2transportExpectContinueTimeout(t1 *Transport) time.Duration {
2043 return t1.ExpectContinueTimeout
2044 }
2045
2046
2047 func http2isBadCipher(cipher uint16) bool {
2048 switch cipher {
2049 case tls.TLS_RSA_WITH_RC4_128_SHA,
2050 tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
2051 tls.TLS_RSA_WITH_AES_128_CBC_SHA,
2052 tls.TLS_RSA_WITH_AES_256_CBC_SHA,
2053 tls.TLS_RSA_WITH_AES_128_GCM_SHA256,
2054 tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
2055 tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
2056 tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
2057 tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
2058 tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA,
2059 tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
2060 tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
2061 tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
2062
2063 return true
2064 default:
2065 return false
2066 }
2067 }
2068
2069 type http2contextContext interface {
2070 context.Context
2071 }
2072
2073 func http2serverConnBaseContext(c net.Conn, opts *http2ServeConnOpts) (ctx http2contextContext, cancel func()) {
2074 ctx, cancel = context.WithCancel(context.Background())
2075 ctx = context.WithValue(ctx, LocalAddrContextKey, c.LocalAddr())
2076 if hs := opts.baseConfig(); hs != nil {
2077 ctx = context.WithValue(ctx, ServerContextKey, hs)
2078 }
2079 return
2080 }
2081
2082 func http2contextWithCancel(ctx http2contextContext) (_ http2contextContext, cancel func()) {
2083 return context.WithCancel(ctx)
2084 }
2085
2086 func http2requestWithContext(req *Request, ctx http2contextContext) *Request {
2087 return req.WithContext(ctx)
2088 }
2089
2090 type http2clientTrace httptrace.ClientTrace
2091
2092 func http2reqContext(r *Request) context.Context { return r.Context() }
2093
2094 func http2setResponseUncompressed(res *Response) { res.Uncompressed = true }
2095
2096 func http2traceGotConn(req *Request, cc *http2ClientConn) {
2097 trace := httptrace.ContextClientTrace(req.Context())
2098 if trace == nil || trace.GotConn == nil {
2099 return
2100 }
2101 ci := httptrace.GotConnInfo{Conn: cc.tconn}
2102 cc.mu.Lock()
2103 ci.Reused = cc.nextStreamID > 1
2104 ci.WasIdle = len(cc.streams) == 0 && ci.Reused
2105 if ci.WasIdle && !cc.lastActive.IsZero() {
2106 ci.IdleTime = time.Now().Sub(cc.lastActive)
2107 }
2108 cc.mu.Unlock()
2109
2110 trace.GotConn(ci)
2111 }
2112
2113 func http2traceWroteHeaders(trace *http2clientTrace) {
2114 if trace != nil && trace.WroteHeaders != nil {
2115 trace.WroteHeaders()
2116 }
2117 }
2118
2119 func http2traceGot100Continue(trace *http2clientTrace) {
2120 if trace != nil && trace.Got100Continue != nil {
2121 trace.Got100Continue()
2122 }
2123 }
2124
2125 func http2traceWait100Continue(trace *http2clientTrace) {
2126 if trace != nil && trace.Wait100Continue != nil {
2127 trace.Wait100Continue()
2128 }
2129 }
2130
2131 func http2traceWroteRequest(trace *http2clientTrace, err error) {
2132 if trace != nil && trace.WroteRequest != nil {
2133 trace.WroteRequest(httptrace.WroteRequestInfo{Err: err})
2134 }
2135 }
2136
2137 func http2traceFirstResponseByte(trace *http2clientTrace) {
2138 if trace != nil && trace.GotFirstResponseByte != nil {
2139 trace.GotFirstResponseByte()
2140 }
2141 }
2142
2143 func http2requestTrace(req *Request) *http2clientTrace {
2144 trace := httptrace.ContextClientTrace(req.Context())
2145 return (*http2clientTrace)(trace)
2146 }
2147
2148 var http2DebugGoroutines = os.Getenv("DEBUG_HTTP2_GOROUTINES") == "1"
2149
2150 type http2goroutineLock uint64
2151
2152 func http2newGoroutineLock() http2goroutineLock {
2153 if !http2DebugGoroutines {
2154 return 0
2155 }
2156 return http2goroutineLock(http2curGoroutineID())
2157 }
2158
2159 func (g http2goroutineLock) check() {
2160 if !http2DebugGoroutines {
2161 return
2162 }
2163 if http2curGoroutineID() != uint64(g) {
2164 panic("running on the wrong goroutine")
2165 }
2166 }
2167
2168 func (g http2goroutineLock) checkNotOn() {
2169 if !http2DebugGoroutines {
2170 return
2171 }
2172 if http2curGoroutineID() == uint64(g) {
2173 panic("running on the wrong goroutine")
2174 }
2175 }
2176
2177 var http2goroutineSpace = []byte("goroutine ")
2178
2179 func http2curGoroutineID() uint64 {
2180 bp := http2littleBuf.Get().(*[]byte)
2181 defer http2littleBuf.Put(bp)
2182 b := *bp
2183 b = b[:runtime.Stack(b, false)]
2184
2185 b = bytes.TrimPrefix(b, http2goroutineSpace)
2186 i := bytes.IndexByte(b, ' ')
2187 if i < 0 {
2188 panic(fmt.Sprintf("No space found in %q", b))
2189 }
2190 b = b[:i]
2191 n, err := http2parseUintBytes(b, 10, 64)
2192 if err != nil {
2193 panic(fmt.Sprintf("Failed to parse goroutine ID out of %q: %v", b, err))
2194 }
2195 return n
2196 }
2197
2198 var http2littleBuf = sync.Pool{
2199 New: func() interface{} {
2200 buf := make([]byte, 64)
2201 return &buf
2202 },
2203 }
2204
2205
2206 func http2parseUintBytes(s []byte, base int, bitSize int) (n uint64, err error) {
2207 var cutoff, maxVal uint64
2208
2209 if bitSize == 0 {
2210 bitSize = int(strconv.IntSize)
2211 }
2212
2213 s0 := s
2214 switch {
2215 case len(s) < 1:
2216 err = strconv.ErrSyntax
2217 goto Error
2218
2219 case 2 <= base && base <= 36:
2220
2221 case base == 0:
2222
2223 switch {
2224 case s[0] == '0' && len(s) > 1 && (s[1] == 'x' || s[1] == 'X'):
2225 base = 16
2226 s = s[2:]
2227 if len(s) < 1 {
2228 err = strconv.ErrSyntax
2229 goto Error
2230 }
2231 case s[0] == '0':
2232 base = 8
2233 default:
2234 base = 10
2235 }
2236
2237 default:
2238 err = errors.New("invalid base " + strconv.Itoa(base))
2239 goto Error
2240 }
2241
2242 n = 0
2243 cutoff = http2cutoff64(base)
2244 maxVal = 1<<uint(bitSize) - 1
2245
2246 for i := 0; i < len(s); i++ {
2247 var v byte
2248 d := s[i]
2249 switch {
2250 case '0' <= d && d <= '9':
2251 v = d - '0'
2252 case 'a' <= d && d <= 'z':
2253 v = d - 'a' + 10
2254 case 'A' <= d && d <= 'Z':
2255 v = d - 'A' + 10
2256 default:
2257 n = 0
2258 err = strconv.ErrSyntax
2259 goto Error
2260 }
2261 if int(v) >= base {
2262 n = 0
2263 err = strconv.ErrSyntax
2264 goto Error
2265 }
2266
2267 if n >= cutoff {
2268
2269 n = 1<<64 - 1
2270 err = strconv.ErrRange
2271 goto Error
2272 }
2273 n *= uint64(base)
2274
2275 n1 := n + uint64(v)
2276 if n1 < n || n1 > maxVal {
2277
2278 n = 1<<64 - 1
2279 err = strconv.ErrRange
2280 goto Error
2281 }
2282 n = n1
2283 }
2284
2285 return n, nil
2286
2287 Error:
2288 return n, &strconv.NumError{Func: "ParseUint", Num: string(s0), Err: err}
2289 }
2290
2291
2292 func http2cutoff64(base int) uint64 {
2293 if base < 2 {
2294 return 0
2295 }
2296 return (1<<64-1)/uint64(base) + 1
2297 }
2298
2299 var (
2300 http2commonLowerHeader = map[string]string{}
2301 http2commonCanonHeader = map[string]string{}
2302 )
2303
2304 func init() {
2305 for _, v := range []string{
2306 "accept",
2307 "accept-charset",
2308 "accept-encoding",
2309 "accept-language",
2310 "accept-ranges",
2311 "age",
2312 "access-control-allow-origin",
2313 "allow",
2314 "authorization",
2315 "cache-control",
2316 "content-disposition",
2317 "content-encoding",
2318 "content-language",
2319 "content-length",
2320 "content-location",
2321 "content-range",
2322 "content-type",
2323 "cookie",
2324 "date",
2325 "etag",
2326 "expect",
2327 "expires",
2328 "from",
2329 "host",
2330 "if-match",
2331 "if-modified-since",
2332 "if-none-match",
2333 "if-unmodified-since",
2334 "last-modified",
2335 "link",
2336 "location",
2337 "max-forwards",
2338 "proxy-authenticate",
2339 "proxy-authorization",
2340 "range",
2341 "referer",
2342 "refresh",
2343 "retry-after",
2344 "server",
2345 "set-cookie",
2346 "strict-transport-security",
2347 "trailer",
2348 "transfer-encoding",
2349 "user-agent",
2350 "vary",
2351 "via",
2352 "www-authenticate",
2353 } {
2354 chk := CanonicalHeaderKey(v)
2355 http2commonLowerHeader[chk] = v
2356 http2commonCanonHeader[v] = chk
2357 }
2358 }
2359
2360 func http2lowerHeader(v string) string {
2361 if s, ok := http2commonLowerHeader[v]; ok {
2362 return s
2363 }
2364 return strings.ToLower(v)
2365 }
2366
2367 var (
2368 http2VerboseLogs bool
2369 http2logFrameWrites bool
2370 http2logFrameReads bool
2371 )
2372
2373 func init() {
2374 e := os.Getenv("GODEBUG")
2375 if strings.Contains(e, "http2debug=1") {
2376 http2VerboseLogs = true
2377 }
2378 if strings.Contains(e, "http2debug=2") {
2379 http2VerboseLogs = true
2380 http2logFrameWrites = true
2381 http2logFrameReads = true
2382 }
2383 }
2384
2385 const (
2386
2387
2388 http2ClientPreface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
2389
2390
2391
2392 http2initialMaxFrameSize = 16384
2393
2394
2395
2396 http2NextProtoTLS = "h2"
2397
2398
2399 http2initialHeaderTableSize = 4096
2400
2401 http2initialWindowSize = 65535
2402
2403 http2defaultMaxReadFrameSize = 1 << 20
2404 )
2405
2406 var (
2407 http2clientPreface = []byte(http2ClientPreface)
2408 )
2409
2410 type http2streamState int
2411
2412 const (
2413 http2stateIdle http2streamState = iota
2414 http2stateOpen
2415 http2stateHalfClosedLocal
2416 http2stateHalfClosedRemote
2417 http2stateResvLocal
2418 http2stateResvRemote
2419 http2stateClosed
2420 )
2421
2422 var http2stateName = [...]string{
2423 http2stateIdle: "Idle",
2424 http2stateOpen: "Open",
2425 http2stateHalfClosedLocal: "HalfClosedLocal",
2426 http2stateHalfClosedRemote: "HalfClosedRemote",
2427 http2stateResvLocal: "ResvLocal",
2428 http2stateResvRemote: "ResvRemote",
2429 http2stateClosed: "Closed",
2430 }
2431
2432 func (st http2streamState) String() string {
2433 return http2stateName[st]
2434 }
2435
2436
2437 type http2Setting struct {
2438
2439
2440 ID http2SettingID
2441
2442
2443 Val uint32
2444 }
2445
2446 func (s http2Setting) String() string {
2447 return fmt.Sprintf("[%v = %d]", s.ID, s.Val)
2448 }
2449
2450
2451 func (s http2Setting) Valid() error {
2452
2453 switch s.ID {
2454 case http2SettingEnablePush:
2455 if s.Val != 1 && s.Val != 0 {
2456 return http2ConnectionError(http2ErrCodeProtocol)
2457 }
2458 case http2SettingInitialWindowSize:
2459 if s.Val > 1<<31-1 {
2460 return http2ConnectionError(http2ErrCodeFlowControl)
2461 }
2462 case http2SettingMaxFrameSize:
2463 if s.Val < 16384 || s.Val > 1<<24-1 {
2464 return http2ConnectionError(http2ErrCodeProtocol)
2465 }
2466 }
2467 return nil
2468 }
2469
2470
2471
2472 type http2SettingID uint16
2473
2474 const (
2475 http2SettingHeaderTableSize http2SettingID = 0x1
2476 http2SettingEnablePush http2SettingID = 0x2
2477 http2SettingMaxConcurrentStreams http2SettingID = 0x3
2478 http2SettingInitialWindowSize http2SettingID = 0x4
2479 http2SettingMaxFrameSize http2SettingID = 0x5
2480 http2SettingMaxHeaderListSize http2SettingID = 0x6
2481 )
2482
2483 var http2settingName = map[http2SettingID]string{
2484 http2SettingHeaderTableSize: "HEADER_TABLE_SIZE",
2485 http2SettingEnablePush: "ENABLE_PUSH",
2486 http2SettingMaxConcurrentStreams: "MAX_CONCURRENT_STREAMS",
2487 http2SettingInitialWindowSize: "INITIAL_WINDOW_SIZE",
2488 http2SettingMaxFrameSize: "MAX_FRAME_SIZE",
2489 http2SettingMaxHeaderListSize: "MAX_HEADER_LIST_SIZE",
2490 }
2491
2492 func (s http2SettingID) String() string {
2493 if v, ok := http2settingName[s]; ok {
2494 return v
2495 }
2496 return fmt.Sprintf("UNKNOWN_SETTING_%d", uint16(s))
2497 }
2498
2499 var (
2500 http2errInvalidHeaderFieldName = errors.New("http2: invalid header field name")
2501 http2errInvalidHeaderFieldValue = errors.New("http2: invalid header field value")
2502 )
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512 func http2validWireHeaderFieldName(v string) bool {
2513 if len(v) == 0 {
2514 return false
2515 }
2516 for _, r := range v {
2517 if !httplex.IsTokenRune(r) {
2518 return false
2519 }
2520 if 'A' <= r && r <= 'Z' {
2521 return false
2522 }
2523 }
2524 return true
2525 }
2526
2527 var http2httpCodeStringCommon = map[int]string{}
2528
2529 func init() {
2530 for i := 100; i <= 999; i++ {
2531 if v := StatusText(i); v != "" {
2532 http2httpCodeStringCommon[i] = strconv.Itoa(i)
2533 }
2534 }
2535 }
2536
2537 func http2httpCodeString(code int) string {
2538 if s, ok := http2httpCodeStringCommon[code]; ok {
2539 return s
2540 }
2541 return strconv.Itoa(code)
2542 }
2543
2544
2545 type http2stringWriter interface {
2546 WriteString(s string) (n int, err error)
2547 }
2548
2549
2550 type http2gate chan struct{}
2551
2552 func (g http2gate) Done() { g <- struct{}{} }
2553
2554 func (g http2gate) Wait() { <-g }
2555
2556
2557 type http2closeWaiter chan struct{}
2558
2559
2560
2561
2562
2563 func (cw *http2closeWaiter) Init() {
2564 *cw = make(chan struct{})
2565 }
2566
2567
2568 func (cw http2closeWaiter) Close() {
2569 close(cw)
2570 }
2571
2572
2573 func (cw http2closeWaiter) Wait() {
2574 <-cw
2575 }
2576
2577
2578
2579
2580 type http2bufferedWriter struct {
2581 w io.Writer
2582 bw *bufio.Writer
2583 }
2584
2585 func http2newBufferedWriter(w io.Writer) *http2bufferedWriter {
2586 return &http2bufferedWriter{w: w}
2587 }
2588
2589 var http2bufWriterPool = sync.Pool{
2590 New: func() interface{} {
2591
2592 return bufio.NewWriterSize(nil, 4<<10)
2593 },
2594 }
2595
2596 func (w *http2bufferedWriter) Write(p []byte) (n int, err error) {
2597 if w.bw == nil {
2598 bw := http2bufWriterPool.Get().(*bufio.Writer)
2599 bw.Reset(w.w)
2600 w.bw = bw
2601 }
2602 return w.bw.Write(p)
2603 }
2604
2605 func (w *http2bufferedWriter) Flush() error {
2606 bw := w.bw
2607 if bw == nil {
2608 return nil
2609 }
2610 err := bw.Flush()
2611 bw.Reset(nil)
2612 http2bufWriterPool.Put(bw)
2613 w.bw = nil
2614 return err
2615 }
2616
2617 func http2mustUint31(v int32) uint32 {
2618 if v < 0 || v > 2147483647 {
2619 panic("out of range")
2620 }
2621 return uint32(v)
2622 }
2623
2624
2625
2626 func http2bodyAllowedForStatus(status int) bool {
2627 switch {
2628 case status >= 100 && status <= 199:
2629 return false
2630 case status == 204:
2631 return false
2632 case status == 304:
2633 return false
2634 }
2635 return true
2636 }
2637
2638 type http2httpError struct {
2639 msg string
2640 timeout bool
2641 }
2642
2643 func (e *http2httpError) Error() string { return e.msg }
2644
2645 func (e *http2httpError) Timeout() bool { return e.timeout }
2646
2647 func (e *http2httpError) Temporary() bool { return true }
2648
2649 var http2errTimeout error = &http2httpError{msg: "http2: timeout awaiting response headers", timeout: true}
2650
2651 type http2connectionStater interface {
2652 ConnectionState() tls.ConnectionState
2653 }
2654
2655 var http2sorterPool = sync.Pool{New: func() interface{} { return new(http2sorter) }}
2656
2657 type http2sorter struct {
2658 v []string
2659 }
2660
2661 func (s *http2sorter) Len() int { return len(s.v) }
2662
2663 func (s *http2sorter) Swap(i, j int) { s.v[i], s.v[j] = s.v[j], s.v[i] }
2664
2665 func (s *http2sorter) Less(i, j int) bool { return s.v[i] < s.v[j] }
2666
2667
2668
2669
2670
2671 func (s *http2sorter) Keys(h Header) []string {
2672 keys := s.v[:0]
2673 for k := range h {
2674 keys = append(keys, k)
2675 }
2676 s.v = keys
2677 sort.Sort(s)
2678 return keys
2679 }
2680
2681 func (s *http2sorter) SortStrings(ss []string) {
2682
2683 save := s.v
2684 s.v = ss
2685 sort.Sort(s)
2686 s.v = save
2687 }
2688
2689
2690
2691
2692 type http2pipe struct {
2693 mu sync.Mutex
2694 c sync.Cond
2695 b http2pipeBuffer
2696 err error
2697 breakErr error
2698 donec chan struct{}
2699 readFn func()
2700 }
2701
2702 type http2pipeBuffer interface {
2703 Len() int
2704 io.Writer
2705 io.Reader
2706 }
2707
2708 func (p *http2pipe) Len() int {
2709 p.mu.Lock()
2710 defer p.mu.Unlock()
2711 return p.b.Len()
2712 }
2713
2714
2715
2716 func (p *http2pipe) Read(d []byte) (n int, err error) {
2717 p.mu.Lock()
2718 defer p.mu.Unlock()
2719 if p.c.L == nil {
2720 p.c.L = &p.mu
2721 }
2722 for {
2723 if p.breakErr != nil {
2724 return 0, p.breakErr
2725 }
2726 if p.b.Len() > 0 {
2727 return p.b.Read(d)
2728 }
2729 if p.err != nil {
2730 if p.readFn != nil {
2731 p.readFn()
2732 p.readFn = nil
2733 }
2734 return 0, p.err
2735 }
2736 p.c.Wait()
2737 }
2738 }
2739
2740 var http2errClosedPipeWrite = errors.New("write on closed buffer")
2741
2742
2743
2744 func (p *http2pipe) Write(d []byte) (n int, err error) {
2745 p.mu.Lock()
2746 defer p.mu.Unlock()
2747 if p.c.L == nil {
2748 p.c.L = &p.mu
2749 }
2750 defer p.c.Signal()
2751 if p.err != nil {
2752 return 0, http2errClosedPipeWrite
2753 }
2754 return p.b.Write(d)
2755 }
2756
2757
2758
2759
2760
2761
2762 func (p *http2pipe) CloseWithError(err error) { p.closeWithError(&p.err, err, nil) }
2763
2764
2765
2766
2767 func (p *http2pipe) BreakWithError(err error) { p.closeWithError(&p.breakErr, err, nil) }
2768
2769
2770
2771 func (p *http2pipe) closeWithErrorAndCode(err error, fn func()) { p.closeWithError(&p.err, err, fn) }
2772
2773 func (p *http2pipe) closeWithError(dst *error, err error, fn func()) {
2774 if err == nil {
2775 panic("err must be non-nil")
2776 }
2777 p.mu.Lock()
2778 defer p.mu.Unlock()
2779 if p.c.L == nil {
2780 p.c.L = &p.mu
2781 }
2782 defer p.c.Signal()
2783 if *dst != nil {
2784
2785 return
2786 }
2787 p.readFn = fn
2788 *dst = err
2789 p.closeDoneLocked()
2790 }
2791
2792
2793 func (p *http2pipe) closeDoneLocked() {
2794 if p.donec == nil {
2795 return
2796 }
2797
2798 select {
2799 case <-p.donec:
2800 default:
2801 close(p.donec)
2802 }
2803 }
2804
2805
2806 func (p *http2pipe) Err() error {
2807 p.mu.Lock()
2808 defer p.mu.Unlock()
2809 if p.breakErr != nil {
2810 return p.breakErr
2811 }
2812 return p.err
2813 }
2814
2815
2816
2817 func (p *http2pipe) Done() <-chan struct{} {
2818 p.mu.Lock()
2819 defer p.mu.Unlock()
2820 if p.donec == nil {
2821 p.donec = make(chan struct{})
2822 if p.err != nil || p.breakErr != nil {
2823
2824 p.closeDoneLocked()
2825 }
2826 }
2827 return p.donec
2828 }
2829
2830 const (
2831 http2prefaceTimeout = 10 * time.Second
2832 http2firstSettingsTimeout = 2 * time.Second
2833 http2handlerChunkWriteSize = 4 << 10
2834 http2defaultMaxStreams = 250
2835 )
2836
2837 var (
2838 http2errClientDisconnected = errors.New("client disconnected")
2839 http2errClosedBody = errors.New("body closed by handler")
2840 http2errHandlerComplete = errors.New("http2: request body closed due to handler exiting")
2841 http2errStreamClosed = errors.New("http2: stream closed")
2842 )
2843
2844 var http2responseWriterStatePool = sync.Pool{
2845 New: func() interface{} {
2846 rws := &http2responseWriterState{}
2847 rws.bw = bufio.NewWriterSize(http2chunkWriter{rws}, http2handlerChunkWriteSize)
2848 return rws
2849 },
2850 }
2851
2852
2853 var (
2854 http2testHookOnConn func()
2855 http2testHookGetServerConn func(*http2serverConn)
2856 http2testHookOnPanicMu *sync.Mutex
2857 http2testHookOnPanic func(sc *http2serverConn, panicVal interface{}) (rePanic bool)
2858 )
2859
2860
2861 type http2Server struct {
2862
2863
2864
2865
2866 MaxHandlers int
2867
2868
2869
2870
2871
2872
2873
2874 MaxConcurrentStreams uint32
2875
2876
2877
2878
2879
2880 MaxReadFrameSize uint32
2881
2882
2883
2884 PermitProhibitedCipherSuites bool
2885 }
2886
2887 func (s *http2Server) maxReadFrameSize() uint32 {
2888 if v := s.MaxReadFrameSize; v >= http2minMaxFrameSize && v <= http2maxFrameSize {
2889 return v
2890 }
2891 return http2defaultMaxReadFrameSize
2892 }
2893
2894 func (s *http2Server) maxConcurrentStreams() uint32 {
2895 if v := s.MaxConcurrentStreams; v > 0 {
2896 return v
2897 }
2898 return http2defaultMaxStreams
2899 }
2900
2901
2902
2903
2904
2905
2906 func http2ConfigureServer(s *Server, conf *http2Server) error {
2907 if conf == nil {
2908 conf = new(http2Server)
2909 }
2910
2911 if s.TLSConfig == nil {
2912 s.TLSConfig = new(tls.Config)
2913 } else if s.TLSConfig.CipherSuites != nil {
2914
2915
2916
2917 const requiredCipher = tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
2918 haveRequired := false
2919 sawBad := false
2920 for i, cs := range s.TLSConfig.CipherSuites {
2921 if cs == requiredCipher {
2922 haveRequired = true
2923 }
2924 if http2isBadCipher(cs) {
2925 sawBad = true
2926 } else if sawBad {
2927 return fmt.Errorf("http2: TLSConfig.CipherSuites index %d contains an HTTP/2-approved cipher suite (%#04x), but it comes after unapproved cipher suites. With this configuration, clients that don't support previous, approved cipher suites may be given an unapproved one and reject the connection.", i, cs)
2928 }
2929 }
2930 if !haveRequired {
2931 return fmt.Errorf("http2: TLSConfig.CipherSuites is missing HTTP/2-required TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256")
2932 }
2933 }
2934
2935 s.TLSConfig.PreferServerCipherSuites = true
2936
2937 haveNPN := false
2938 for _, p := range s.TLSConfig.NextProtos {
2939 if p == http2NextProtoTLS {
2940 haveNPN = true
2941 break
2942 }
2943 }
2944 if !haveNPN {
2945 s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, http2NextProtoTLS)
2946 }
2947
2948 s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, "h2-14")
2949
2950 if s.TLSNextProto == nil {
2951 s.TLSNextProto = map[string]func(*Server, *tls.Conn, Handler){}
2952 }
2953 protoHandler := func(hs *Server, c *tls.Conn, h Handler) {
2954 if http2testHookOnConn != nil {
2955 http2testHookOnConn()
2956 }
2957 conf.ServeConn(c, &http2ServeConnOpts{
2958 Handler: h,
2959 BaseConfig: hs,
2960 })
2961 }
2962 s.TLSNextProto[http2NextProtoTLS] = protoHandler
2963 s.TLSNextProto["h2-14"] = protoHandler
2964 return nil
2965 }
2966
2967
2968 type http2ServeConnOpts struct {
2969
2970
2971 BaseConfig *Server
2972
2973
2974
2975
2976 Handler Handler
2977 }
2978
2979 func (o *http2ServeConnOpts) baseConfig() *Server {
2980 if o != nil && o.BaseConfig != nil {
2981 return o.BaseConfig
2982 }
2983 return new(Server)
2984 }
2985
2986 func (o *http2ServeConnOpts) handler() Handler {
2987 if o != nil {
2988 if o.Handler != nil {
2989 return o.Handler
2990 }
2991 if o.BaseConfig != nil && o.BaseConfig.Handler != nil {
2992 return o.BaseConfig.Handler
2993 }
2994 }
2995 return DefaultServeMux
2996 }
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012 func (s *http2Server) ServeConn(c net.Conn, opts *http2ServeConnOpts) {
3013 baseCtx, cancel := http2serverConnBaseContext(c, opts)
3014 defer cancel()
3015
3016 sc := &http2serverConn{
3017 srv: s,
3018 hs: opts.baseConfig(),
3019 conn: c,
3020 baseCtx: baseCtx,
3021 remoteAddrStr: c.RemoteAddr().String(),
3022 bw: http2newBufferedWriter(c),
3023 handler: opts.handler(),
3024 streams: make(map[uint32]*http2stream),
3025 readFrameCh: make(chan http2readFrameResult),
3026 wantWriteFrameCh: make(chan http2frameWriteMsg, 8),
3027 wroteFrameCh: make(chan http2frameWriteResult, 1),
3028 bodyReadCh: make(chan http2bodyReadMsg),
3029 doneServing: make(chan struct{}),
3030 advMaxStreams: s.maxConcurrentStreams(),
3031 writeSched: http2writeScheduler{
3032 maxFrameSize: http2initialMaxFrameSize,
3033 },
3034 initialWindowSize: http2initialWindowSize,
3035 headerTableSize: http2initialHeaderTableSize,
3036 serveG: http2newGoroutineLock(),
3037 pushEnabled: true,
3038 }
3039
3040 sc.flow.add(http2initialWindowSize)
3041 sc.inflow.add(http2initialWindowSize)
3042 sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf)
3043
3044 fr := http2NewFramer(sc.bw, c)
3045 fr.ReadMetaHeaders = hpack.NewDecoder(http2initialHeaderTableSize, nil)
3046 fr.MaxHeaderListSize = sc.maxHeaderListSize()
3047 fr.SetMaxReadFrameSize(s.maxReadFrameSize())
3048 sc.framer = fr
3049
3050 if tc, ok := c.(http2connectionStater); ok {
3051 sc.tlsState = new(tls.ConnectionState)
3052 *sc.tlsState = tc.ConnectionState()
3053
3054 if sc.tlsState.Version < tls.VersionTLS12 {
3055 sc.rejectConn(http2ErrCodeInadequateSecurity, "TLS version too low")
3056 return
3057 }
3058
3059 if sc.tlsState.ServerName == "" {
3060
3061 }
3062
3063 if !s.PermitProhibitedCipherSuites && http2isBadCipher(sc.tlsState.CipherSuite) {
3064
3065 sc.rejectConn(http2ErrCodeInadequateSecurity, fmt.Sprintf("Prohibited TLS 1.2 Cipher Suite: %x", sc.tlsState.CipherSuite))
3066 return
3067 }
3068 }
3069
3070 if hook := http2testHookGetServerConn; hook != nil {
3071 hook(sc)
3072 }
3073 sc.serve()
3074 }
3075
3076 func (sc *http2serverConn) rejectConn(err http2ErrCode, debug string) {
3077 sc.vlogf("http2: server rejecting conn: %v, %s", err, debug)
3078
3079 sc.framer.WriteGoAway(0, err, []byte(debug))
3080 sc.bw.Flush()
3081 sc.conn.Close()
3082 }
3083
3084 type http2serverConn struct {
3085
3086 srv *http2Server
3087 hs *Server
3088 conn net.Conn
3089 bw *http2bufferedWriter
3090 handler Handler
3091 baseCtx http2contextContext
3092 framer *http2Framer
3093 doneServing chan struct{}
3094 readFrameCh chan http2readFrameResult
3095 wantWriteFrameCh chan http2frameWriteMsg
3096 wroteFrameCh chan http2frameWriteResult
3097 bodyReadCh chan http2bodyReadMsg
3098 testHookCh chan func(int)
3099 flow http2flow
3100 inflow http2flow
3101 tlsState *tls.ConnectionState
3102 remoteAddrStr string
3103
3104
3105 serveG http2goroutineLock
3106 pushEnabled bool
3107 sawFirstSettings bool
3108 needToSendSettingsAck bool
3109 unackedSettings int
3110 clientMaxStreams uint32
3111 advMaxStreams uint32
3112 curOpenStreams uint32
3113 maxStreamID uint32
3114 streams map[uint32]*http2stream
3115 initialWindowSize int32
3116 headerTableSize uint32
3117 peerMaxHeaderListSize uint32
3118 canonHeader map[string]string
3119 writingFrame bool
3120 needsFrameFlush bool
3121 writeSched http2writeScheduler
3122 inGoAway bool
3123 needToSendGoAway bool
3124 goAwayCode http2ErrCode
3125 shutdownTimerCh <-chan time.Time
3126 shutdownTimer *time.Timer
3127 freeRequestBodyBuf []byte
3128
3129
3130 headerWriteBuf bytes.Buffer
3131 hpackEncoder *hpack.Encoder
3132 }
3133
3134 func (sc *http2serverConn) maxHeaderListSize() uint32 {
3135 n := sc.hs.MaxHeaderBytes
3136 if n <= 0 {
3137 n = DefaultMaxHeaderBytes
3138 }
3139
3140
3141 const perFieldOverhead = 32
3142 const typicalHeaders = 10
3143 return uint32(n + typicalHeaders*perFieldOverhead)
3144 }
3145
3146
3147
3148
3149
3150
3151
3152
3153 type http2stream struct {
3154
3155 sc *http2serverConn
3156 id uint32
3157 body *http2pipe
3158 cw http2closeWaiter
3159 ctx http2contextContext
3160 cancelCtx func()
3161
3162
3163 bodyBytes int64
3164 declBodyBytes int64
3165 flow http2flow
3166 inflow http2flow
3167 parent *http2stream
3168 numTrailerValues int64
3169 weight uint8
3170 state http2streamState
3171 sentReset bool
3172 gotReset bool
3173 gotTrailerHeader bool
3174 wroteHeaders bool
3175 reqBuf []byte
3176
3177 trailer Header
3178 reqTrailer Header
3179 }
3180
3181 func (sc *http2serverConn) Framer() *http2Framer { return sc.framer }
3182
3183 func (sc *http2serverConn) CloseConn() error { return sc.conn.Close() }
3184
3185 func (sc *http2serverConn) Flush() error { return sc.bw.Flush() }
3186
3187 func (sc *http2serverConn) HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) {
3188 return sc.hpackEncoder, &sc.headerWriteBuf
3189 }
3190
3191 func (sc *http2serverConn) state(streamID uint32) (http2streamState, *http2stream) {
3192 sc.serveG.check()
3193
3194 if st, ok := sc.streams[streamID]; ok {
3195 return st.state, st
3196 }
3197
3198 if streamID <= sc.maxStreamID {
3199 return http2stateClosed, nil
3200 }
3201 return http2stateIdle, nil
3202 }
3203
3204
3205
3206
3207 func (sc *http2serverConn) setConnState(state ConnState) {
3208 if sc.hs.ConnState != nil {
3209 sc.hs.ConnState(sc.conn, state)
3210 }
3211 }
3212
3213 func (sc *http2serverConn) vlogf(format string, args ...interface{}) {
3214 if http2VerboseLogs {
3215 sc.logf(format, args...)
3216 }
3217 }
3218
3219 func (sc *http2serverConn) logf(format string, args ...interface{}) {
3220 if lg := sc.hs.ErrorLog; lg != nil {
3221 lg.Printf(format, args...)
3222 } else {
3223 log.Printf(format, args...)
3224 }
3225 }
3226
3227
3228
3229
3230
3231 func http2errno(v error) uintptr {
3232 if rv := reflect.ValueOf(v); rv.Kind() == reflect.Uintptr {
3233 return uintptr(rv.Uint())
3234 }
3235 return 0
3236 }
3237
3238
3239
3240 func http2isClosedConnError(err error) bool {
3241 if err == nil {
3242 return false
3243 }
3244
3245 str := err.Error()
3246 if strings.Contains(str, "use of closed network connection") {
3247 return true
3248 }
3249
3250 if runtime.GOOS == "windows" {
3251 if oe, ok := err.(*net.OpError); ok && oe.Op == "read" {
3252 if se, ok := oe.Err.(*os.SyscallError); ok && se.Syscall == "wsarecv" {
3253 const WSAECONNABORTED = 10053
3254 const WSAECONNRESET = 10054
3255 if n := http2errno(se.Err); n == WSAECONNRESET || n == WSAECONNABORTED {
3256 return true
3257 }
3258 }
3259 }
3260 }
3261 return false
3262 }
3263
3264 func (sc *http2serverConn) condlogf(err error, format string, args ...interface{}) {
3265 if err == nil {
3266 return
3267 }
3268 if err == io.EOF || err == io.ErrUnexpectedEOF || http2isClosedConnError(err) {
3269
3270 sc.vlogf(format, args...)
3271 } else {
3272 sc.logf(format, args...)
3273 }
3274 }
3275
3276 func (sc *http2serverConn) canonicalHeader(v string) string {
3277 sc.serveG.check()
3278 cv, ok := http2commonCanonHeader[v]
3279 if ok {
3280 return cv
3281 }
3282 cv, ok = sc.canonHeader[v]
3283 if ok {
3284 return cv
3285 }
3286 if sc.canonHeader == nil {
3287 sc.canonHeader = make(map[string]string)
3288 }
3289 cv = CanonicalHeaderKey(v)
3290 sc.canonHeader[v] = cv
3291 return cv
3292 }
3293
3294 type http2readFrameResult struct {
3295 f http2Frame
3296 err error
3297
3298
3299
3300
3301 readMore func()
3302 }
3303
3304
3305
3306
3307
3308 func (sc *http2serverConn) readFrames() {
3309 gate := make(http2gate)
3310 gateDone := gate.Done
3311 for {
3312 f, err := sc.framer.ReadFrame()
3313 select {
3314 case sc.readFrameCh <- http2readFrameResult{f, err, gateDone}:
3315 case <-sc.doneServing:
3316 return
3317 }
3318 select {
3319 case <-gate:
3320 case <-sc.doneServing:
3321 return
3322 }
3323 if http2terminalReadFrameError(err) {
3324 return
3325 }
3326 }
3327 }
3328
3329
3330 type http2frameWriteResult struct {
3331 wm http2frameWriteMsg
3332 err error
3333 }
3334
3335
3336
3337
3338
3339 func (sc *http2serverConn) writeFrameAsync(wm http2frameWriteMsg) {
3340 err := wm.write.writeFrame(sc)
3341 sc.wroteFrameCh <- http2frameWriteResult{wm, err}
3342 }
3343
3344 func (sc *http2serverConn) closeAllStreamsOnConnClose() {
3345 sc.serveG.check()
3346 for _, st := range sc.streams {
3347 sc.closeStream(st, http2errClientDisconnected)
3348 }
3349 }
3350
3351 func (sc *http2serverConn) stopShutdownTimer() {
3352 sc.serveG.check()
3353 if t := sc.shutdownTimer; t != nil {
3354 t.Stop()
3355 }
3356 }
3357
3358 func (sc *http2serverConn) notePanic() {
3359
3360 if http2testHookOnPanicMu != nil {
3361 http2testHookOnPanicMu.Lock()
3362 defer http2testHookOnPanicMu.Unlock()
3363 }
3364 if http2testHookOnPanic != nil {
3365 if e := recover(); e != nil {
3366 if http2testHookOnPanic(sc, e) {
3367 panic(e)
3368 }
3369 }
3370 }
3371 }
3372
3373 func (sc *http2serverConn) serve() {
3374 sc.serveG.check()
3375 defer sc.notePanic()
3376 defer sc.conn.Close()
3377 defer sc.closeAllStreamsOnConnClose()
3378 defer sc.stopShutdownTimer()
3379 defer close(sc.doneServing)
3380
3381 if http2VerboseLogs {
3382 sc.vlogf("http2: server connection from %v on %p", sc.conn.RemoteAddr(), sc.hs)
3383 }
3384
3385 sc.writeFrame(http2frameWriteMsg{
3386 write: http2writeSettings{
3387 {http2SettingMaxFrameSize, sc.srv.maxReadFrameSize()},
3388 {http2SettingMaxConcurrentStreams, sc.advMaxStreams},
3389 {http2SettingMaxHeaderListSize, sc.maxHeaderListSize()},
3390 },
3391 })
3392 sc.unackedSettings++
3393
3394 if err := sc.readPreface(); err != nil {
3395 sc.condlogf(err, "http2: server: error reading preface from client %v: %v", sc.conn.RemoteAddr(), err)
3396 return
3397 }
3398
3399 sc.setConnState(StateActive)
3400 sc.setConnState(StateIdle)
3401
3402 go sc.readFrames()
3403
3404 settingsTimer := time.NewTimer(http2firstSettingsTimeout)
3405 loopNum := 0
3406 for {
3407 loopNum++
3408 select {
3409 case wm := <-sc.wantWriteFrameCh:
3410 sc.writeFrame(wm)
3411 case res := <-sc.wroteFrameCh:
3412 sc.wroteFrame(res)
3413 case res := <-sc.readFrameCh:
3414 if !sc.processFrameFromReader(res) {
3415 return
3416 }
3417 res.readMore()
3418 if settingsTimer.C != nil {
3419 settingsTimer.Stop()
3420 settingsTimer.C = nil
3421 }
3422 case m := <-sc.bodyReadCh:
3423 sc.noteBodyRead(m.st, m.n)
3424 case <-settingsTimer.C:
3425 sc.logf("timeout waiting for SETTINGS frames from %v", sc.conn.RemoteAddr())
3426 return
3427 case <-sc.shutdownTimerCh:
3428 sc.vlogf("GOAWAY close timer fired; closing conn from %v", sc.conn.RemoteAddr())
3429 return
3430 case fn := <-sc.testHookCh:
3431 fn(loopNum)
3432 }
3433 }
3434 }
3435
3436
3437
3438 func (sc *http2serverConn) readPreface() error {
3439 errc := make(chan error, 1)
3440 go func() {
3441
3442 buf := make([]byte, len(http2ClientPreface))
3443 if _, err := io.ReadFull(sc.conn, buf); err != nil {
3444 errc <- err
3445 } else if !bytes.Equal(buf, http2clientPreface) {
3446 errc <- fmt.Errorf("bogus greeting %q", buf)
3447 } else {
3448 errc <- nil
3449 }
3450 }()
3451 timer := time.NewTimer(http2prefaceTimeout)
3452 defer timer.Stop()
3453 select {
3454 case <-timer.C:
3455 return errors.New("timeout waiting for client preface")
3456 case err := <-errc:
3457 if err == nil {
3458 if http2VerboseLogs {
3459 sc.vlogf("http2: server: client %v said hello", sc.conn.RemoteAddr())
3460 }
3461 }
3462 return err
3463 }
3464 }
3465
3466 var http2errChanPool = sync.Pool{
3467 New: func() interface{} { return make(chan error, 1) },
3468 }
3469
3470 var http2writeDataPool = sync.Pool{
3471 New: func() interface{} { return new(http2writeData) },
3472 }
3473
3474
3475
3476 func (sc *http2serverConn) writeDataFromHandler(stream *http2stream, data []byte, endStream bool) error {
3477 ch := http2errChanPool.Get().(chan error)
3478 writeArg := http2writeDataPool.Get().(*http2writeData)
3479 *writeArg = http2writeData{stream.id, data, endStream}
3480 err := sc.writeFrameFromHandler(http2frameWriteMsg{
3481 write: writeArg,
3482 stream: stream,
3483 done: ch,
3484 })
3485 if err != nil {
3486 return err
3487 }
3488 var frameWriteDone bool
3489 select {
3490 case err = <-ch:
3491 frameWriteDone = true
3492 case <-sc.doneServing:
3493 return http2errClientDisconnected
3494 case <-stream.cw:
3495
3496 select {
3497 case err = <-ch:
3498 frameWriteDone = true
3499 default:
3500 return http2errStreamClosed
3501 }
3502 }
3503 http2errChanPool.Put(ch)
3504 if frameWriteDone {
3505 http2writeDataPool.Put(writeArg)
3506 }
3507 return err
3508 }
3509
3510
3511
3512
3513
3514
3515
3516
3517 func (sc *http2serverConn) writeFrameFromHandler(wm http2frameWriteMsg) error {
3518 sc.serveG.checkNotOn()
3519 select {
3520 case sc.wantWriteFrameCh <- wm:
3521 return nil
3522 case <-sc.doneServing:
3523
3524 return http2errClientDisconnected
3525 }
3526 }
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536 func (sc *http2serverConn) writeFrame(wm http2frameWriteMsg) {
3537 sc.serveG.check()
3538
3539 var ignoreWrite bool
3540
3541 switch wm.write.(type) {
3542 case *http2writeResHeaders:
3543 wm.stream.wroteHeaders = true
3544 case http2write100ContinueHeadersFrame:
3545 if wm.stream.wroteHeaders {
3546 ignoreWrite = true
3547 }
3548 }
3549
3550 if !ignoreWrite {
3551 sc.writeSched.add(wm)
3552 }
3553 sc.scheduleFrameWrite()
3554 }
3555
3556
3557
3558
3559 func (sc *http2serverConn) startFrameWrite(wm http2frameWriteMsg) {
3560 sc.serveG.check()
3561 if sc.writingFrame {
3562 panic("internal error: can only be writing one frame at a time")
3563 }
3564
3565 st := wm.stream
3566 if st != nil {
3567 switch st.state {
3568 case http2stateHalfClosedLocal:
3569 panic("internal error: attempt to send frame on half-closed-local stream")
3570 case http2stateClosed:
3571 if st.sentReset || st.gotReset {
3572
3573 sc.scheduleFrameWrite()
3574 return
3575 }
3576 panic(fmt.Sprintf("internal error: attempt to send a write %v on a closed stream", wm))
3577 }
3578 }
3579
3580 sc.writingFrame = true
3581 sc.needsFrameFlush = true
3582 go sc.writeFrameAsync(wm)
3583 }
3584
3585
3586
3587
3588 var http2errHandlerPanicked = errors.New("http2: handler panicked")
3589
3590
3591
3592 func (sc *http2serverConn) wroteFrame(res http2frameWriteResult) {
3593 sc.serveG.check()
3594 if !sc.writingFrame {
3595 panic("internal error: expected to be already writing a frame")
3596 }
3597 sc.writingFrame = false
3598
3599 wm := res.wm
3600 st := wm.stream
3601
3602 closeStream := http2endsStream(wm.write)
3603
3604 if _, ok := wm.write.(http2handlerPanicRST); ok {
3605 sc.closeStream(st, http2errHandlerPanicked)
3606 }
3607
3608 if ch := wm.done; ch != nil {
3609 select {
3610 case ch <- res.err:
3611 default:
3612 panic(fmt.Sprintf("unbuffered done channel passed in for type %T", wm.write))
3613 }
3614 }
3615 wm.write = nil
3616
3617 if closeStream {
3618 if st == nil {
3619 panic("internal error: expecting non-nil stream")
3620 }
3621 switch st.state {
3622 case http2stateOpen:
3623
3624 st.state = http2stateHalfClosedLocal
3625 errCancel := http2streamError(st.id, http2ErrCodeCancel)
3626 sc.resetStream(errCancel)
3627 case http2stateHalfClosedRemote:
3628 sc.closeStream(st, http2errHandlerComplete)
3629 }
3630 }
3631
3632 sc.scheduleFrameWrite()
3633 }
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647 func (sc *http2serverConn) scheduleFrameWrite() {
3648 sc.serveG.check()
3649 if sc.writingFrame {
3650 return
3651 }
3652 if sc.needToSendGoAway {
3653 sc.needToSendGoAway = false
3654 sc.startFrameWrite(http2frameWriteMsg{
3655 write: &http2writeGoAway{
3656 maxStreamID: sc.maxStreamID,
3657 code: sc.goAwayCode,
3658 },
3659 })
3660 return
3661 }
3662 if sc.needToSendSettingsAck {
3663 sc.needToSendSettingsAck = false
3664 sc.startFrameWrite(http2frameWriteMsg{write: http2writeSettingsAck{}})
3665 return
3666 }
3667 if !sc.inGoAway {
3668 if wm, ok := sc.writeSched.take(); ok {
3669 sc.startFrameWrite(wm)
3670 return
3671 }
3672 }
3673 if sc.needsFrameFlush {
3674 sc.startFrameWrite(http2frameWriteMsg{write: http2flushFrameWriter{}})
3675 sc.needsFrameFlush = false
3676 return
3677 }
3678 }
3679
3680 func (sc *http2serverConn) goAway(code http2ErrCode) {
3681 sc.serveG.check()
3682 if sc.inGoAway {
3683 return
3684 }
3685 if code != http2ErrCodeNo {
3686 sc.shutDownIn(250 * time.Millisecond)
3687 } else {
3688
3689 sc.shutDownIn(1 * time.Second)
3690 }
3691 sc.inGoAway = true
3692 sc.needToSendGoAway = true
3693 sc.goAwayCode = code
3694 sc.scheduleFrameWrite()
3695 }
3696
3697 func (sc *http2serverConn) shutDownIn(d time.Duration) {
3698 sc.serveG.check()
3699 sc.shutdownTimer = time.NewTimer(d)
3700 sc.shutdownTimerCh = sc.shutdownTimer.C
3701 }
3702
3703 func (sc *http2serverConn) resetStream(se http2StreamError) {
3704 sc.serveG.check()
3705 sc.writeFrame(http2frameWriteMsg{write: se})
3706 if st, ok := sc.streams[se.StreamID]; ok {
3707 st.sentReset = true
3708 sc.closeStream(st, se)
3709 }
3710 }
3711
3712
3713
3714
3715 func (sc *http2serverConn) processFrameFromReader(res http2readFrameResult) bool {
3716 sc.serveG.check()
3717 err := res.err
3718 if err != nil {
3719 if err == http2ErrFrameTooLarge {
3720 sc.goAway(http2ErrCodeFrameSize)
3721 return true
3722 }
3723 clientGone := err == io.EOF || err == io.ErrUnexpectedEOF || http2isClosedConnError(err)
3724 if clientGone {
3725
3726 return false
3727 }
3728 } else {
3729 f := res.f
3730 if http2VerboseLogs {
3731 sc.vlogf("http2: server read frame %v", http2summarizeFrame(f))
3732 }
3733 err = sc.processFrame(f)
3734 if err == nil {
3735 return true
3736 }
3737 }
3738
3739 switch ev := err.(type) {
3740 case http2StreamError:
3741 sc.resetStream(ev)
3742 return true
3743 case http2goAwayFlowError:
3744 sc.goAway(http2ErrCodeFlowControl)
3745 return true
3746 case http2ConnectionError:
3747 sc.logf("http2: server connection error from %v: %v", sc.conn.RemoteAddr(), ev)
3748 sc.goAway(http2ErrCode(ev))
3749 return true
3750 default:
3751 if res.err != nil {
3752 sc.vlogf("http2: server closing client connection; error reading frame from client %s: %v", sc.conn.RemoteAddr(), err)
3753 } else {
3754 sc.logf("http2: server closing client connection: %v", err)
3755 }
3756 return false
3757 }
3758 }
3759
3760 func (sc *http2serverConn) processFrame(f http2Frame) error {
3761 sc.serveG.check()
3762
3763 if !sc.sawFirstSettings {
3764 if _, ok := f.(*http2SettingsFrame); !ok {
3765 return http2ConnectionError(http2ErrCodeProtocol)
3766 }
3767 sc.sawFirstSettings = true
3768 }
3769
3770 switch f := f.(type) {
3771 case *http2SettingsFrame:
3772 return sc.processSettings(f)
3773 case *http2MetaHeadersFrame:
3774 return sc.processHeaders(f)
3775 case *http2WindowUpdateFrame:
3776 return sc.processWindowUpdate(f)
3777 case *http2PingFrame:
3778 return sc.processPing(f)
3779 case *http2DataFrame:
3780 return sc.processData(f)
3781 case *http2RSTStreamFrame:
3782 return sc.processResetStream(f)
3783 case *http2PriorityFrame:
3784 return sc.processPriority(f)
3785 case *http2PushPromiseFrame:
3786
3787 return http2ConnectionError(http2ErrCodeProtocol)
3788 default:
3789 sc.vlogf("http2: server ignoring frame: %v", f.Header())
3790 return nil
3791 }
3792 }
3793
3794 func (sc *http2serverConn) processPing(f *http2PingFrame) error {
3795 sc.serveG.check()
3796 if f.IsAck() {
3797
3798 return nil
3799 }
3800 if f.StreamID != 0 {
3801
3802 return http2ConnectionError(http2ErrCodeProtocol)
3803 }
3804 sc.writeFrame(http2frameWriteMsg{write: http2writePingAck{f}})
3805 return nil
3806 }
3807
3808 func (sc *http2serverConn) processWindowUpdate(f *http2WindowUpdateFrame) error {
3809 sc.serveG.check()
3810 switch {
3811 case f.StreamID != 0:
3812 st := sc.streams[f.StreamID]
3813 if st == nil {
3814
3815 return nil
3816 }
3817 if !st.flow.add(int32(f.Increment)) {
3818 return http2streamError(f.StreamID, http2ErrCodeFlowControl)
3819 }
3820 default:
3821 if !sc.flow.add(int32(f.Increment)) {
3822 return http2goAwayFlowError{}
3823 }
3824 }
3825 sc.scheduleFrameWrite()
3826 return nil
3827 }
3828
3829 func (sc *http2serverConn) processResetStream(f *http2RSTStreamFrame) error {
3830 sc.serveG.check()
3831
3832 state, st := sc.state(f.StreamID)
3833 if state == http2stateIdle {
3834
3835 return http2ConnectionError(http2ErrCodeProtocol)
3836 }
3837 if st != nil {
3838 st.gotReset = true
3839 st.cancelCtx()
3840 sc.closeStream(st, http2streamError(f.StreamID, f.ErrCode))
3841 }
3842 return nil
3843 }
3844
3845 func (sc *http2serverConn) closeStream(st *http2stream, err error) {
3846 sc.serveG.check()
3847 if st.state == http2stateIdle || st.state == http2stateClosed {
3848 panic(fmt.Sprintf("invariant; can't close stream in state %v", st.state))
3849 }
3850 st.state = http2stateClosed
3851 sc.curOpenStreams--
3852 if sc.curOpenStreams == 0 {
3853 sc.setConnState(StateIdle)
3854 }
3855 delete(sc.streams, st.id)
3856 if p := st.body; p != nil {
3857
3858 sc.sendWindowUpdate(nil, p.Len())
3859
3860 p.CloseWithError(err)
3861 }
3862 st.cw.Close()
3863 sc.writeSched.forgetStream(st.id)
3864 if st.reqBuf != nil {
3865
3866 sc.freeRequestBodyBuf = st.reqBuf
3867 }
3868 }
3869
3870 func (sc *http2serverConn) processSettings(f *http2SettingsFrame) error {
3871 sc.serveG.check()
3872 if f.IsAck() {
3873 sc.unackedSettings--
3874 if sc.unackedSettings < 0 {
3875
3876 return http2ConnectionError(http2ErrCodeProtocol)
3877 }
3878 return nil
3879 }
3880 if err := f.ForeachSetting(sc.processSetting); err != nil {
3881 return err
3882 }
3883 sc.needToSendSettingsAck = true
3884 sc.scheduleFrameWrite()
3885 return nil
3886 }
3887
3888 func (sc *http2serverConn) processSetting(s http2Setting) error {
3889 sc.serveG.check()
3890 if err := s.Valid(); err != nil {
3891 return err
3892 }
3893 if http2VerboseLogs {
3894 sc.vlogf("http2: server processing setting %v", s)
3895 }
3896 switch s.ID {
3897 case http2SettingHeaderTableSize:
3898 sc.headerTableSize = s.Val
3899 sc.hpackEncoder.SetMaxDynamicTableSize(s.Val)
3900 case http2SettingEnablePush:
3901 sc.pushEnabled = s.Val != 0
3902 case http2SettingMaxConcurrentStreams:
3903 sc.clientMaxStreams = s.Val
3904 case http2SettingInitialWindowSize:
3905 return sc.processSettingInitialWindowSize(s.Val)
3906 case http2SettingMaxFrameSize:
3907 sc.writeSched.maxFrameSize = s.Val
3908 case http2SettingMaxHeaderListSize:
3909 sc.peerMaxHeaderListSize = s.Val
3910 default:
3911
3912 if http2VerboseLogs {
3913 sc.vlogf("http2: server ignoring unknown setting %v", s)
3914 }
3915 }
3916 return nil
3917 }
3918
3919 func (sc *http2serverConn) processSettingInitialWindowSize(val uint32) error {
3920 sc.serveG.check()
3921
3922 old := sc.initialWindowSize
3923 sc.initialWindowSize = int32(val)
3924 growth := sc.initialWindowSize - old
3925 for _, st := range sc.streams {
3926 if !st.flow.add(growth) {
3927
3928 return http2ConnectionError(http2ErrCodeFlowControl)
3929 }
3930 }
3931 return nil
3932 }
3933
3934 func (sc *http2serverConn) processData(f *http2DataFrame) error {
3935 sc.serveG.check()
3936 data := f.Data()
3937
3938 id := f.Header().StreamID
3939 st, ok := sc.streams[id]
3940 if !ok || st.state != http2stateOpen || st.gotTrailerHeader {
3941
3942 if sc.inflow.available() < int32(f.Length) {
3943 return http2streamError(id, http2ErrCodeFlowControl)
3944 }
3945
3946 sc.inflow.take(int32(f.Length))
3947 sc.sendWindowUpdate(nil, int(f.Length))
3948
3949 return http2streamError(id, http2ErrCodeStreamClosed)
3950 }
3951 if st.body == nil {
3952 panic("internal error: should have a body in this state")
3953 }
3954
3955 if st.declBodyBytes != -1 && st.bodyBytes+int64(len(data)) > st.declBodyBytes {
3956 st.body.CloseWithError(fmt.Errorf("sender tried to send more than declared Content-Length of %d bytes", st.declBodyBytes))
3957 return http2streamError(id, http2ErrCodeStreamClosed)
3958 }
3959 if f.Length > 0 {
3960
3961 if st.inflow.available() < int32(f.Length) {
3962 return http2streamError(id, http2ErrCodeFlowControl)
3963 }
3964 st.inflow.take(int32(f.Length))
3965
3966 if len(data) > 0 {
3967 wrote, err := st.body.Write(data)
3968 if err != nil {
3969 return http2streamError(id, http2ErrCodeStreamClosed)
3970 }
3971 if wrote != len(data) {
3972 panic("internal error: bad Writer")
3973 }
3974 st.bodyBytes += int64(len(data))
3975 }
3976
3977 if pad := int32(f.Length) - int32(len(data)); pad > 0 {
3978 sc.sendWindowUpdate32(nil, pad)
3979 sc.sendWindowUpdate32(st, pad)
3980 }
3981 }
3982 if f.StreamEnded() {
3983 st.endStream()
3984 }
3985 return nil
3986 }
3987
3988
3989
3990 func (st *http2stream) endStream() {
3991 sc := st.sc
3992 sc.serveG.check()
3993
3994 if st.declBodyBytes != -1 && st.declBodyBytes != st.bodyBytes {
3995 st.body.CloseWithError(fmt.Errorf("request declared a Content-Length of %d but only wrote %d bytes",
3996 st.declBodyBytes, st.bodyBytes))
3997 } else {
3998 st.body.closeWithErrorAndCode(io.EOF, st.copyTrailersToHandlerRequest)
3999 st.body.CloseWithError(io.EOF)
4000 }
4001 st.state = http2stateHalfClosedRemote
4002 }
4003
4004
4005
4006 func (st *http2stream) copyTrailersToHandlerRequest() {
4007 for k, vv := range st.trailer {
4008 if _, ok := st.reqTrailer[k]; ok {
4009
4010 st.reqTrailer[k] = vv
4011 }
4012 }
4013 }
4014
4015 func (sc *http2serverConn) processHeaders(f *http2MetaHeadersFrame) error {
4016 sc.serveG.check()
4017 id := f.Header().StreamID
4018 if sc.inGoAway {
4019
4020 return nil
4021 }
4022
4023 if id%2 != 1 {
4024 return http2ConnectionError(http2ErrCodeProtocol)
4025 }
4026
4027 st := sc.streams[f.Header().StreamID]
4028 if st != nil {
4029 return st.processTrailerHeaders(f)
4030 }
4031
4032 if id <= sc.maxStreamID {
4033 return http2ConnectionError(http2ErrCodeProtocol)
4034 }
4035 sc.maxStreamID = id
4036
4037 ctx, cancelCtx := http2contextWithCancel(sc.baseCtx)
4038 st = &http2stream{
4039 sc: sc,
4040 id: id,
4041 state: http2stateOpen,
4042 ctx: ctx,
4043 cancelCtx: cancelCtx,
4044 }
4045 if f.StreamEnded() {
4046 st.state = http2stateHalfClosedRemote
4047 }
4048 st.cw.Init()
4049
4050 st.flow.conn = &sc.flow
4051 st.flow.add(sc.initialWindowSize)
4052 st.inflow.conn = &sc.inflow
4053 st.inflow.add(http2initialWindowSize)
4054
4055 sc.streams[id] = st
4056 if f.HasPriority() {
4057 http2adjustStreamPriority(sc.streams, st.id, f.Priority)
4058 }
4059 sc.curOpenStreams++
4060 if sc.curOpenStreams == 1 {
4061 sc.setConnState(StateActive)
4062 }
4063 if sc.curOpenStreams > sc.advMaxStreams {
4064
4065 if sc.unackedSettings == 0 {
4066
4067 return http2streamError(st.id, http2ErrCodeProtocol)
4068 }
4069
4070 return http2streamError(st.id, http2ErrCodeRefusedStream)
4071 }
4072
4073 rw, req, err := sc.newWriterAndRequest(st, f)
4074 if err != nil {
4075 return err
4076 }
4077 st.reqTrailer = req.Trailer
4078 if st.reqTrailer != nil {
4079 st.trailer = make(Header)
4080 }
4081 st.body = req.Body.(*http2requestBody).pipe
4082 st.declBodyBytes = req.ContentLength
4083
4084 handler := sc.handler.ServeHTTP
4085 if f.Truncated {
4086
4087 handler = http2handleHeaderListTooLong
4088 } else if err := http2checkValidHTTP2Request(req); err != nil {
4089 handler = http2new400Handler(err)
4090 }
4091
4092 go sc.runHandler(rw, req, handler)
4093 return nil
4094 }
4095
4096 func (st *http2stream) processTrailerHeaders(f *http2MetaHeadersFrame) error {
4097 sc := st.sc
4098 sc.serveG.check()
4099 if st.gotTrailerHeader {
4100 return http2ConnectionError(http2ErrCodeProtocol)
4101 }
4102 st.gotTrailerHeader = true
4103 if !f.StreamEnded() {
4104 return http2streamError(st.id, http2ErrCodeProtocol)
4105 }
4106
4107 if len(f.PseudoFields()) > 0 {
4108 return http2streamError(st.id, http2ErrCodeProtocol)
4109 }
4110 if st.trailer != nil {
4111 for _, hf := range f.RegularFields() {
4112 key := sc.canonicalHeader(hf.Name)
4113 if !http2ValidTrailerHeader(key) {
4114
4115 return http2streamError(st.id, http2ErrCodeProtocol)
4116 }
4117 st.trailer[key] = append(st.trailer[key], hf.Value)
4118 }
4119 }
4120 st.endStream()
4121 return nil
4122 }
4123
4124 func (sc *http2serverConn) processPriority(f *http2PriorityFrame) error {
4125 http2adjustStreamPriority(sc.streams, f.StreamID, f.http2PriorityParam)
4126 return nil
4127 }
4128
4129 func http2adjustStreamPriority(streams map[uint32]*http2stream, streamID uint32, priority http2PriorityParam) {
4130 st, ok := streams[streamID]
4131 if !ok {
4132
4133 return
4134 }
4135 st.weight = priority.Weight
4136 parent := streams[priority.StreamDep]
4137 if parent == st {
4138
4139 return
4140 }
4141
4142 for piter := parent; piter != nil; piter = piter.parent {
4143 if piter == st {
4144 parent.parent = st.parent
4145 break
4146 }
4147 }
4148 st.parent = parent
4149 if priority.Exclusive && (st.parent != nil || priority.StreamDep == 0) {
4150 for _, openStream := range streams {
4151 if openStream != st && openStream.parent == st.parent {
4152 openStream.parent = st
4153 }
4154 }
4155 }
4156 }
4157
4158 func (sc *http2serverConn) newWriterAndRequest(st *http2stream, f *http2MetaHeadersFrame) (*http2responseWriter, *Request, error) {
4159 sc.serveG.check()
4160
4161 method := f.PseudoValue("method")
4162 path := f.PseudoValue("path")
4163 scheme := f.PseudoValue("scheme")
4164 authority := f.PseudoValue("authority")
4165
4166 isConnect := method == "CONNECT"
4167 if isConnect {
4168 if path != "" || scheme != "" || authority == "" {
4169 return nil, nil, http2streamError(f.StreamID, http2ErrCodeProtocol)
4170 }
4171 } else if method == "" || path == "" ||
4172 (scheme != "https" && scheme != "http") {
4173
4174 return nil, nil, http2streamError(f.StreamID, http2ErrCodeProtocol)
4175 }
4176
4177 bodyOpen := !f.StreamEnded()
4178 if method == "HEAD" && bodyOpen {
4179
4180 return nil, nil, http2streamError(f.StreamID, http2ErrCodeProtocol)
4181 }
4182 var tlsState *tls.ConnectionState
4183
4184 if scheme == "https" {
4185 tlsState = sc.tlsState
4186 }
4187
4188 header := make(Header)
4189 for _, hf := range f.RegularFields() {
4190 header.Add(sc.canonicalHeader(hf.Name), hf.Value)
4191 }
4192
4193 if authority == "" {
4194 authority = header.Get("Host")
4195 }
4196 needsContinue := header.Get("Expect") == "100-continue"
4197 if needsContinue {
4198 header.Del("Expect")
4199 }
4200
4201 if cookies := header["Cookie"]; len(cookies) > 1 {
4202 header.Set("Cookie", strings.Join(cookies, "; "))
4203 }
4204
4205
4206 var trailer Header
4207 for _, v := range header["Trailer"] {
4208 for _, key := range strings.Split(v, ",") {
4209 key = CanonicalHeaderKey(strings.TrimSpace(key))
4210 switch key {
4211 case "Transfer-Encoding", "Trailer", "Content-Length":
4212
4213 default:
4214 if trailer == nil {
4215 trailer = make(Header)
4216 }
4217 trailer[key] = nil
4218 }
4219 }
4220 }
4221 delete(header, "Trailer")
4222
4223 body := &http2requestBody{
4224 conn: sc,
4225 stream: st,
4226 needsContinue: needsContinue,
4227 }
4228 var url_ *url.URL
4229 var requestURI string
4230 if isConnect {
4231 url_ = &url.URL{Host: authority}
4232 requestURI = authority
4233 } else {
4234 var err error
4235 url_, err = url.ParseRequestURI(path)
4236 if err != nil {
4237 return nil, nil, http2streamError(f.StreamID, http2ErrCodeProtocol)
4238 }
4239 requestURI = path
4240 }
4241 req := &Request{
4242 Method: method,
4243 URL: url_,
4244 RemoteAddr: sc.remoteAddrStr,
4245 Header: header,
4246 RequestURI: requestURI,
4247 Proto: "HTTP/2.0",
4248 ProtoMajor: 2,
4249 ProtoMinor: 0,
4250 TLS: tlsState,
4251 Host: authority,
4252 Body: body,
4253 Trailer: trailer,
4254 }
4255 req = http2requestWithContext(req, st.ctx)
4256 if bodyOpen {
4257
4258 buf := make([]byte, http2initialWindowSize)
4259
4260 body.pipe = &http2pipe{
4261 b: &http2fixedBuffer{buf: buf},
4262 }
4263
4264 if vv, ok := header["Content-Length"]; ok {
4265 req.ContentLength, _ = strconv.ParseInt(vv[0], 10, 64)
4266 } else {
4267 req.ContentLength = -1
4268 }
4269 }
4270
4271 rws := http2responseWriterStatePool.Get().(*http2responseWriterState)
4272 bwSave := rws.bw
4273 *rws = http2responseWriterState{}
4274 rws.conn = sc
4275 rws.bw = bwSave
4276 rws.bw.Reset(http2chunkWriter{rws})
4277 rws.stream = st
4278 rws.req = req
4279 rws.body = body
4280
4281 rw := &http2responseWriter{rws: rws}
4282 return rw, req, nil
4283 }
4284
4285 func (sc *http2serverConn) getRequestBodyBuf() []byte {
4286 sc.serveG.check()
4287 if buf := sc.freeRequestBodyBuf; buf != nil {
4288 sc.freeRequestBodyBuf = nil
4289 return buf
4290 }
4291 return make([]byte, http2initialWindowSize)
4292 }
4293
4294
4295 func (sc *http2serverConn) runHandler(rw *http2responseWriter, req *Request, handler func(ResponseWriter, *Request)) {
4296 didPanic := true
4297 defer func() {
4298 rw.rws.stream.cancelCtx()
4299 if didPanic {
4300 e := recover()
4301
4302 const size = 64 << 10
4303 buf := make([]byte, size)
4304 buf = buf[:runtime.Stack(buf, false)]
4305 sc.writeFrameFromHandler(http2frameWriteMsg{
4306 write: http2handlerPanicRST{rw.rws.stream.id},
4307 stream: rw.rws.stream,
4308 })
4309 sc.logf("http2: panic serving %v: %v\n%s", sc.conn.RemoteAddr(), e, buf)
4310 return
4311 }
4312 rw.handlerDone()
4313 }()
4314 handler(rw, req)
4315 didPanic = false
4316 }
4317
4318 func http2handleHeaderListTooLong(w ResponseWriter, r *Request) {
4319
4320
4321
4322
4323 const statusRequestHeaderFieldsTooLarge = 431
4324 w.WriteHeader(statusRequestHeaderFieldsTooLarge)
4325 io.WriteString(w, "<h1>HTTP Error 431</h1><p>Request Header Field(s) Too Large</p>")
4326 }
4327
4328
4329
4330 func (sc *http2serverConn) writeHeaders(st *http2stream, headerData *http2writeResHeaders) error {
4331 sc.serveG.checkNotOn()
4332 var errc chan error
4333 if headerData.h != nil {
4334
4335 errc = http2errChanPool.Get().(chan error)
4336 }
4337 if err := sc.writeFrameFromHandler(http2frameWriteMsg{
4338 write: headerData,
4339 stream: st,
4340 done: errc,
4341 }); err != nil {
4342 return err
4343 }
4344 if errc != nil {
4345 select {
4346 case err := <-errc:
4347 http2errChanPool.Put(errc)
4348 return err
4349 case <-sc.doneServing:
4350 return http2errClientDisconnected
4351 case <-st.cw:
4352 return http2errStreamClosed
4353 }
4354 }
4355 return nil
4356 }
4357
4358
4359 func (sc *http2serverConn) write100ContinueHeaders(st *http2stream) {
4360 sc.writeFrameFromHandler(http2frameWriteMsg{
4361 write: http2write100ContinueHeadersFrame{st.id},
4362 stream: st,
4363 })
4364 }
4365
4366
4367
4368 type http2bodyReadMsg struct {
4369 st *http2stream
4370 n int
4371 }
4372
4373
4374
4375
4376 func (sc *http2serverConn) noteBodyReadFromHandler(st *http2stream, n int) {
4377 sc.serveG.checkNotOn()
4378 select {
4379 case sc.bodyReadCh <- http2bodyReadMsg{st, n}:
4380 case <-sc.doneServing:
4381 }
4382 }
4383
4384 func (sc *http2serverConn) noteBodyRead(st *http2stream, n int) {
4385 sc.serveG.check()
4386 sc.sendWindowUpdate(nil, n)
4387 if st.state != http2stateHalfClosedRemote && st.state != http2stateClosed {
4388
4389 sc.sendWindowUpdate(st, n)
4390 }
4391 }
4392
4393
4394 func (sc *http2serverConn) sendWindowUpdate(st *http2stream, n int) {
4395 sc.serveG.check()
4396
4397
4398
4399
4400
4401 const maxUint31 = 1<<31 - 1
4402 for n >= maxUint31 {
4403 sc.sendWindowUpdate32(st, maxUint31)
4404 n -= maxUint31
4405 }
4406 sc.sendWindowUpdate32(st, int32(n))
4407 }
4408
4409
4410 func (sc *http2serverConn) sendWindowUpdate32(st *http2stream, n int32) {
4411 sc.serveG.check()
4412 if n == 0 {
4413 return
4414 }
4415 if n < 0 {
4416 panic("negative update")
4417 }
4418 var streamID uint32
4419 if st != nil {
4420 streamID = st.id
4421 }
4422 sc.writeFrame(http2frameWriteMsg{
4423 write: http2writeWindowUpdate{streamID: streamID, n: uint32(n)},
4424 stream: st,
4425 })
4426 var ok bool
4427 if st == nil {
4428 ok = sc.inflow.add(n)
4429 } else {
4430 ok = st.inflow.add(n)
4431 }
4432 if !ok {
4433 panic("internal error; sent too many window updates without decrements?")
4434 }
4435 }
4436
4437 type http2requestBody struct {
4438 stream *http2stream
4439 conn *http2serverConn
4440 closed bool
4441 pipe *http2pipe
4442 needsContinue bool
4443 }
4444
4445 func (b *http2requestBody) Close() error {
4446 if b.pipe != nil {
4447 b.pipe.BreakWithError(http2errClosedBody)
4448 }
4449 b.closed = true
4450 return nil
4451 }
4452
4453 func (b *http2requestBody) Read(p []byte) (n int, err error) {
4454 if b.needsContinue {
4455 b.needsContinue = false
4456 b.conn.write100ContinueHeaders(b.stream)
4457 }
4458 if b.pipe == nil {
4459 return 0, io.EOF
4460 }
4461 n, err = b.pipe.Read(p)
4462 if n > 0 {
4463 b.conn.noteBodyReadFromHandler(b.stream, n)
4464 }
4465 return
4466 }
4467
4468
4469
4470
4471
4472
4473
4474 type http2responseWriter struct {
4475 rws *http2responseWriterState
4476 }
4477
4478
4479 var (
4480 _ CloseNotifier = (*http2responseWriter)(nil)
4481 _ Flusher = (*http2responseWriter)(nil)
4482 _ http2stringWriter = (*http2responseWriter)(nil)
4483 )
4484
4485 type http2responseWriterState struct {
4486
4487 stream *http2stream
4488 req *Request
4489 body *http2requestBody
4490 conn *http2serverConn
4491
4492
4493 bw *bufio.Writer
4494
4495
4496 handlerHeader Header
4497 snapHeader Header
4498 trailers []string
4499 status int
4500 wroteHeader bool
4501 sentHeader bool
4502 handlerDone bool
4503
4504 sentContentLen int64
4505 wroteBytes int64
4506
4507 closeNotifierMu sync.Mutex
4508 closeNotifierCh chan bool
4509 }
4510
4511 type http2chunkWriter struct{ rws *http2responseWriterState }
4512
4513 func (cw http2chunkWriter) Write(p []byte) (n int, err error) { return cw.rws.writeChunk(p) }
4514
4515 func (rws *http2responseWriterState) hasTrailers() bool { return len(rws.trailers) != 0 }
4516
4517
4518
4519
4520 func (rws *http2responseWriterState) declareTrailer(k string) {
4521 k = CanonicalHeaderKey(k)
4522 if !http2ValidTrailerHeader(k) {
4523
4524 rws.conn.logf("ignoring invalid trailer %q", k)
4525 return
4526 }
4527 if !http2strSliceContains(rws.trailers, k) {
4528 rws.trailers = append(rws.trailers, k)
4529 }
4530 }
4531
4532
4533
4534
4535
4536
4537
4538 func (rws *http2responseWriterState) writeChunk(p []byte) (n int, err error) {
4539 if !rws.wroteHeader {
4540 rws.writeHeader(200)
4541 }
4542
4543 isHeadResp := rws.req.Method == "HEAD"
4544 if !rws.sentHeader {
4545 rws.sentHeader = true
4546 var ctype, clen string
4547 if clen = rws.snapHeader.Get("Content-Length"); clen != "" {
4548 rws.snapHeader.Del("Content-Length")
4549 clen64, err := strconv.ParseInt(clen, 10, 64)
4550 if err == nil && clen64 >= 0 {
4551 rws.sentContentLen = clen64
4552 } else {
4553 clen = ""
4554 }
4555 }
4556 if clen == "" && rws.handlerDone && http2bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) {
4557 clen = strconv.Itoa(len(p))
4558 }
4559 _, hasContentType := rws.snapHeader["Content-Type"]
4560 if !hasContentType && http2bodyAllowedForStatus(rws.status) {
4561 ctype = DetectContentType(p)
4562 }
4563 var date string
4564 if _, ok := rws.snapHeader["Date"]; !ok {
4565
4566 date = time.Now().UTC().Format(TimeFormat)
4567 }
4568
4569 for _, v := range rws.snapHeader["Trailer"] {
4570 http2foreachHeaderElement(v, rws.declareTrailer)
4571 }
4572
4573 endStream := (rws.handlerDone && !rws.hasTrailers() && len(p) == 0) || isHeadResp
4574 err = rws.conn.writeHeaders(rws.stream, &http2writeResHeaders{
4575 streamID: rws.stream.id,
4576 httpResCode: rws.status,
4577 h: rws.snapHeader,
4578 endStream: endStream,
4579 contentType: ctype,
4580 contentLength: clen,
4581 date: date,
4582 })
4583 if err != nil {
4584 return 0, err
4585 }
4586 if endStream {
4587 return 0, nil
4588 }
4589 }
4590 if isHeadResp {
4591 return len(p), nil
4592 }
4593 if len(p) == 0 && !rws.handlerDone {
4594 return 0, nil
4595 }
4596
4597 if rws.handlerDone {
4598 rws.promoteUndeclaredTrailers()
4599 }
4600
4601 endStream := rws.handlerDone && !rws.hasTrailers()
4602 if len(p) > 0 || endStream {
4603
4604 if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil {
4605 return 0, err
4606 }
4607 }
4608
4609 if rws.handlerDone && rws.hasTrailers() {
4610 err = rws.conn.writeHeaders(rws.stream, &http2writeResHeaders{
4611 streamID: rws.stream.id,
4612 h: rws.handlerHeader,
4613 trailers: rws.trailers,
4614 endStream: true,
4615 })
4616 return len(p), err
4617 }
4618 return len(p), nil
4619 }
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633 const http2TrailerPrefix = "Trailer:"
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656 func (rws *http2responseWriterState) promoteUndeclaredTrailers() {
4657 for k, vv := range rws.handlerHeader {
4658 if !strings.HasPrefix(k, http2TrailerPrefix) {
4659 continue
4660 }
4661 trailerKey := strings.TrimPrefix(k, http2TrailerPrefix)
4662 rws.declareTrailer(trailerKey)
4663 rws.handlerHeader[CanonicalHeaderKey(trailerKey)] = vv
4664 }
4665
4666 if len(rws.trailers) > 1 {
4667 sorter := http2sorterPool.Get().(*http2sorter)
4668 sorter.SortStrings(rws.trailers)
4669 http2sorterPool.Put(sorter)
4670 }
4671 }
4672
4673 func (w *http2responseWriter) Flush() {
4674 rws := w.rws
4675 if rws == nil {
4676 panic("Header called after Handler finished")
4677 }
4678 if rws.bw.Buffered() > 0 {
4679 if err := rws.bw.Flush(); err != nil {
4680
4681 return
4682 }
4683 } else {
4684
4685 rws.writeChunk(nil)
4686 }
4687 }
4688
4689 func (w *http2responseWriter) CloseNotify() <-chan bool {
4690 rws := w.rws
4691 if rws == nil {
4692 panic("CloseNotify called after Handler finished")
4693 }
4694 rws.closeNotifierMu.Lock()
4695 ch := rws.closeNotifierCh
4696 if ch == nil {
4697 ch = make(chan bool, 1)
4698 rws.closeNotifierCh = ch
4699 go func() {
4700 rws.stream.cw.Wait()
4701 ch <- true
4702 }()
4703 }
4704 rws.closeNotifierMu.Unlock()
4705 return ch
4706 }
4707
4708 func (w *http2responseWriter) Header() Header {
4709 rws := w.rws
4710 if rws == nil {
4711 panic("Header called after Handler finished")
4712 }
4713 if rws.handlerHeader == nil {
4714 rws.handlerHeader = make(Header)
4715 }
4716 return rws.handlerHeader
4717 }
4718
4719 func (w *http2responseWriter) WriteHeader(code int) {
4720 rws := w.rws
4721 if rws == nil {
4722 panic("WriteHeader called after Handler finished")
4723 }
4724 rws.writeHeader(code)
4725 }
4726
4727 func (rws *http2responseWriterState) writeHeader(code int) {
4728 if !rws.wroteHeader {
4729 rws.wroteHeader = true
4730 rws.status = code
4731 if len(rws.handlerHeader) > 0 {
4732 rws.snapHeader = http2cloneHeader(rws.handlerHeader)
4733 }
4734 }
4735 }
4736
4737 func http2cloneHeader(h Header) Header {
4738 h2 := make(Header, len(h))
4739 for k, vv := range h {
4740 vv2 := make([]string, len(vv))
4741 copy(vv2, vv)
4742 h2[k] = vv2
4743 }
4744 return h2
4745 }
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755 func (w *http2responseWriter) Write(p []byte) (n int, err error) {
4756 return w.write(len(p), p, "")
4757 }
4758
4759 func (w *http2responseWriter) WriteString(s string) (n int, err error) {
4760 return w.write(len(s), nil, s)
4761 }
4762
4763
4764 func (w *http2responseWriter) write(lenData int, dataB []byte, dataS string) (n int, err error) {
4765 rws := w.rws
4766 if rws == nil {
4767 panic("Write called after Handler finished")
4768 }
4769 if !rws.wroteHeader {
4770 w.WriteHeader(200)
4771 }
4772 if !http2bodyAllowedForStatus(rws.status) {
4773 return 0, ErrBodyNotAllowed
4774 }
4775 rws.wroteBytes += int64(len(dataB)) + int64(len(dataS))
4776 if rws.sentContentLen != 0 && rws.wroteBytes > rws.sentContentLen {
4777
4778 return 0, errors.New("http2: handler wrote more than declared Content-Length")
4779 }
4780
4781 if dataB != nil {
4782 return rws.bw.Write(dataB)
4783 } else {
4784 return rws.bw.WriteString(dataS)
4785 }
4786 }
4787
4788 func (w *http2responseWriter) handlerDone() {
4789 rws := w.rws
4790 rws.handlerDone = true
4791 w.Flush()
4792 w.rws = nil
4793 http2responseWriterStatePool.Put(rws)
4794 }
4795
4796
4797
4798 func http2foreachHeaderElement(v string, fn func(string)) {
4799 v = textproto.TrimString(v)
4800 if v == "" {
4801 return
4802 }
4803 if !strings.Contains(v, ",") {
4804 fn(v)
4805 return
4806 }
4807 for _, f := range strings.Split(v, ",") {
4808 if f = textproto.TrimString(f); f != "" {
4809 fn(f)
4810 }
4811 }
4812 }
4813
4814
4815 var http2connHeaders = []string{
4816 "Connection",
4817 "Keep-Alive",
4818 "Proxy-Connection",
4819 "Transfer-Encoding",
4820 "Upgrade",
4821 }
4822
4823
4824
4825
4826 func http2checkValidHTTP2Request(req *Request) error {
4827 for _, h := range http2connHeaders {
4828 if _, ok := req.Header[h]; ok {
4829 return fmt.Errorf("request header %q is not valid in HTTP/2", h)
4830 }
4831 }
4832 te := req.Header["Te"]
4833 if len(te) > 0 && (len(te) > 1 || (te[0] != "trailers" && te[0] != "")) {
4834 return errors.New(`request header "TE" may only be "trailers" in HTTP/2`)
4835 }
4836 return nil
4837 }
4838
4839 func http2new400Handler(err error) HandlerFunc {
4840 return func(w ResponseWriter, r *Request) {
4841 Error(w, err.Error(), StatusBadRequest)
4842 }
4843 }
4844
4845
4846
4847
4848 func http2ValidTrailerHeader(name string) bool {
4849 name = CanonicalHeaderKey(name)
4850 if strings.HasPrefix(name, "If-") || http2badTrailer[name] {
4851 return false
4852 }
4853 return true
4854 }
4855
4856 var http2badTrailer = map[string]bool{
4857 "Authorization": true,
4858 "Cache-Control": true,
4859 "Connection": true,
4860 "Content-Encoding": true,
4861 "Content-Length": true,
4862 "Content-Range": true,
4863 "Content-Type": true,
4864 "Expect": true,
4865 "Host": true,
4866 "Keep-Alive": true,
4867 "Max-Forwards": true,
4868 "Pragma": true,
4869 "Proxy-Authenticate": true,
4870 "Proxy-Authorization": true,
4871 "Proxy-Connection": true,
4872 "Range": true,
4873 "Realm": true,
4874 "Te": true,
4875 "Trailer": true,
4876 "Transfer-Encoding": true,
4877 "Www-Authenticate": true,
4878 }
4879
4880 const (
4881
4882
4883 http2transportDefaultConnFlow = 1 << 30
4884
4885
4886
4887
4888 http2transportDefaultStreamFlow = 4 << 20
4889
4890
4891
4892 http2transportDefaultStreamMinRefresh = 4 << 10
4893
4894 http2defaultUserAgent = "Go-http-client/2.0"
4895 )
4896
4897
4898
4899
4900
4901 type http2Transport struct {
4902
4903
4904
4905
4906
4907
4908
4909 DialTLS func(network, addr string, cfg *tls.Config) (net.Conn, error)
4910
4911
4912
4913 TLSClientConfig *tls.Config
4914
4915
4916
4917 ConnPool http2ClientConnPool
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927 DisableCompression bool
4928
4929
4930
4931 AllowHTTP bool
4932
4933
4934
4935
4936
4937
4938
4939
4940 MaxHeaderListSize uint32
4941
4942
4943
4944
4945 t1 *Transport
4946
4947 connPoolOnce sync.Once
4948 connPoolOrDef http2ClientConnPool
4949 }
4950
4951 func (t *http2Transport) maxHeaderListSize() uint32 {
4952 if t.MaxHeaderListSize == 0 {
4953 return 10 << 20
4954 }
4955 if t.MaxHeaderListSize == 0xffffffff {
4956 return 0
4957 }
4958 return t.MaxHeaderListSize
4959 }
4960
4961 func (t *http2Transport) disableCompression() bool {
4962 return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression)
4963 }
4964
4965 var http2errTransportVersion = errors.New("http2: ConfigureTransport is only supported starting at Go 1.6")
4966
4967
4968
4969
4970 func http2ConfigureTransport(t1 *Transport) error {
4971 _, err := http2configureTransport(t1)
4972 return err
4973 }
4974
4975 func (t *http2Transport) connPool() http2ClientConnPool {
4976 t.connPoolOnce.Do(t.initConnPool)
4977 return t.connPoolOrDef
4978 }
4979
4980 func (t *http2Transport) initConnPool() {
4981 if t.ConnPool != nil {
4982 t.connPoolOrDef = t.ConnPool
4983 } else {
4984 t.connPoolOrDef = &http2clientConnPool{t: t}
4985 }
4986 }
4987
4988
4989
4990 type http2ClientConn struct {
4991 t *http2Transport
4992 tconn net.Conn
4993 tlsState *tls.ConnectionState
4994 singleUse bool
4995
4996
4997 readerDone chan struct{}
4998 readerErr error
4999
5000 mu sync.Mutex
5001 cond *sync.Cond
5002 flow http2flow
5003 inflow http2flow
5004 closed bool
5005 wantSettingsAck bool
5006 goAway *http2GoAwayFrame
5007 goAwayDebug string
5008 streams map[uint32]*http2clientStream
5009 nextStreamID uint32
5010 bw *bufio.Writer
5011 br *bufio.Reader
5012 fr *http2Framer
5013 lastActive time.Time
5014
5015 maxFrameSize uint32
5016 maxConcurrentStreams uint32
5017 initialWindowSize uint32
5018
5019 hbuf bytes.Buffer
5020 henc *hpack.Encoder
5021 freeBuf [][]byte
5022
5023 wmu sync.Mutex
5024 werr error
5025 }
5026
5027
5028
5029 type http2clientStream struct {
5030 cc *http2ClientConn
5031 req *Request
5032 trace *http2clientTrace
5033 ID uint32
5034 resc chan http2resAndError
5035 bufPipe http2pipe
5036 requestedGzip bool
5037 on100 func()
5038
5039 flow http2flow
5040 inflow http2flow
5041 bytesRemain int64
5042 readErr error
5043 stopReqBody error
5044
5045 peerReset chan struct{}
5046 resetErr error
5047
5048 done chan struct{}
5049
5050
5051 firstByte bool
5052 pastHeaders bool
5053 pastTrailers bool
5054
5055 trailer Header
5056 resTrailer *Header
5057 }
5058
5059
5060
5061
5062
5063
5064 func (cs *http2clientStream) awaitRequestCancel(req *Request) {
5065 ctx := http2reqContext(req)
5066 if req.Cancel == nil && ctx.Done() == nil {
5067 return
5068 }
5069 select {
5070 case <-req.Cancel:
5071 cs.bufPipe.CloseWithError(http2errRequestCanceled)
5072 cs.cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
5073 case <-ctx.Done():
5074 cs.bufPipe.CloseWithError(ctx.Err())
5075 cs.cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
5076 case <-cs.done:
5077 }
5078 }
5079
5080
5081
5082 func (cs *http2clientStream) checkResetOrDone() error {
5083 select {
5084 case <-cs.peerReset:
5085 return cs.resetErr
5086 case <-cs.done:
5087 return http2errStreamClosed
5088 default:
5089 return nil
5090 }
5091 }
5092
5093 func (cs *http2clientStream) abortRequestBodyWrite(err error) {
5094 if err == nil {
5095 panic("nil error")
5096 }
5097 cc := cs.cc
5098 cc.mu.Lock()
5099 cs.stopReqBody = err
5100 cc.cond.Broadcast()
5101 cc.mu.Unlock()
5102 }
5103
5104 type http2stickyErrWriter struct {
5105 w io.Writer
5106 err *error
5107 }
5108
5109 func (sew http2stickyErrWriter) Write(p []byte) (n int, err error) {
5110 if *sew.err != nil {
5111 return 0, *sew.err
5112 }
5113 n, err = sew.w.Write(p)
5114 *sew.err = err
5115 return
5116 }
5117
5118 var http2ErrNoCachedConn = errors.New("http2: no cached connection was available")
5119
5120
5121 type http2RoundTripOpt struct {
5122
5123
5124
5125
5126 OnlyCachedConn bool
5127 }
5128
5129 func (t *http2Transport) RoundTrip(req *Request) (*Response, error) {
5130 return t.RoundTripOpt(req, http2RoundTripOpt{})
5131 }
5132
5133
5134
5135 func http2authorityAddr(scheme string, authority string) (addr string) {
5136 if _, _, err := net.SplitHostPort(authority); err == nil {
5137 return authority
5138 }
5139 port := "443"
5140 if scheme == "http" {
5141 port = "80"
5142 }
5143 return net.JoinHostPort(authority, port)
5144 }
5145
5146
5147 func (t *http2Transport) RoundTripOpt(req *Request, opt http2RoundTripOpt) (*Response, error) {
5148 if !(req.URL.Scheme == "https" || (req.URL.Scheme == "http" && t.AllowHTTP)) {
5149 return nil, errors.New("http2: unsupported scheme")
5150 }
5151
5152 addr := http2authorityAddr(req.URL.Scheme, req.URL.Host)
5153 for {
5154 cc, err := t.connPool().GetClientConn(req, addr)
5155 if err != nil {
5156 t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err)
5157 return nil, err
5158 }
5159 http2traceGotConn(req, cc)
5160 res, err := cc.RoundTrip(req)
5161 if http2shouldRetryRequest(req, err) {
5162 continue
5163 }
5164 if err != nil {
5165 t.vlogf("RoundTrip failure: %v", err)
5166 return nil, err
5167 }
5168 return res, nil
5169 }
5170 }
5171
5172
5173
5174
5175 func (t *http2Transport) CloseIdleConnections() {
5176 if cp, ok := t.connPool().(http2clientConnPoolIdleCloser); ok {
5177 cp.closeIdleConnections()
5178 }
5179 }
5180
5181 var (
5182 http2errClientConnClosed = errors.New("http2: client conn is closed")
5183 http2errClientConnUnusable = errors.New("http2: client conn not usable")
5184 )
5185
5186 func http2shouldRetryRequest(req *Request, err error) bool {
5187
5188 return err == http2errClientConnUnusable
5189 }
5190
5191 func (t *http2Transport) dialClientConn(addr string, singleUse bool) (*http2ClientConn, error) {
5192 host, _, err := net.SplitHostPort(addr)
5193 if err != nil {
5194 return nil, err
5195 }
5196 tconn, err := t.dialTLS()("tcp", addr, t.newTLSConfig(host))
5197 if err != nil {
5198 return nil, err
5199 }
5200 return t.newClientConn(tconn, singleUse)
5201 }
5202
5203 func (t *http2Transport) newTLSConfig(host string) *tls.Config {
5204 cfg := new(tls.Config)
5205 if t.TLSClientConfig != nil {
5206 *cfg = *t.TLSClientConfig
5207 }
5208 if !http2strSliceContains(cfg.NextProtos, http2NextProtoTLS) {
5209 cfg.NextProtos = append([]string{http2NextProtoTLS}, cfg.NextProtos...)
5210 }
5211 if cfg.ServerName == "" {
5212 cfg.ServerName = host
5213 }
5214 return cfg
5215 }
5216
5217 func (t *http2Transport) dialTLS() func(string, string, *tls.Config) (net.Conn, error) {
5218 if t.DialTLS != nil {
5219 return t.DialTLS
5220 }
5221 return t.dialTLSDefault
5222 }
5223
5224 func (t *http2Transport) dialTLSDefault(network, addr string, cfg *tls.Config) (net.Conn, error) {
5225 cn, err := tls.Dial(network, addr, cfg)
5226 if err != nil {
5227 return nil, err
5228 }
5229 if err := cn.Handshake(); err != nil {
5230 return nil, err
5231 }
5232 if !cfg.InsecureSkipVerify {
5233 if err := cn.VerifyHostname(cfg.ServerName); err != nil {
5234 return nil, err
5235 }
5236 }
5237 state := cn.ConnectionState()
5238 if p := state.NegotiatedProtocol; p != http2NextProtoTLS {
5239 return nil, fmt.Errorf("http2: unexpected ALPN protocol %q; want %q", p, http2NextProtoTLS)
5240 }
5241 if !state.NegotiatedProtocolIsMutual {
5242 return nil, errors.New("http2: could not negotiate protocol mutually")
5243 }
5244 return cn, nil
5245 }
5246
5247
5248
5249 func (t *http2Transport) disableKeepAlives() bool {
5250 return t.t1 != nil && t.t1.DisableKeepAlives
5251 }
5252
5253 func (t *http2Transport) expectContinueTimeout() time.Duration {
5254 if t.t1 == nil {
5255 return 0
5256 }
5257 return http2transportExpectContinueTimeout(t.t1)
5258 }
5259
5260 func (t *http2Transport) NewClientConn(c net.Conn) (*http2ClientConn, error) {
5261 return t.newClientConn(c, false)
5262 }
5263
5264 func (t *http2Transport) newClientConn(c net.Conn, singleUse bool) (*http2ClientConn, error) {
5265 cc := &http2ClientConn{
5266 t: t,
5267 tconn: c,
5268 readerDone: make(chan struct{}),
5269 nextStreamID: 1,
5270 maxFrameSize: 16 << 10,
5271 initialWindowSize: 65535,
5272 maxConcurrentStreams: 1000,
5273 streams: make(map[uint32]*http2clientStream),
5274 singleUse: singleUse,
5275 wantSettingsAck: true,
5276 }
5277 if http2VerboseLogs {
5278 t.vlogf("http2: Transport creating client conn %p to %v", cc, c.RemoteAddr())
5279 }
5280
5281 cc.cond = sync.NewCond(&cc.mu)
5282 cc.flow.add(int32(http2initialWindowSize))
5283
5284 cc.bw = bufio.NewWriter(http2stickyErrWriter{c, &cc.werr})
5285 cc.br = bufio.NewReader(c)
5286 cc.fr = http2NewFramer(cc.bw, cc.br)
5287 cc.fr.ReadMetaHeaders = hpack.NewDecoder(http2initialHeaderTableSize, nil)
5288 cc.fr.MaxHeaderListSize = t.maxHeaderListSize()
5289
5290 cc.henc = hpack.NewEncoder(&cc.hbuf)
5291
5292 if cs, ok := c.(http2connectionStater); ok {
5293 state := cs.ConnectionState()
5294 cc.tlsState = &state
5295 }
5296
5297 initialSettings := []http2Setting{
5298 {ID: http2SettingEnablePush, Val: 0},
5299 {ID: http2SettingInitialWindowSize, Val: http2transportDefaultStreamFlow},
5300 }
5301 if max := t.maxHeaderListSize(); max != 0 {
5302 initialSettings = append(initialSettings, http2Setting{ID: http2SettingMaxHeaderListSize, Val: max})
5303 }
5304
5305 cc.bw.Write(http2clientPreface)
5306 cc.fr.WriteSettings(initialSettings...)
5307 cc.fr.WriteWindowUpdate(0, http2transportDefaultConnFlow)
5308 cc.inflow.add(http2transportDefaultConnFlow + http2initialWindowSize)
5309 cc.bw.Flush()
5310 if cc.werr != nil {
5311 return nil, cc.werr
5312 }
5313
5314 go cc.readLoop()
5315 return cc, nil
5316 }
5317
5318 func (cc *http2ClientConn) setGoAway(f *http2GoAwayFrame) {
5319 cc.mu.Lock()
5320 defer cc.mu.Unlock()
5321
5322 old := cc.goAway
5323 cc.goAway = f
5324
5325 if cc.goAwayDebug == "" {
5326 cc.goAwayDebug = string(f.DebugData())
5327 }
5328 if old != nil && old.ErrCode != http2ErrCodeNo {
5329 cc.goAway.ErrCode = old.ErrCode
5330 }
5331 }
5332
5333 func (cc *http2ClientConn) CanTakeNewRequest() bool {
5334 cc.mu.Lock()
5335 defer cc.mu.Unlock()
5336 return cc.canTakeNewRequestLocked()
5337 }
5338
5339 func (cc *http2ClientConn) canTakeNewRequestLocked() bool {
5340 if cc.singleUse && cc.nextStreamID > 1 {
5341 return false
5342 }
5343 return cc.goAway == nil && !cc.closed &&
5344 int64(len(cc.streams)+1) < int64(cc.maxConcurrentStreams) &&
5345 cc.nextStreamID < math.MaxInt32
5346 }
5347
5348 func (cc *http2ClientConn) closeIfIdle() {
5349 cc.mu.Lock()
5350 if len(cc.streams) > 0 {
5351 cc.mu.Unlock()
5352 return
5353 }
5354 cc.closed = true
5355 nextID := cc.nextStreamID
5356
5357 cc.mu.Unlock()
5358
5359 if http2VerboseLogs {
5360 cc.vlogf("http2: Transport closing idle conn %p (forSingleUse=%v, maxStream=%v)", cc, cc.singleUse, nextID-2)
5361 }
5362 cc.tconn.Close()
5363 }
5364
5365 const http2maxAllocFrameSize = 512 << 10
5366
5367
5368
5369
5370
5371 func (cc *http2ClientConn) frameScratchBuffer() []byte {
5372 cc.mu.Lock()
5373 size := cc.maxFrameSize
5374 if size > http2maxAllocFrameSize {
5375 size = http2maxAllocFrameSize
5376 }
5377 for i, buf := range cc.freeBuf {
5378 if len(buf) >= int(size) {
5379 cc.freeBuf[i] = nil
5380 cc.mu.Unlock()
5381 return buf[:size]
5382 }
5383 }
5384 cc.mu.Unlock()
5385 return make([]byte, size)
5386 }
5387
5388 func (cc *http2ClientConn) putFrameScratchBuffer(buf []byte) {
5389 cc.mu.Lock()
5390 defer cc.mu.Unlock()
5391 const maxBufs = 4
5392 if len(cc.freeBuf) < maxBufs {
5393 cc.freeBuf = append(cc.freeBuf, buf)
5394 return
5395 }
5396 for i, old := range cc.freeBuf {
5397 if old == nil {
5398 cc.freeBuf[i] = buf
5399 return
5400 }
5401 }
5402
5403 }
5404
5405
5406
5407 var http2errRequestCanceled = errors.New("net/http: request canceled")
5408
5409 func http2commaSeparatedTrailers(req *Request) (string, error) {
5410 keys := make([]string, 0, len(req.Trailer))
5411 for k := range req.Trailer {
5412 k = CanonicalHeaderKey(k)
5413 switch k {
5414 case "Transfer-Encoding", "Trailer", "Content-Length":
5415 return "", &http2badStringError{"invalid Trailer key", k}
5416 }
5417 keys = append(keys, k)
5418 }
5419 if len(keys) > 0 {
5420 sort.Strings(keys)
5421
5422 return strings.Join(keys, ","), nil
5423 }
5424 return "", nil
5425 }
5426
5427 func (cc *http2ClientConn) responseHeaderTimeout() time.Duration {
5428 if cc.t.t1 != nil {
5429 return cc.t.t1.ResponseHeaderTimeout
5430 }
5431
5432 return 0
5433 }
5434
5435
5436
5437
5438 func http2checkConnHeaders(req *Request) error {
5439 if v := req.Header.Get("Upgrade"); v != "" {
5440 return errors.New("http2: invalid Upgrade request header")
5441 }
5442 if v := req.Header.Get("Transfer-Encoding"); (v != "" && v != "chunked") || len(req.Header["Transfer-Encoding"]) > 1 {
5443 return errors.New("http2: invalid Transfer-Encoding request header")
5444 }
5445 if v := req.Header.Get("Connection"); (v != "" && v != "close" && v != "keep-alive") || len(req.Header["Connection"]) > 1 {
5446 return errors.New("http2: invalid Connection request header")
5447 }
5448 return nil
5449 }
5450
5451
5452
5453
5454 func http2actualContentLength(req *Request) int64 {
5455 if req.Body == nil {
5456 return 0
5457 }
5458 if req.ContentLength != 0 {
5459 return req.ContentLength
5460 }
5461 return -1
5462 }
5463
5464 func (cc *http2ClientConn) RoundTrip(req *Request) (*Response, error) {
5465 if err := http2checkConnHeaders(req); err != nil {
5466 return nil, err
5467 }
5468
5469 trailers, err := http2commaSeparatedTrailers(req)
5470 if err != nil {
5471 return nil, err
5472 }
5473 hasTrailers := trailers != ""
5474
5475 cc.mu.Lock()
5476 cc.lastActive = time.Now()
5477 if cc.closed || !cc.canTakeNewRequestLocked() {
5478 cc.mu.Unlock()
5479 return nil, http2errClientConnUnusable
5480 }
5481
5482 body := req.Body
5483 hasBody := body != nil
5484 contentLen := http2actualContentLength(req)
5485
5486
5487 var requestedGzip bool
5488 if !cc.t.disableCompression() &&
5489 req.Header.Get("Accept-Encoding") == "" &&
5490 req.Header.Get("Range") == "" &&
5491 req.Method != "HEAD" {
5492
5493 requestedGzip = true
5494 }
5495
5496 hdrs, err := cc.encodeHeaders(req, requestedGzip, trailers, contentLen)
5497 if err != nil {
5498 cc.mu.Unlock()
5499 return nil, err
5500 }
5501
5502 cs := cc.newStream()
5503 cs.req = req
5504 cs.trace = http2requestTrace(req)
5505 cs.requestedGzip = requestedGzip
5506 bodyWriter := cc.t.getBodyWriterState(cs, body)
5507 cs.on100 = bodyWriter.on100
5508
5509 cc.wmu.Lock()
5510 endStream := !hasBody && !hasTrailers
5511 werr := cc.writeHeaders(cs.ID, endStream, hdrs)
5512 cc.wmu.Unlock()
5513 http2traceWroteHeaders(cs.trace)
5514 cc.mu.Unlock()
5515
5516 if werr != nil {
5517 if hasBody {
5518 req.Body.Close()
5519 bodyWriter.cancel()
5520 }
5521 cc.forgetStreamID(cs.ID)
5522
5523 http2traceWroteRequest(cs.trace, werr)
5524 return nil, werr
5525 }
5526
5527 var respHeaderTimer <-chan time.Time
5528 if hasBody {
5529 bodyWriter.scheduleBodyWrite()
5530 } else {
5531 http2traceWroteRequest(cs.trace, nil)
5532 if d := cc.responseHeaderTimeout(); d != 0 {
5533 timer := time.NewTimer(d)
5534 defer timer.Stop()
5535 respHeaderTimer = timer.C
5536 }
5537 }
5538
5539 readLoopResCh := cs.resc
5540 bodyWritten := false
5541 ctx := http2reqContext(req)
5542
5543 handleReadLoopResponse := func(re http2resAndError) (*Response, error) {
5544 res := re.res
5545 if re.err != nil || res.StatusCode > 299 {
5546
5547 bodyWriter.cancel()
5548 cs.abortRequestBodyWrite(http2errStopReqBodyWrite)
5549 }
5550 if re.err != nil {
5551 cc.forgetStreamID(cs.ID)
5552 return nil, re.err
5553 }
5554 res.Request = req
5555 res.TLS = cc.tlsState
5556 return res, nil
5557 }
5558
5559 for {
5560 select {
5561 case re := <-readLoopResCh:
5562 return handleReadLoopResponse(re)
5563 case <-respHeaderTimer:
5564 cc.forgetStreamID(cs.ID)
5565 if !hasBody || bodyWritten {
5566 cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
5567 } else {
5568 bodyWriter.cancel()
5569 cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
5570 }
5571 return nil, http2errTimeout
5572 case <-ctx.Done():
5573 cc.forgetStreamID(cs.ID)
5574 if !hasBody || bodyWritten {
5575 cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
5576 } else {
5577 bodyWriter.cancel()
5578 cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
5579 }
5580 return nil, ctx.Err()
5581 case <-req.Cancel:
5582 cc.forgetStreamID(cs.ID)
5583 if !hasBody || bodyWritten {
5584 cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
5585 } else {
5586 bodyWriter.cancel()
5587 cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
5588 }
5589 return nil, http2errRequestCanceled
5590 case <-cs.peerReset:
5591
5592 return nil, cs.resetErr
5593 case err := <-bodyWriter.resc:
5594
5595 select {
5596 case re := <-readLoopResCh:
5597 return handleReadLoopResponse(re)
5598 default:
5599 }
5600 if err != nil {
5601 return nil, err
5602 }
5603 bodyWritten = true
5604 if d := cc.responseHeaderTimeout(); d != 0 {
5605 timer := time.NewTimer(d)
5606 defer timer.Stop()
5607 respHeaderTimer = timer.C
5608 }
5609 }
5610 }
5611 }
5612
5613
5614 func (cc *http2ClientConn) writeHeaders(streamID uint32, endStream bool, hdrs []byte) error {
5615 first := true
5616 frameSize := int(cc.maxFrameSize)
5617 for len(hdrs) > 0 && cc.werr == nil {
5618 chunk := hdrs
5619 if len(chunk) > frameSize {
5620 chunk = chunk[:frameSize]
5621 }
5622 hdrs = hdrs[len(chunk):]
5623 endHeaders := len(hdrs) == 0
5624 if first {
5625 cc.fr.WriteHeaders(http2HeadersFrameParam{
5626 StreamID: streamID,
5627 BlockFragment: chunk,
5628 EndStream: endStream,
5629 EndHeaders: endHeaders,
5630 })
5631 first = false
5632 } else {
5633 cc.fr.WriteContinuation(streamID, endHeaders, chunk)
5634 }
5635 }
5636
5637 cc.bw.Flush()
5638 return cc.werr
5639 }
5640
5641
5642 var (
5643
5644 http2errStopReqBodyWrite = errors.New("http2: aborting request body write")
5645
5646
5647 http2errStopReqBodyWriteAndCancel = errors.New("http2: canceling request")
5648 )
5649
5650 func (cs *http2clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (err error) {
5651 cc := cs.cc
5652 sentEnd := false
5653 buf := cc.frameScratchBuffer()
5654 defer cc.putFrameScratchBuffer(buf)
5655
5656 defer func() {
5657 http2traceWroteRequest(cs.trace, err)
5658
5659 cerr := bodyCloser.Close()
5660 if err == nil {
5661 err = cerr
5662 }
5663 }()
5664
5665 req := cs.req
5666 hasTrailers := req.Trailer != nil
5667
5668 var sawEOF bool
5669 for !sawEOF {
5670 n, err := body.Read(buf)
5671 if err == io.EOF {
5672 sawEOF = true
5673 err = nil
5674 } else if err != nil {
5675 return err
5676 }
5677
5678 remain := buf[:n]
5679 for len(remain) > 0 && err == nil {
5680 var allowed int32
5681 allowed, err = cs.awaitFlowControl(len(remain))
5682 switch {
5683 case err == http2errStopReqBodyWrite:
5684 return err
5685 case err == http2errStopReqBodyWriteAndCancel:
5686 cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
5687 return err
5688 case err != nil:
5689 return err
5690 }
5691 cc.wmu.Lock()
5692 data := remain[:allowed]
5693 remain = remain[allowed:]
5694 sentEnd = sawEOF && len(remain) == 0 && !hasTrailers
5695 err = cc.fr.WriteData(cs.ID, sentEnd, data)
5696 if err == nil {
5697
5698 err = cc.bw.Flush()
5699 }
5700 cc.wmu.Unlock()
5701 }
5702 if err != nil {
5703 return err
5704 }
5705 }
5706
5707 if sentEnd {
5708
5709 return nil
5710 }
5711
5712 var trls []byte
5713 if hasTrailers {
5714 cc.mu.Lock()
5715 defer cc.mu.Unlock()
5716 trls = cc.encodeTrailers(req)
5717 }
5718
5719 cc.wmu.Lock()
5720 defer cc.wmu.Unlock()
5721
5722 if len(trls) > 0 {
5723 err = cc.writeHeaders(cs.ID, true, trls)
5724 } else {
5725 err = cc.fr.WriteData(cs.ID, true, nil)
5726 }
5727 if ferr := cc.bw.Flush(); ferr != nil && err == nil {
5728 err = ferr
5729 }
5730 return err
5731 }
5732
5733
5734
5735
5736
5737 func (cs *http2clientStream) awaitFlowControl(maxBytes int) (taken int32, err error) {
5738 cc := cs.cc
5739 cc.mu.Lock()
5740 defer cc.mu.Unlock()
5741 for {
5742 if cc.closed {
5743 return 0, http2errClientConnClosed
5744 }
5745 if cs.stopReqBody != nil {
5746 return 0, cs.stopReqBody
5747 }
5748 if err := cs.checkResetOrDone(); err != nil {
5749 return 0, err
5750 }
5751 if a := cs.flow.available(); a > 0 {
5752 take := a
5753 if int(take) > maxBytes {
5754
5755 take = int32(maxBytes)
5756 }
5757 if take > int32(cc.maxFrameSize) {
5758 take = int32(cc.maxFrameSize)
5759 }
5760 cs.flow.take(take)
5761 return take, nil
5762 }
5763 cc.cond.Wait()
5764 }
5765 }
5766
5767 type http2badStringError struct {
5768 what string
5769 str string
5770 }
5771
5772 func (e *http2badStringError) Error() string { return fmt.Sprintf("%s %q", e.what, e.str) }
5773
5774
5775 func (cc *http2ClientConn) encodeHeaders(req *Request, addGzipHeader bool, trailers string, contentLength int64) ([]byte, error) {
5776 cc.hbuf.Reset()
5777
5778 host := req.Host
5779 if host == "" {
5780 host = req.URL.Host
5781 }
5782
5783 for k, vv := range req.Header {
5784 if !httplex.ValidHeaderFieldName(k) {
5785 return nil, fmt.Errorf("invalid HTTP header name %q", k)
5786 }
5787 for _, v := range vv {
5788 if !httplex.ValidHeaderFieldValue(v) {
5789 return nil, fmt.Errorf("invalid HTTP header value %q for header %q", v, k)
5790 }
5791 }
5792 }
5793
5794 cc.writeHeader(":authority", host)
5795 cc.writeHeader(":method", req.Method)
5796 if req.Method != "CONNECT" {
5797 cc.writeHeader(":path", req.URL.RequestURI())
5798 cc.writeHeader(":scheme", "https")
5799 }
5800 if trailers != "" {
5801 cc.writeHeader("trailer", trailers)
5802 }
5803
5804 var didUA bool
5805 for k, vv := range req.Header {
5806 lowKey := strings.ToLower(k)
5807 switch lowKey {
5808 case "host", "content-length":
5809
5810 continue
5811 case "connection", "proxy-connection", "transfer-encoding", "upgrade", "keep-alive":
5812
5813 continue
5814 case "user-agent":
5815
5816 didUA = true
5817 if len(vv) < 1 {
5818 continue
5819 }
5820 vv = vv[:1]
5821 if vv[0] == "" {
5822 continue
5823 }
5824 }
5825 for _, v := range vv {
5826 cc.writeHeader(lowKey, v)
5827 }
5828 }
5829 if http2shouldSendReqContentLength(req.Method, contentLength) {
5830 cc.writeHeader("content-length", strconv.FormatInt(contentLength, 10))
5831 }
5832 if addGzipHeader {
5833 cc.writeHeader("accept-encoding", "gzip")
5834 }
5835 if !didUA {
5836 cc.writeHeader("user-agent", http2defaultUserAgent)
5837 }
5838 return cc.hbuf.Bytes(), nil
5839 }
5840
5841
5842
5843
5844
5845
5846 func http2shouldSendReqContentLength(method string, contentLength int64) bool {
5847 if contentLength > 0 {
5848 return true
5849 }
5850 if contentLength < 0 {
5851 return false
5852 }
5853
5854 switch method {
5855 case "POST", "PUT", "PATCH":
5856 return true
5857 default:
5858 return false
5859 }
5860 }
5861
5862
5863 func (cc *http2ClientConn) encodeTrailers(req *Request) []byte {
5864 cc.hbuf.Reset()
5865 for k, vv := range req.Trailer {
5866
5867 lowKey := strings.ToLower(k)
5868 for _, v := range vv {
5869 cc.writeHeader(lowKey, v)
5870 }
5871 }
5872 return cc.hbuf.Bytes()
5873 }
5874
5875 func (cc *http2ClientConn) writeHeader(name, value string) {
5876 if http2VerboseLogs {
5877 log.Printf("http2: Transport encoding header %q = %q", name, value)
5878 }
5879 cc.henc.WriteField(hpack.HeaderField{Name: name, Value: value})
5880 }
5881
5882 type http2resAndError struct {
5883 res *Response
5884 err error
5885 }
5886
5887
5888 func (cc *http2ClientConn) newStream() *http2clientStream {
5889 cs := &http2clientStream{
5890 cc: cc,
5891 ID: cc.nextStreamID,
5892 resc: make(chan http2resAndError, 1),
5893 peerReset: make(chan struct{}),
5894 done: make(chan struct{}),
5895 }
5896 cs.flow.add(int32(cc.initialWindowSize))
5897 cs.flow.setConnFlow(&cc.flow)
5898 cs.inflow.add(http2transportDefaultStreamFlow)
5899 cs.inflow.setConnFlow(&cc.inflow)
5900 cc.nextStreamID += 2
5901 cc.streams[cs.ID] = cs
5902 return cs
5903 }
5904
5905 func (cc *http2ClientConn) forgetStreamID(id uint32) {
5906 cc.streamByID(id, true)
5907 }
5908
5909 func (cc *http2ClientConn) streamByID(id uint32, andRemove bool) *http2clientStream {
5910 cc.mu.Lock()
5911 defer cc.mu.Unlock()
5912 cs := cc.streams[id]
5913 if andRemove && cs != nil && !cc.closed {
5914 cc.lastActive = time.Now()
5915 delete(cc.streams, id)
5916 close(cs.done)
5917 cc.cond.Broadcast()
5918 }
5919 return cs
5920 }
5921
5922
5923 type http2clientConnReadLoop struct {
5924 cc *http2ClientConn
5925 activeRes map[uint32]*http2clientStream
5926 closeWhenIdle bool
5927 }
5928
5929
5930 func (cc *http2ClientConn) readLoop() {
5931 rl := &http2clientConnReadLoop{
5932 cc: cc,
5933 activeRes: make(map[uint32]*http2clientStream),
5934 }
5935
5936 defer rl.cleanup()
5937 cc.readerErr = rl.run()
5938 if ce, ok := cc.readerErr.(http2ConnectionError); ok {
5939 cc.wmu.Lock()
5940 cc.fr.WriteGoAway(0, http2ErrCode(ce), nil)
5941 cc.wmu.Unlock()
5942 }
5943 }
5944
5945
5946
5947 type http2GoAwayError struct {
5948 LastStreamID uint32
5949 ErrCode http2ErrCode
5950 DebugData string
5951 }
5952
5953 func (e http2GoAwayError) Error() string {
5954 return fmt.Sprintf("http2: server sent GOAWAY and closed the connection; LastStreamID=%v, ErrCode=%v, debug=%q",
5955 e.LastStreamID, e.ErrCode, e.DebugData)
5956 }
5957
5958 func http2isEOFOrNetReadError(err error) bool {
5959 if err == io.EOF {
5960 return true
5961 }
5962 ne, ok := err.(*net.OpError)
5963 return ok && ne.Op == "read"
5964 }
5965
5966 func (rl *http2clientConnReadLoop) cleanup() {
5967 cc := rl.cc
5968 defer cc.tconn.Close()
5969 defer cc.t.connPool().MarkDead(cc)
5970 defer close(cc.readerDone)
5971
5972 err := cc.readerErr
5973 cc.mu.Lock()
5974 if cc.goAway != nil && http2isEOFOrNetReadError(err) {
5975 err = http2GoAwayError{
5976 LastStreamID: cc.goAway.LastStreamID,
5977 ErrCode: cc.goAway.ErrCode,
5978 DebugData: cc.goAwayDebug,
5979 }
5980 } else if err == io.EOF {
5981 err = io.ErrUnexpectedEOF
5982 }
5983 for _, cs := range rl.activeRes {
5984 cs.bufPipe.CloseWithError(err)
5985 }
5986 for _, cs := range cc.streams {
5987 select {
5988 case cs.resc <- http2resAndError{err: err}:
5989 default:
5990 }
5991 close(cs.done)
5992 }
5993 cc.closed = true
5994 cc.cond.Broadcast()
5995 cc.mu.Unlock()
5996 }
5997
5998 func (rl *http2clientConnReadLoop) run() error {
5999 cc := rl.cc
6000 rl.closeWhenIdle = cc.t.disableKeepAlives() || cc.singleUse
6001 gotReply := false
6002 gotSettings := false
6003 for {
6004 f, err := cc.fr.ReadFrame()
6005 if err != nil {
6006 cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err)
6007 }
6008 if se, ok := err.(http2StreamError); ok {
6009 if cs := cc.streamByID(se.StreamID, true); cs != nil {
6010 cs.cc.writeStreamReset(cs.ID, se.Code, err)
6011 if se.Cause == nil {
6012 se.Cause = cc.fr.errDetail
6013 }
6014 rl.endStreamError(cs, se)
6015 }
6016 continue
6017 } else if err != nil {
6018 return err
6019 }
6020 if http2VerboseLogs {
6021 cc.vlogf("http2: Transport received %s", http2summarizeFrame(f))
6022 }
6023 if !gotSettings {
6024 if _, ok := f.(*http2SettingsFrame); !ok {
6025 cc.logf("protocol error: received %T before a SETTINGS frame", f)
6026 return http2ConnectionError(http2ErrCodeProtocol)
6027 }
6028 gotSettings = true
6029 }
6030 maybeIdle := false
6031
6032 switch f := f.(type) {
6033 case *http2MetaHeadersFrame:
6034 err = rl.processHeaders(f)
6035 maybeIdle = true
6036 gotReply = true
6037 case *http2DataFrame:
6038 err = rl.processData(f)
6039 maybeIdle = true
6040 case *http2GoAwayFrame:
6041 err = rl.processGoAway(f)
6042 maybeIdle = true
6043 case *http2RSTStreamFrame:
6044 err = rl.processResetStream(f)
6045 maybeIdle = true
6046 case *http2SettingsFrame:
6047 err = rl.processSettings(f)
6048 case *http2PushPromiseFrame:
6049 err = rl.processPushPromise(f)
6050 case *http2WindowUpdateFrame:
6051 err = rl.processWindowUpdate(f)
6052 case *http2PingFrame:
6053 err = rl.processPing(f)
6054 default:
6055 cc.logf("Transport: unhandled response frame type %T", f)
6056 }
6057 if err != nil {
6058 if http2VerboseLogs {
6059 cc.vlogf("http2: Transport conn %p received error from processing frame %v: %v", cc, http2summarizeFrame(f), err)
6060 }
6061 return err
6062 }
6063 if rl.closeWhenIdle && gotReply && maybeIdle && len(rl.activeRes) == 0 {
6064 cc.closeIfIdle()
6065 }
6066 }
6067 }
6068
6069 func (rl *http2clientConnReadLoop) processHeaders(f *http2MetaHeadersFrame) error {
6070 cc := rl.cc
6071 cs := cc.streamByID(f.StreamID, f.StreamEnded())
6072 if cs == nil {
6073
6074 return nil
6075 }
6076 if !cs.firstByte {
6077 if cs.trace != nil {
6078
6079 http2traceFirstResponseByte(cs.trace)
6080 }
6081 cs.firstByte = true
6082 }
6083 if !cs.pastHeaders {
6084 cs.pastHeaders = true
6085 } else {
6086 return rl.processTrailers(cs, f)
6087 }
6088
6089 res, err := rl.handleResponse(cs, f)
6090 if err != nil {
6091 if _, ok := err.(http2ConnectionError); ok {
6092 return err
6093 }
6094
6095 cs.cc.writeStreamReset(f.StreamID, http2ErrCodeProtocol, err)
6096 cs.resc <- http2resAndError{err: err}
6097 return nil
6098 }
6099 if res == nil {
6100
6101 return nil
6102 }
6103 if res.Body != http2noBody {
6104 rl.activeRes[cs.ID] = cs
6105 }
6106 cs.resTrailer = &res.Trailer
6107 cs.resc <- http2resAndError{res: res}
6108 return nil
6109 }
6110
6111
6112
6113
6114
6115
6116
6117
6118 func (rl *http2clientConnReadLoop) handleResponse(cs *http2clientStream, f *http2MetaHeadersFrame) (*Response, error) {
6119 if f.Truncated {
6120 return nil, http2errResponseHeaderListSize
6121 }
6122
6123 status := f.PseudoValue("status")
6124 if status == "" {
6125 return nil, errors.New("missing status pseudo header")
6126 }
6127 statusCode, err := strconv.Atoi(status)
6128 if err != nil {
6129 return nil, errors.New("malformed non-numeric status pseudo header")
6130 }
6131
6132 if statusCode == 100 {
6133 http2traceGot100Continue(cs.trace)
6134 if cs.on100 != nil {
6135 cs.on100()
6136 }
6137 cs.pastHeaders = false
6138 return nil, nil
6139 }
6140
6141 header := make(Header)
6142 res := &Response{
6143 Proto: "HTTP/2.0",
6144 ProtoMajor: 2,
6145 Header: header,
6146 StatusCode: statusCode,
6147 Status: status + " " + StatusText(statusCode),
6148 }
6149 for _, hf := range f.RegularFields() {
6150 key := CanonicalHeaderKey(hf.Name)
6151 if key == "Trailer" {
6152 t := res.Trailer
6153 if t == nil {
6154 t = make(Header)
6155 res.Trailer = t
6156 }
6157 http2foreachHeaderElement(hf.Value, func(v string) {
6158 t[CanonicalHeaderKey(v)] = nil
6159 })
6160 } else {
6161 header[key] = append(header[key], hf.Value)
6162 }
6163 }
6164
6165 streamEnded := f.StreamEnded()
6166 isHead := cs.req.Method == "HEAD"
6167 if !streamEnded || isHead {
6168 res.ContentLength = -1
6169 if clens := res.Header["Content-Length"]; len(clens) == 1 {
6170 if clen64, err := strconv.ParseInt(clens[0], 10, 64); err == nil {
6171 res.ContentLength = clen64
6172 } else {
6173
6174 }
6175 } else if len(clens) > 1 {
6176
6177 }
6178 }
6179
6180 if streamEnded || isHead {
6181 res.Body = http2noBody
6182 return res, nil
6183 }
6184
6185 buf := new(bytes.Buffer)
6186 cs.bufPipe = http2pipe{b: buf}
6187 cs.bytesRemain = res.ContentLength
6188 res.Body = http2transportResponseBody{cs}
6189 go cs.awaitRequestCancel(cs.req)
6190
6191 if cs.requestedGzip && res.Header.Get("Content-Encoding") == "gzip" {
6192 res.Header.Del("Content-Encoding")
6193 res.Header.Del("Content-Length")
6194 res.ContentLength = -1
6195 res.Body = &http2gzipReader{body: res.Body}
6196 http2setResponseUncompressed(res)
6197 }
6198 return res, nil
6199 }
6200
6201 func (rl *http2clientConnReadLoop) processTrailers(cs *http2clientStream, f *http2MetaHeadersFrame) error {
6202 if cs.pastTrailers {
6203
6204 return http2ConnectionError(http2ErrCodeProtocol)
6205 }
6206 cs.pastTrailers = true
6207 if !f.StreamEnded() {
6208
6209 return http2ConnectionError(http2ErrCodeProtocol)
6210 }
6211 if len(f.PseudoFields()) > 0 {
6212
6213 return http2ConnectionError(http2ErrCodeProtocol)
6214 }
6215
6216 trailer := make(Header)
6217 for _, hf := range f.RegularFields() {
6218 key := CanonicalHeaderKey(hf.Name)
6219 trailer[key] = append(trailer[key], hf.Value)
6220 }
6221 cs.trailer = trailer
6222
6223 rl.endStream(cs)
6224 return nil
6225 }
6226
6227
6228
6229
6230 type http2transportResponseBody struct {
6231 cs *http2clientStream
6232 }
6233
6234 func (b http2transportResponseBody) Read(p []byte) (n int, err error) {
6235 cs := b.cs
6236 cc := cs.cc
6237
6238 if cs.readErr != nil {
6239 return 0, cs.readErr
6240 }
6241 n, err = b.cs.bufPipe.Read(p)
6242 if cs.bytesRemain != -1 {
6243 if int64(n) > cs.bytesRemain {
6244 n = int(cs.bytesRemain)
6245 if err == nil {
6246 err = errors.New("net/http: server replied with more than declared Content-Length; truncated")
6247 cc.writeStreamReset(cs.ID, http2ErrCodeProtocol, err)
6248 }
6249 cs.readErr = err
6250 return int(cs.bytesRemain), err
6251 }
6252 cs.bytesRemain -= int64(n)
6253 if err == io.EOF && cs.bytesRemain > 0 {
6254 err = io.ErrUnexpectedEOF
6255 cs.readErr = err
6256 return n, err
6257 }
6258 }
6259 if n == 0 {
6260
6261 return
6262 }
6263
6264 cc.mu.Lock()
6265 defer cc.mu.Unlock()
6266
6267 var connAdd, streamAdd int32
6268
6269 if v := cc.inflow.available(); v < http2transportDefaultConnFlow/2 {
6270 connAdd = http2transportDefaultConnFlow - v
6271 cc.inflow.add(connAdd)
6272 }
6273 if err == nil {
6274
6275 v := int(cs.inflow.available()) + cs.bufPipe.Len()
6276 if v < http2transportDefaultStreamFlow-http2transportDefaultStreamMinRefresh {
6277 streamAdd = int32(http2transportDefaultStreamFlow - v)
6278 cs.inflow.add(streamAdd)
6279 }
6280 }
6281 if connAdd != 0 || streamAdd != 0 {
6282 cc.wmu.Lock()
6283 defer cc.wmu.Unlock()
6284 if connAdd != 0 {
6285 cc.fr.WriteWindowUpdate(0, http2mustUint31(connAdd))
6286 }
6287 if streamAdd != 0 {
6288 cc.fr.WriteWindowUpdate(cs.ID, http2mustUint31(streamAdd))
6289 }
6290 cc.bw.Flush()
6291 }
6292 return
6293 }
6294
6295 var http2errClosedResponseBody = errors.New("http2: response body closed")
6296
6297 func (b http2transportResponseBody) Close() error {
6298 cs := b.cs
6299 cc := cs.cc
6300
6301 serverSentStreamEnd := cs.bufPipe.Err() == io.EOF
6302 unread := cs.bufPipe.Len()
6303
6304 if unread > 0 || !serverSentStreamEnd {
6305 cc.mu.Lock()
6306 cc.wmu.Lock()
6307 if !serverSentStreamEnd {
6308 cc.fr.WriteRSTStream(cs.ID, http2ErrCodeCancel)
6309 }
6310
6311 if unread > 0 {
6312 cc.inflow.add(int32(unread))
6313 cc.fr.WriteWindowUpdate(0, uint32(unread))
6314 }
6315 cc.bw.Flush()
6316 cc.wmu.Unlock()
6317 cc.mu.Unlock()
6318 }
6319
6320 cs.bufPipe.BreakWithError(http2errClosedResponseBody)
6321 return nil
6322 }
6323
6324 func (rl *http2clientConnReadLoop) processData(f *http2DataFrame) error {
6325 cc := rl.cc
6326 cs := cc.streamByID(f.StreamID, f.StreamEnded())
6327 data := f.Data()
6328 if cs == nil {
6329 cc.mu.Lock()
6330 neverSent := cc.nextStreamID
6331 cc.mu.Unlock()
6332 if f.StreamID >= neverSent {
6333
6334 cc.logf("http2: Transport received unsolicited DATA frame; closing connection")
6335 return http2ConnectionError(http2ErrCodeProtocol)
6336 }
6337
6338 if f.Length > 0 {
6339 cc.mu.Lock()
6340 cc.inflow.add(int32(f.Length))
6341 cc.mu.Unlock()
6342
6343 cc.wmu.Lock()
6344 cc.fr.WriteWindowUpdate(0, uint32(f.Length))
6345 cc.bw.Flush()
6346 cc.wmu.Unlock()
6347 }
6348 return nil
6349 }
6350 if f.Length > 0 {
6351 if len(data) > 0 && cs.bufPipe.b == nil {
6352
6353 cc.logf("http2: Transport received DATA frame for closed stream; closing connection")
6354 return http2ConnectionError(http2ErrCodeProtocol)
6355 }
6356
6357 cc.mu.Lock()
6358 if cs.inflow.available() >= int32(f.Length) {
6359 cs.inflow.take(int32(f.Length))
6360 } else {
6361 cc.mu.Unlock()
6362 return http2ConnectionError(http2ErrCodeFlowControl)
6363 }
6364
6365 if pad := int32(f.Length) - int32(len(data)); pad > 0 {
6366 cs.inflow.add(pad)
6367 cc.inflow.add(pad)
6368 cc.wmu.Lock()
6369 cc.fr.WriteWindowUpdate(0, uint32(pad))
6370 cc.fr.WriteWindowUpdate(cs.ID, uint32(pad))
6371 cc.bw.Flush()
6372 cc.wmu.Unlock()
6373 }
6374 cc.mu.Unlock()
6375
6376 if len(data) > 0 {
6377 if _, err := cs.bufPipe.Write(data); err != nil {
6378 rl.endStreamError(cs, err)
6379 return err
6380 }
6381 }
6382 }
6383
6384 if f.StreamEnded() {
6385 rl.endStream(cs)
6386 }
6387 return nil
6388 }
6389
6390 var http2errInvalidTrailers = errors.New("http2: invalid trailers")
6391
6392 func (rl *http2clientConnReadLoop) endStream(cs *http2clientStream) {
6393
6394 rl.endStreamError(cs, nil)
6395 }
6396
6397 func (rl *http2clientConnReadLoop) endStreamError(cs *http2clientStream, err error) {
6398 var code func()
6399 if err == nil {
6400 err = io.EOF
6401 code = cs.copyTrailers
6402 }
6403 cs.bufPipe.closeWithErrorAndCode(err, code)
6404 delete(rl.activeRes, cs.ID)
6405 if http2isConnectionCloseRequest(cs.req) {
6406 rl.closeWhenIdle = true
6407 }
6408
6409 select {
6410 case cs.resc <- http2resAndError{err: err}:
6411 default:
6412 }
6413 }
6414
6415 func (cs *http2clientStream) copyTrailers() {
6416 for k, vv := range cs.trailer {
6417 t := cs.resTrailer
6418 if *t == nil {
6419 *t = make(Header)
6420 }
6421 (*t)[k] = vv
6422 }
6423 }
6424
6425 func (rl *http2clientConnReadLoop) processGoAway(f *http2GoAwayFrame) error {
6426 cc := rl.cc
6427 cc.t.connPool().MarkDead(cc)
6428 if f.ErrCode != 0 {
6429
6430 cc.vlogf("transport got GOAWAY with error code = %v", f.ErrCode)
6431 }
6432 cc.setGoAway(f)
6433 return nil
6434 }
6435
6436 func (rl *http2clientConnReadLoop) processSettings(f *http2SettingsFrame) error {
6437 cc := rl.cc
6438 cc.mu.Lock()
6439 defer cc.mu.Unlock()
6440
6441 if f.IsAck() {
6442 if cc.wantSettingsAck {
6443 cc.wantSettingsAck = false
6444 return nil
6445 }
6446 return http2ConnectionError(http2ErrCodeProtocol)
6447 }
6448
6449 err := f.ForeachSetting(func(s http2Setting) error {
6450 switch s.ID {
6451 case http2SettingMaxFrameSize:
6452 cc.maxFrameSize = s.Val
6453 case http2SettingMaxConcurrentStreams:
6454 cc.maxConcurrentStreams = s.Val
6455 case http2SettingInitialWindowSize:
6456
6457 if s.Val > math.MaxInt32 {
6458 return http2ConnectionError(http2ErrCodeFlowControl)
6459 }
6460
6461 delta := int32(s.Val) - int32(cc.initialWindowSize)
6462 for _, cs := range cc.streams {
6463 cs.flow.add(delta)
6464 }
6465 cc.cond.Broadcast()
6466
6467 cc.initialWindowSize = s.Val
6468 default:
6469
6470 cc.vlogf("Unhandled Setting: %v", s)
6471 }
6472 return nil
6473 })
6474 if err != nil {
6475 return err
6476 }
6477
6478 cc.wmu.Lock()
6479 defer cc.wmu.Unlock()
6480
6481 cc.fr.WriteSettingsAck()
6482 cc.bw.Flush()
6483 return cc.werr
6484 }
6485
6486 func (rl *http2clientConnReadLoop) processWindowUpdate(f *http2WindowUpdateFrame) error {
6487 cc := rl.cc
6488 cs := cc.streamByID(f.StreamID, false)
6489 if f.StreamID != 0 && cs == nil {
6490 return nil
6491 }
6492
6493 cc.mu.Lock()
6494 defer cc.mu.Unlock()
6495
6496 fl := &cc.flow
6497 if cs != nil {
6498 fl = &cs.flow
6499 }
6500 if !fl.add(int32(f.Increment)) {
6501 return http2ConnectionError(http2ErrCodeFlowControl)
6502 }
6503 cc.cond.Broadcast()
6504 return nil
6505 }
6506
6507 func (rl *http2clientConnReadLoop) processResetStream(f *http2RSTStreamFrame) error {
6508 cs := rl.cc.streamByID(f.StreamID, true)
6509 if cs == nil {
6510
6511 return nil
6512 }
6513 select {
6514 case <-cs.peerReset:
6515
6516 default:
6517 err := http2streamError(cs.ID, f.ErrCode)
6518 cs.resetErr = err
6519 close(cs.peerReset)
6520 cs.bufPipe.CloseWithError(err)
6521 cs.cc.cond.Broadcast()
6522 }
6523 delete(rl.activeRes, cs.ID)
6524 return nil
6525 }
6526
6527 func (rl *http2clientConnReadLoop) processPing(f *http2PingFrame) error {
6528 if f.IsAck() {
6529
6530 return nil
6531 }
6532 cc := rl.cc
6533 cc.wmu.Lock()
6534 defer cc.wmu.Unlock()
6535 if err := cc.fr.WritePing(true, f.Data); err != nil {
6536 return err
6537 }
6538 return cc.bw.Flush()
6539 }
6540
6541 func (rl *http2clientConnReadLoop) processPushPromise(f *http2PushPromiseFrame) error {
6542
6543 return http2ConnectionError(http2ErrCodeProtocol)
6544 }
6545
6546 func (cc *http2ClientConn) writeStreamReset(streamID uint32, code http2ErrCode, err error) {
6547
6548 cc.wmu.Lock()
6549 cc.fr.WriteRSTStream(streamID, code)
6550 cc.bw.Flush()
6551 cc.wmu.Unlock()
6552 }
6553
6554 var (
6555 http2errResponseHeaderListSize = errors.New("http2: response header list larger than advertised limit")
6556 http2errPseudoTrailers = errors.New("http2: invalid pseudo header in trailers")
6557 )
6558
6559 func (cc *http2ClientConn) logf(format string, args ...interface{}) {
6560 cc.t.logf(format, args...)
6561 }
6562
6563 func (cc *http2ClientConn) vlogf(format string, args ...interface{}) {
6564 cc.t.vlogf(format, args...)
6565 }
6566
6567 func (t *http2Transport) vlogf(format string, args ...interface{}) {
6568 if http2VerboseLogs {
6569 t.logf(format, args...)
6570 }
6571 }
6572
6573 func (t *http2Transport) logf(format string, args ...interface{}) {
6574 log.Printf(format, args...)
6575 }
6576
6577 var http2noBody io.ReadCloser = ioutil.NopCloser(bytes.NewReader(nil))
6578
6579 func http2strSliceContains(ss []string, s string) bool {
6580 for _, v := range ss {
6581 if v == s {
6582 return true
6583 }
6584 }
6585 return false
6586 }
6587
6588 type http2erringRoundTripper struct{ err error }
6589
6590 func (rt http2erringRoundTripper) RoundTrip(*Request) (*Response, error) { return nil, rt.err }
6591
6592
6593
6594 type http2gzipReader struct {
6595 body io.ReadCloser
6596 zr *gzip.Reader
6597 zerr error
6598 }
6599
6600 func (gz *http2gzipReader) Read(p []byte) (n int, err error) {
6601 if gz.zerr != nil {
6602 return 0, gz.zerr
6603 }
6604 if gz.zr == nil {
6605 gz.zr, err = gzip.NewReader(gz.body)
6606 if err != nil {
6607 gz.zerr = err
6608 return 0, err
6609 }
6610 }
6611 return gz.zr.Read(p)
6612 }
6613
6614 func (gz *http2gzipReader) Close() error {
6615 return gz.body.Close()
6616 }
6617
6618 type http2errorReader struct{ err error }
6619
6620 func (r http2errorReader) Read(p []byte) (int, error) { return 0, r.err }
6621
6622
6623
6624
6625 type http2bodyWriterState struct {
6626 cs *http2clientStream
6627 timer *time.Timer
6628 fnonce *sync.Once
6629 fn func()
6630 resc chan error
6631 delay time.Duration
6632 }
6633
6634 func (t *http2Transport) getBodyWriterState(cs *http2clientStream, body io.Reader) (s http2bodyWriterState) {
6635 s.cs = cs
6636 if body == nil {
6637 return
6638 }
6639 resc := make(chan error, 1)
6640 s.resc = resc
6641 s.fn = func() {
6642 resc <- cs.writeRequestBody(body, cs.req.Body)
6643 }
6644 s.delay = t.expectContinueTimeout()
6645 if s.delay == 0 ||
6646 !httplex.HeaderValuesContainsToken(
6647 cs.req.Header["Expect"],
6648 "100-continue") {
6649 return
6650 }
6651 s.fnonce = new(sync.Once)
6652
6653
6654
6655
6656
6657
6658 const hugeDuration = 365 * 24 * time.Hour
6659 s.timer = time.AfterFunc(hugeDuration, func() {
6660 s.fnonce.Do(s.fn)
6661 })
6662 return
6663 }
6664
6665 func (s http2bodyWriterState) cancel() {
6666 if s.timer != nil {
6667 s.timer.Stop()
6668 }
6669 }
6670
6671 func (s http2bodyWriterState) on100() {
6672 if s.timer == nil {
6673
6674 return
6675 }
6676 s.timer.Stop()
6677 go func() { s.fnonce.Do(s.fn) }()
6678 }
6679
6680
6681
6682
6683 func (s http2bodyWriterState) scheduleBodyWrite() {
6684 if s.timer == nil {
6685
6686 go s.fn()
6687 return
6688 }
6689 http2traceWait100Continue(s.cs.trace)
6690 if s.timer.Stop() {
6691 s.timer.Reset(s.delay)
6692 }
6693 }
6694
6695
6696
6697 func http2isConnectionCloseRequest(req *Request) bool {
6698 return req.Close || httplex.HeaderValuesContainsToken(req.Header["Connection"], "close")
6699 }
6700
6701
6702 type http2writeFramer interface {
6703 writeFrame(http2writeContext) error
6704 }
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716 type http2writeContext interface {
6717 Framer() *http2Framer
6718 Flush() error
6719 CloseConn() error
6720
6721
6722 HeaderEncoder() (*hpack.Encoder, *bytes.Buffer)
6723 }
6724
6725
6726
6727 func http2endsStream(w http2writeFramer) bool {
6728 switch v := w.(type) {
6729 case *http2writeData:
6730 return v.endStream
6731 case *http2writeResHeaders:
6732 return v.endStream
6733 case nil:
6734
6735 panic("endsStream called on nil writeFramer")
6736 }
6737 return false
6738 }
6739
6740 type http2flushFrameWriter struct{}
6741
6742 func (http2flushFrameWriter) writeFrame(ctx http2writeContext) error {
6743 return ctx.Flush()
6744 }
6745
6746 type http2writeSettings []http2Setting
6747
6748 func (s http2writeSettings) writeFrame(ctx http2writeContext) error {
6749 return ctx.Framer().WriteSettings([]http2Setting(s)...)
6750 }
6751
6752 type http2writeGoAway struct {
6753 maxStreamID uint32
6754 code http2ErrCode
6755 }
6756
6757 func (p *http2writeGoAway) writeFrame(ctx http2writeContext) error {
6758 err := ctx.Framer().WriteGoAway(p.maxStreamID, p.code, nil)
6759 if p.code != 0 {
6760 ctx.Flush()
6761 time.Sleep(50 * time.Millisecond)
6762 ctx.CloseConn()
6763 }
6764 return err
6765 }
6766
6767 type http2writeData struct {
6768 streamID uint32
6769 p []byte
6770 endStream bool
6771 }
6772
6773 func (w *http2writeData) String() string {
6774 return fmt.Sprintf("writeData(stream=%d, p=%d, endStream=%v)", w.streamID, len(w.p), w.endStream)
6775 }
6776
6777 func (w *http2writeData) writeFrame(ctx http2writeContext) error {
6778 return ctx.Framer().WriteData(w.streamID, w.endStream, w.p)
6779 }
6780
6781
6782
6783 type http2handlerPanicRST struct {
6784 StreamID uint32
6785 }
6786
6787 func (hp http2handlerPanicRST) writeFrame(ctx http2writeContext) error {
6788 return ctx.Framer().WriteRSTStream(hp.StreamID, http2ErrCodeInternal)
6789 }
6790
6791 func (se http2StreamError) writeFrame(ctx http2writeContext) error {
6792 return ctx.Framer().WriteRSTStream(se.StreamID, se.Code)
6793 }
6794
6795 type http2writePingAck struct{ pf *http2PingFrame }
6796
6797 func (w http2writePingAck) writeFrame(ctx http2writeContext) error {
6798 return ctx.Framer().WritePing(true, w.pf.Data)
6799 }
6800
6801 type http2writeSettingsAck struct{}
6802
6803 func (http2writeSettingsAck) writeFrame(ctx http2writeContext) error {
6804 return ctx.Framer().WriteSettingsAck()
6805 }
6806
6807
6808
6809 type http2writeResHeaders struct {
6810 streamID uint32
6811 httpResCode int
6812 h Header
6813 trailers []string
6814 endStream bool
6815
6816 date string
6817 contentType string
6818 contentLength string
6819 }
6820
6821 func http2encKV(enc *hpack.Encoder, k, v string) {
6822 if http2VerboseLogs {
6823 log.Printf("http2: server encoding header %q = %q", k, v)
6824 }
6825 enc.WriteField(hpack.HeaderField{Name: k, Value: v})
6826 }
6827
6828 func (w *http2writeResHeaders) writeFrame(ctx http2writeContext) error {
6829 enc, buf := ctx.HeaderEncoder()
6830 buf.Reset()
6831
6832 if w.httpResCode != 0 {
6833 http2encKV(enc, ":status", http2httpCodeString(w.httpResCode))
6834 }
6835
6836 http2encodeHeaders(enc, w.h, w.trailers)
6837
6838 if w.contentType != "" {
6839 http2encKV(enc, "content-type", w.contentType)
6840 }
6841 if w.contentLength != "" {
6842 http2encKV(enc, "content-length", w.contentLength)
6843 }
6844 if w.date != "" {
6845 http2encKV(enc, "date", w.date)
6846 }
6847
6848 headerBlock := buf.Bytes()
6849 if len(headerBlock) == 0 && w.trailers == nil {
6850 panic("unexpected empty hpack")
6851 }
6852
6853
6854
6855
6856
6857
6858
6859 const maxFrameSize = 16384
6860
6861 first := true
6862 for len(headerBlock) > 0 {
6863 frag := headerBlock
6864 if len(frag) > maxFrameSize {
6865 frag = frag[:maxFrameSize]
6866 }
6867 headerBlock = headerBlock[len(frag):]
6868 endHeaders := len(headerBlock) == 0
6869 var err error
6870 if first {
6871 first = false
6872 err = ctx.Framer().WriteHeaders(http2HeadersFrameParam{
6873 StreamID: w.streamID,
6874 BlockFragment: frag,
6875 EndStream: w.endStream,
6876 EndHeaders: endHeaders,
6877 })
6878 } else {
6879 err = ctx.Framer().WriteContinuation(w.streamID, endHeaders, frag)
6880 }
6881 if err != nil {
6882 return err
6883 }
6884 }
6885 return nil
6886 }
6887
6888 type http2write100ContinueHeadersFrame struct {
6889 streamID uint32
6890 }
6891
6892 func (w http2write100ContinueHeadersFrame) writeFrame(ctx http2writeContext) error {
6893 enc, buf := ctx.HeaderEncoder()
6894 buf.Reset()
6895 http2encKV(enc, ":status", "100")
6896 return ctx.Framer().WriteHeaders(http2HeadersFrameParam{
6897 StreamID: w.streamID,
6898 BlockFragment: buf.Bytes(),
6899 EndStream: false,
6900 EndHeaders: true,
6901 })
6902 }
6903
6904 type http2writeWindowUpdate struct {
6905 streamID uint32
6906 n uint32
6907 }
6908
6909 func (wu http2writeWindowUpdate) writeFrame(ctx http2writeContext) error {
6910 return ctx.Framer().WriteWindowUpdate(wu.streamID, wu.n)
6911 }
6912
6913 func http2encodeHeaders(enc *hpack.Encoder, h Header, keys []string) {
6914 if keys == nil {
6915 sorter := http2sorterPool.Get().(*http2sorter)
6916
6917 defer http2sorterPool.Put(sorter)
6918 keys = sorter.Keys(h)
6919 }
6920 for _, k := range keys {
6921 vv := h[k]
6922 k = http2lowerHeader(k)
6923 if !http2validWireHeaderFieldName(k) {
6924
6925 continue
6926 }
6927 isTE := k == "transfer-encoding"
6928 for _, v := range vv {
6929 if !httplex.ValidHeaderFieldValue(v) {
6930
6931 continue
6932 }
6933
6934 if isTE && v != "trailers" {
6935 continue
6936 }
6937 http2encKV(enc, k, v)
6938 }
6939 }
6940 }
6941
6942
6943 type http2frameWriteMsg struct {
6944
6945
6946
6947 write http2writeFramer
6948
6949 stream *http2stream
6950
6951
6952
6953
6954 done chan error
6955 }
6956
6957
6958 func (wm http2frameWriteMsg) String() string {
6959 var streamID uint32
6960 if wm.stream != nil {
6961 streamID = wm.stream.id
6962 }
6963 var des string
6964 if s, ok := wm.write.(fmt.Stringer); ok {
6965 des = s.String()
6966 } else {
6967 des = fmt.Sprintf("%T", wm.write)
6968 }
6969 return fmt.Sprintf("[frameWriteMsg stream=%d, ch=%v, type: %v]", streamID, wm.done != nil, des)
6970 }
6971
6972
6973
6974 type http2writeScheduler struct {
6975
6976
6977 zero http2writeQueue
6978
6979
6980
6981 maxFrameSize uint32
6982
6983
6984
6985 sq map[uint32]*http2writeQueue
6986
6987
6988
6989
6990
6991 canSend []*http2writeQueue
6992
6993
6994 queuePool []*http2writeQueue
6995 }
6996
6997 func (ws *http2writeScheduler) putEmptyQueue(q *http2writeQueue) {
6998 if len(q.s) != 0 {
6999 panic("queue must be empty")
7000 }
7001 ws.queuePool = append(ws.queuePool, q)
7002 }
7003
7004 func (ws *http2writeScheduler) getEmptyQueue() *http2writeQueue {
7005 ln := len(ws.queuePool)
7006 if ln == 0 {
7007 return new(http2writeQueue)
7008 }
7009 q := ws.queuePool[ln-1]
7010 ws.queuePool = ws.queuePool[:ln-1]
7011 return q
7012 }
7013
7014 func (ws *http2writeScheduler) empty() bool { return ws.zero.empty() && len(ws.sq) == 0 }
7015
7016 func (ws *http2writeScheduler) add(wm http2frameWriteMsg) {
7017 st := wm.stream
7018 if st == nil {
7019 ws.zero.push(wm)
7020 } else {
7021 ws.streamQueue(st.id).push(wm)
7022 }
7023 }
7024
7025 func (ws *http2writeScheduler) streamQueue(streamID uint32) *http2writeQueue {
7026 if q, ok := ws.sq[streamID]; ok {
7027 return q
7028 }
7029 if ws.sq == nil {
7030 ws.sq = make(map[uint32]*http2writeQueue)
7031 }
7032 q := ws.getEmptyQueue()
7033 ws.sq[streamID] = q
7034 return q
7035 }
7036
7037
7038
7039
7040 func (ws *http2writeScheduler) take() (wm http2frameWriteMsg, ok bool) {
7041 if ws.maxFrameSize == 0 {
7042 panic("internal error: ws.maxFrameSize not initialized or invalid")
7043 }
7044
7045 if !ws.zero.empty() {
7046 return ws.zero.shift(), true
7047 }
7048 if len(ws.sq) == 0 {
7049 return
7050 }
7051
7052 for id, q := range ws.sq {
7053 if q.firstIsNoCost() {
7054 return ws.takeFrom(id, q)
7055 }
7056 }
7057
7058 if len(ws.canSend) != 0 {
7059 panic("should be empty")
7060 }
7061 for _, q := range ws.sq {
7062 if n := ws.streamWritableBytes(q); n > 0 {
7063 ws.canSend = append(ws.canSend, q)
7064 }
7065 }
7066 if len(ws.canSend) == 0 {
7067 return
7068 }
7069 defer ws.zeroCanSend()
7070
7071 q := ws.canSend[0]
7072
7073 return ws.takeFrom(q.streamID(), q)
7074 }
7075
7076
7077 func (ws *http2writeScheduler) zeroCanSend() {
7078 for i := range ws.canSend {
7079 ws.canSend[i] = nil
7080 }
7081 ws.canSend = ws.canSend[:0]
7082 }
7083
7084
7085
7086
7087
7088 func (ws *http2writeScheduler) streamWritableBytes(q *http2writeQueue) int32 {
7089 wm := q.head()
7090 ret := wm.stream.flow.available()
7091 if ret == 0 {
7092 return 0
7093 }
7094 if int32(ws.maxFrameSize) < ret {
7095 ret = int32(ws.maxFrameSize)
7096 }
7097 if ret == 0 {
7098 panic("internal error: ws.maxFrameSize not initialized or invalid")
7099 }
7100 wd := wm.write.(*http2writeData)
7101 if len(wd.p) < int(ret) {
7102 ret = int32(len(wd.p))
7103 }
7104 return ret
7105 }
7106
7107 func (ws *http2writeScheduler) takeFrom(id uint32, q *http2writeQueue) (wm http2frameWriteMsg, ok bool) {
7108 wm = q.head()
7109
7110 if wd, ok := wm.write.(*http2writeData); ok && len(wd.p) > 0 {
7111 allowed := wm.stream.flow.available()
7112 if allowed == 0 {
7113
7114 return http2frameWriteMsg{}, false
7115 }
7116 if int32(ws.maxFrameSize) < allowed {
7117 allowed = int32(ws.maxFrameSize)
7118 }
7119
7120 if len(wd.p) > int(allowed) {
7121 wm.stream.flow.take(allowed)
7122 chunk := wd.p[:allowed]
7123 wd.p = wd.p[allowed:]
7124
7125 return http2frameWriteMsg{
7126 stream: wm.stream,
7127 write: &http2writeData{
7128 streamID: wd.streamID,
7129 p: chunk,
7130
7131 endStream: false,
7132 },
7133
7134 done: nil,
7135 }, true
7136 }
7137 wm.stream.flow.take(int32(len(wd.p)))
7138 }
7139
7140 q.shift()
7141 if q.empty() {
7142 ws.putEmptyQueue(q)
7143 delete(ws.sq, id)
7144 }
7145 return wm, true
7146 }
7147
7148 func (ws *http2writeScheduler) forgetStream(id uint32) {
7149 q, ok := ws.sq[id]
7150 if !ok {
7151 return
7152 }
7153 delete(ws.sq, id)
7154
7155 for i := range q.s {
7156 q.s[i] = http2frameWriteMsg{}
7157 }
7158 q.s = q.s[:0]
7159 ws.putEmptyQueue(q)
7160 }
7161
7162 type http2writeQueue struct {
7163 s []http2frameWriteMsg
7164 }
7165
7166
7167 func (q *http2writeQueue) streamID() uint32 { return q.s[0].stream.id }
7168
7169 func (q *http2writeQueue) empty() bool { return len(q.s) == 0 }
7170
7171 func (q *http2writeQueue) push(wm http2frameWriteMsg) {
7172 q.s = append(q.s, wm)
7173 }
7174
7175
7176 func (q *http2writeQueue) head() http2frameWriteMsg {
7177 if len(q.s) == 0 {
7178 panic("invalid use of queue")
7179 }
7180 return q.s[0]
7181 }
7182
7183 func (q *http2writeQueue) shift() http2frameWriteMsg {
7184 if len(q.s) == 0 {
7185 panic("invalid use of queue")
7186 }
7187 wm := q.s[0]
7188
7189 copy(q.s, q.s[1:])
7190 q.s[len(q.s)-1] = http2frameWriteMsg{}
7191 q.s = q.s[:len(q.s)-1]
7192 return wm
7193 }
7194
7195 func (q *http2writeQueue) firstIsNoCost() bool {
7196 if df, ok := q.s[0].write.(*http2writeData); ok {
7197 return len(df.p) == 0
7198 }
7199 return true
7200 }
7201
View as plain text