github.com/4ad/go@v0.0.0-20161219182952-69a12818b605/src/net/http/h2_bundle.go (about) 1 // Code generated by golang.org/x/tools/cmd/bundle. 2 //go:generate bundle -o h2_bundle.go -prefix http2 -underscore golang.org/x/net/http2 3 4 // Package http2 implements the HTTP/2 protocol. 5 // 6 // This package is low-level and intended to be used directly by very 7 // few people. Most users will use it indirectly through the automatic 8 // use by the net/http package (from Go 1.6 and later). 9 // For use in earlier Go versions see ConfigureServer. (Transport support 10 // requires Go 1.6 or later) 11 // 12 // See https://http2.github.io/ for more information on HTTP/2. 13 // 14 // See https://http2.golang.org/ for a test server running this code. 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 // ClientConnPool manages a pool of HTTP/2 client connections. 50 type http2ClientConnPool interface { 51 GetClientConn(req *Request, addr string) (*http2ClientConn, error) 52 MarkDead(*http2ClientConn) 53 } 54 55 // clientConnPoolIdleCloser is the interface implemented by ClientConnPool 56 // implementations which can close their idle connections. 57 type http2clientConnPoolIdleCloser interface { 58 http2ClientConnPool 59 closeIdleConnections() 60 } 61 62 var ( 63 _ http2clientConnPoolIdleCloser = (*http2clientConnPool)(nil) 64 _ http2clientConnPoolIdleCloser = http2noDialClientConnPool{} 65 ) 66 67 // TODO: use singleflight for dialing and addConnCalls? 68 type http2clientConnPool struct { 69 t *http2Transport 70 71 mu sync.Mutex // TODO: maybe switch to RWMutex 72 // TODO: add support for sharing conns based on cert names 73 // (e.g. share conn for googleapis.com and appspot.com) 74 conns map[string][]*http2ClientConn // key is host:port 75 dialing map[string]*http2dialCall // currently in-flight dials 76 keys map[*http2ClientConn][]string 77 addConnCalls map[string]*http2addConnCall // in-flight addConnIfNeede calls 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 // It gets its own connection. 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 // dialCall is an in-flight Transport dial call to a host. 117 type http2dialCall struct { 118 p *http2clientConnPool 119 done chan struct{} // closed when done 120 res *http2ClientConn // valid after done is closed 121 err error // valid after done is closed 122 } 123 124 // requires p.mu is held. 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 // run in its own goroutine. 140 func (c *http2dialCall) dial(addr string) { 141 const singleUse = false // shared conn 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 // addConnIfNeeded makes a NewClientConn out of c if a connection for key doesn't 154 // already exist. It coalesces concurrent calls with the same key. 155 // This is used by the http1 Transport code when it creates a new connection. Because 156 // the http1 Transport doesn't de-dup TCP dials to outbound hosts (because it doesn't know 157 // the protocol), it can get into a situation where it has multiple TLS connections. 158 // This code decides which ones live or die. 159 // The return value used is whether c was used. 160 // c is never closed. 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{} // closed when done 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 // p.mu must be held 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 // noDialClientConnPool is an implementation of http2.ClientConnPool 278 // which never dials. We let the HTTP/1.1 client dial and use its TLS 279 // connection instead. 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 // registerHTTPSProtocol calls Transport.RegisterProtocol but 327 // convering panics into errors. 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 // noDialH2RoundTripper is a RoundTripper which only tries to complete the request 339 // if there's already has a cached connection to the host. 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 // An ErrCode is an unsigned 32-bit error code as defined in the HTTP/2 spec. 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 // ConnectionError is an error that results in the termination of the 395 // entire connection. 396 type http2ConnectionError http2ErrCode 397 398 func (e http2ConnectionError) Error() string { 399 return fmt.Sprintf("connection error: %s", http2ErrCode(e)) 400 } 401 402 // StreamError is an error that only affects one stream within an 403 // HTTP/2 connection. 404 type http2StreamError struct { 405 StreamID uint32 406 Code http2ErrCode 407 Cause error // optional additional detail 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 // 6.9.1 The Flow Control Window 422 // "If a sender receives a WINDOW_UPDATE that causes a flow control 423 // window to exceed this maximum it MUST terminate either the stream 424 // or the connection, as appropriate. For streams, [...]; for the 425 // connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code." 426 type http2goAwayFlowError struct{} 427 428 func (http2goAwayFlowError) Error() string { return "connection exceeded flow control window size" } 429 430 // Errors of this type are only returned by the frame parser functions 431 // and converted into ConnectionError(ErrCodeProtocol). 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 // fixedBuffer is an io.ReadWriter backed by a fixed size buffer. 471 // It never allocates, but moves old data as new data is written. 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 // Read copies bytes from the buffer into p. 483 // It is an error to read when no data is available. 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 // Len returns the number of bytes of the unread portion of the buffer. 498 func (b *http2fixedBuffer) Len() int { 499 return b.w - b.r 500 } 501 502 // Write copies bytes from p into the buffer. 503 // It is an error to write more data than the buffer can hold. 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 // flow is the flow control window's size. 521 type http2flow struct { 522 // n is the number of DATA bytes we're allowed to send. 523 // A flow is kept both on a conn and a per-stream. 524 n int32 525 526 // conn points to the shared connection-level flow that is 527 // shared by all streams on that conn. It is nil for the flow 528 // that's on the conn directly. 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 // add adds n bytes (positive or negative) to the flow control window. 553 // It returns false if the sum would exceed 2^31-1. 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) // zeros for padding 566 567 // A FrameType is a registered frame type as defined in 568 // http://http2.github.io/http2-spec/#rfc.section.11.2 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 // Flags is a bitmask of HTTP/2 flags. 605 // The meaning of flags varies depending on the frame type. 606 type http2Flags uint8 607 608 // Has reports whether f contains all (0 or more) flags in v. 609 func (f http2Flags) Has(v http2Flags) bool { 610 return (f & v) == v 611 } 612 613 // Frame-specific FrameHeader flag bits. 614 const ( 615 // Data Frame 616 http2FlagDataEndStream http2Flags = 0x1 617 http2FlagDataPadded http2Flags = 0x8 618 619 // Headers Frame 620 http2FlagHeadersEndStream http2Flags = 0x1 621 http2FlagHeadersEndHeaders http2Flags = 0x4 622 http2FlagHeadersPadded http2Flags = 0x8 623 http2FlagHeadersPriority http2Flags = 0x20 624 625 // Settings Frame 626 http2FlagSettingsAck http2Flags = 0x1 627 628 // Ping Frame 629 http2FlagPingAck http2Flags = 0x1 630 631 // Continuation Frame 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 // a frameParser parses a frame given its FrameHeader and payload 665 // bytes. The length of payload will always equal fh.Length (which 666 // might be 0). 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 // A FrameHeader is the 9 byte header of all HTTP/2 frames. 690 // 691 // See http://http2.github.io/http2-spec/#FrameHeader 692 type http2FrameHeader struct { 693 valid bool // caller can access []byte fields in the Frame 694 695 // Type is the 1 byte frame type. There are ten standard frame 696 // types, but extension frame types may be written by WriteRawFrame 697 // and will be returned by ReadFrame (as UnknownFrame). 698 Type http2FrameType 699 700 // Flags are the 1 byte of 8 potential bit flags per frame. 701 // They are specific to the frame type. 702 Flags http2Flags 703 704 // Length is the length of the frame, not including the 9 byte header. 705 // The maximum size is one byte less than 16MB (uint24), but only 706 // frames up to 16KB are allowed without peer agreement. 707 Length uint32 708 709 // StreamID is which stream this frame is for. Certain frames 710 // are not stream-specific, in which case this field is 0. 711 StreamID uint32 712 } 713 714 // Header returns h. It exists so FrameHeaders can be embedded in other 715 // specific frame types and implement the Frame interface. 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 // frame header bytes. 762 // Used only by ReadFrameHeader. 763 var http2fhBytes = sync.Pool{ 764 New: func() interface{} { 765 buf := make([]byte, http2frameHeaderLen) 766 return &buf 767 }, 768 } 769 770 // ReadFrameHeader reads 9 bytes from r and returns a FrameHeader. 771 // Most users should use Framer.ReadFrame instead. 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 // A Frame is the base interface implemented by all frame types. 793 // Callers will generally type-assert the specific frame type: 794 // *HeadersFrame, *SettingsFrame, *WindowUpdateFrame, etc. 795 // 796 // Frames are only valid until the next call to Framer.ReadFrame. 797 type http2Frame interface { 798 Header() http2FrameHeader 799 800 // invalidate is called by Framer.ReadFrame to make this 801 // frame's buffers as being invalid, since the subsequent 802 // frame will reuse them. 803 invalidate() 804 } 805 806 // A Framer reads and writes Frames. 807 type http2Framer struct { 808 r io.Reader 809 lastFrame http2Frame 810 errDetail error 811 812 // lastHeaderStream is non-zero if the last frame was an 813 // unfinished HEADERS/CONTINUATION. 814 lastHeaderStream uint32 815 816 maxReadSize uint32 817 headerBuf [http2frameHeaderLen]byte 818 819 // TODO: let getReadBuf be configurable, and use a less memory-pinning 820 // allocator in server.go to minimize memory pinned for many idle conns. 821 // Will probably also need to make frame invalidation have a hook too. 822 getReadBuf func(size uint32) []byte 823 readBuf []byte // cache for default getReadBuf 824 825 maxWriteSize uint32 // zero means unlimited; TODO: implement 826 827 w io.Writer 828 wbuf []byte 829 830 // AllowIllegalWrites permits the Framer's Write methods to 831 // write frames that do not conform to the HTTP/2 spec. This 832 // permits using the Framer to test other HTTP/2 833 // implementations' conformance to the spec. 834 // If false, the Write methods will prefer to return an error 835 // rather than comply. 836 AllowIllegalWrites bool 837 838 // AllowIllegalReads permits the Framer's ReadFrame method 839 // to return non-compliant frames or frame orders. 840 // This is for testing and permits using the Framer to test 841 // other HTTP/2 implementations' conformance to the spec. 842 // It is not compatible with ReadMetaHeaders. 843 AllowIllegalReads bool 844 845 // ReadMetaHeaders if non-nil causes ReadFrame to merge 846 // HEADERS and CONTINUATION frames together and return 847 // MetaHeadersFrame instead. 848 ReadMetaHeaders *hpack.Decoder 849 850 // MaxHeaderListSize is the http2 MAX_HEADER_LIST_SIZE. 851 // It's used only if ReadMetaHeaders is set; 0 means a sane default 852 // (currently 16MB) 853 // If the limit is hit, MetaHeadersFrame.Truncated is set true. 854 MaxHeaderListSize uint32 855 856 logReads bool 857 858 debugFramer *http2Framer // only use for logging written writes 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 // NewFramer returns a Framer that writes frames to w and reads them from r. 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 // SetMaxReadFrameSize sets the maximum size of a frame 955 // that will be read by a subsequent call to ReadFrame. 956 // It is the caller's responsibility to advertise this 957 // limit with a SETTINGS frame. 958 func (fr *http2Framer) SetMaxReadFrameSize(v uint32) { 959 if v > http2maxFrameSize { 960 v = http2maxFrameSize 961 } 962 fr.maxReadSize = v 963 } 964 965 // ErrorDetail returns a more detailed error of the last error 966 // returned by Framer.ReadFrame. For instance, if ReadFrame 967 // returns a StreamError with code PROTOCOL_ERROR, ErrorDetail 968 // will say exactly what was invalid. ErrorDetail is not guaranteed 969 // to return a non-nil value and like the rest of the http2 package, 970 // its return value is not protected by an API compatibility promise. 971 // ErrorDetail is reset after the next call to ReadFrame. 972 func (fr *http2Framer) ErrorDetail() error { 973 return fr.errDetail 974 } 975 976 // ErrFrameTooLarge is returned from Framer.ReadFrame when the peer 977 // sends a frame that is larger than declared with SetMaxReadFrameSize. 978 var http2ErrFrameTooLarge = errors.New("http2: frame too large") 979 980 // terminalReadFrameError reports whether err is an unrecoverable 981 // error from ReadFrame and no other frames should be read. 982 func http2terminalReadFrameError(err error) bool { 983 if _, ok := err.(http2StreamError); ok { 984 return false 985 } 986 return err != nil 987 } 988 989 // ReadFrame reads a single frame. The returned Frame is only valid 990 // until the next call to ReadFrame. 991 // 992 // If the frame is larger than previously set with SetMaxReadFrameSize, the 993 // returned error is ErrFrameTooLarge. Other errors may be of type 994 // ConnectionError, StreamError, or anything else from the underlying 995 // reader. 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 // connError returns ConnectionError(code) but first 1032 // stashes away a public reason to the caller can optionally relay it 1033 // to the peer before hanging up on them. This might help others debug 1034 // their implementations. 1035 func (fr *http2Framer) connError(code http2ErrCode, reason string) error { 1036 fr.errDetail = errors.New(reason) 1037 return http2ConnectionError(code) 1038 } 1039 1040 // checkFrameOrder reports an error if f is an invalid frame to return 1041 // next from ReadFrame. Mostly it checks whether HEADERS and 1042 // CONTINUATION frames are contiguous. 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 // A DataFrame conveys arbitrary, variable-length sequences of octets 1080 // associated with a stream. 1081 // See http://http2.github.io/http2-spec/#rfc.section.6.1 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 // Data returns the frame's data octets, not including any padding 1092 // size byte or padding suffix bytes. 1093 // The caller must not retain the returned memory past the next 1094 // call to ReadFrame. 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 // WriteData writes a DATA frame. 1139 // 1140 // It will perform exactly one Write to the underlying Writer. 1141 // It is the caller's responsibility not to violate the maximum frame size 1142 // and to not call other Write methods concurrently. 1143 func (f *http2Framer) WriteData(streamID uint32, endStream bool, data []byte) error { 1144 return f.WriteDataPadded(streamID, endStream, data, nil) 1145 } 1146 1147 // WriteData writes a DATA frame with optional padding. 1148 // 1149 // If pad is nil, the padding bit is not sent. 1150 // The length of pad must not exceed 255 bytes. 1151 // 1152 // It will perform exactly one Write to the underlying Writer. 1153 // It is the caller's responsibility not to violate the maximum frame size 1154 // and to not call other Write methods concurrently. 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 // A SettingsFrame conveys configuration parameters that affect how 1179 // endpoints communicate, such as preferences and constraints on peer 1180 // behavior. 1181 // 1182 // See http://http2.github.io/http2-spec/#SETTINGS 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 // ForeachSetting runs fn for each setting. 1227 // It stops and returns the first error. 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 // WriteSettings writes a SETTINGS frame with zero or more settings 1244 // specified and the ACK bit not set. 1245 // 1246 // It will perform exactly one Write to the underlying Writer. 1247 // It is the caller's responsibility to not call other Write methods concurrently. 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 // WriteSettings writes an empty SETTINGS frame with the ACK bit set. 1258 // 1259 // It will perform exactly one Write to the underlying Writer. 1260 // It is the caller's responsibility to not call other Write methods concurrently. 1261 func (f *http2Framer) WriteSettingsAck() error { 1262 f.startWrite(http2FrameSettings, http2FlagSettingsAck, 0) 1263 return f.endWrite() 1264 } 1265 1266 // A PingFrame is a mechanism for measuring a minimal round trip time 1267 // from the sender, as well as determining whether an idle connection 1268 // is still functional. 1269 // See http://http2.github.io/http2-spec/#rfc.section.6.7 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 // A GoAwayFrame informs the remote peer to stop creating streams on this connection. 1300 // See http://http2.github.io/http2-spec/#rfc.section.6.8 1301 type http2GoAwayFrame struct { 1302 http2FrameHeader 1303 LastStreamID uint32 1304 ErrCode http2ErrCode 1305 debugData []byte 1306 } 1307 1308 // DebugData returns any debug data in the GOAWAY frame. Its contents 1309 // are not defined. 1310 // The caller must not retain the returned memory past the next 1311 // call to ReadFrame. 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 // An UnknownFrame is the frame type returned when the frame type is unknown 1341 // or no specific frame type parser exists. 1342 type http2UnknownFrame struct { 1343 http2FrameHeader 1344 p []byte 1345 } 1346 1347 // Payload returns the frame's payload (after the header). It is not 1348 // valid to call this method after a subsequent call to 1349 // Framer.ReadFrame, nor is it valid to retain the returned slice. 1350 // The memory is owned by the Framer and is invalidated when the next 1351 // frame is read. 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 // A WindowUpdateFrame is used to implement flow control. 1362 // See http://http2.github.io/http2-spec/#rfc.section.6.9 1363 type http2WindowUpdateFrame struct { 1364 http2FrameHeader 1365 Increment uint32 // never read with high bit set 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 // WriteWindowUpdate writes a WINDOW_UPDATE frame. 1387 // The increment value must be between 1 and 2,147,483,647, inclusive. 1388 // If the Stream ID is zero, the window update applies to the 1389 // connection as a whole. 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 // A HeadersFrame is used to open a stream and additionally carries a 1401 // header block fragment. 1402 type http2HeadersFrame struct { 1403 http2FrameHeader 1404 1405 // Priority is set if FlagHeadersPriority is set in the FrameHeader. 1406 Priority http2PriorityParam 1407 1408 headerFragBuf []byte // not owned 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 // HeadersFrameParam are the parameters for writing a HEADERS frame. 1463 type http2HeadersFrameParam struct { 1464 // StreamID is the required Stream ID to initiate. 1465 StreamID uint32 1466 // BlockFragment is part (or all) of a Header Block. 1467 BlockFragment []byte 1468 1469 // EndStream indicates that the header block is the last that 1470 // the endpoint will send for the identified stream. Setting 1471 // this flag causes the stream to enter one of "half closed" 1472 // states. 1473 EndStream bool 1474 1475 // EndHeaders indicates that this frame contains an entire 1476 // header block and is not followed by any 1477 // CONTINUATION frames. 1478 EndHeaders bool 1479 1480 // PadLength is the optional number of bytes of zeros to add 1481 // to this frame. 1482 PadLength uint8 1483 1484 // Priority, if non-zero, includes stream priority information 1485 // in the HEADER frame. 1486 Priority http2PriorityParam 1487 } 1488 1489 // WriteHeaders writes a single HEADERS frame. 1490 // 1491 // This is a low-level header writing method. Encoding headers and 1492 // splitting them into any necessary CONTINUATION frames is handled 1493 // elsewhere. 1494 // 1495 // It will perform exactly one Write to the underlying Writer. 1496 // It is the caller's responsibility to not call other Write methods concurrently. 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 // A PriorityFrame specifies the sender-advised priority of a stream. 1535 // See http://http2.github.io/http2-spec/#rfc.section.6.3 1536 type http2PriorityFrame struct { 1537 http2FrameHeader 1538 http2PriorityParam 1539 } 1540 1541 // PriorityParam are the stream prioritzation parameters. 1542 type http2PriorityParam struct { 1543 // StreamDep is a 31-bit stream identifier for the 1544 // stream that this stream depends on. Zero means no 1545 // dependency. 1546 StreamDep uint32 1547 1548 // Exclusive is whether the dependency is exclusive. 1549 Exclusive bool 1550 1551 // Weight is the stream's zero-indexed weight. It should be 1552 // set together with StreamDep, or neither should be set. Per 1553 // the spec, "Add one to the value to obtain a weight between 1554 // 1 and 256." 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 // WritePriority writes a PRIORITY frame. 1582 // 1583 // It will perform exactly one Write to the underlying Writer. 1584 // It is the caller's responsibility to not call other Write methods concurrently. 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 // A RSTStreamFrame allows for abnormal termination of a stream. 1603 // See http://http2.github.io/http2-spec/#rfc.section.6.4 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 // WriteRSTStream writes a RST_STREAM frame. 1620 // 1621 // It will perform exactly one Write to the underlying Writer. 1622 // It is the caller's responsibility to not call other Write methods concurrently. 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 // A ContinuationFrame is used to continue a sequence of header block fragments. 1633 // See http://http2.github.io/http2-spec/#rfc.section.6.10 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 // WriteContinuation writes a CONTINUATION frame. 1656 // 1657 // It will perform exactly one Write to the underlying Writer. 1658 // It is the caller's responsibility to not call other Write methods concurrently. 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 // A PushPromiseFrame is used to initiate a server stream. 1673 // See http://http2.github.io/http2-spec/#rfc.section.6.6 1674 type http2PushPromiseFrame struct { 1675 http2FrameHeader 1676 PromiseID uint32 1677 headerFragBuf []byte // not owned 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 // The PUSH_PROMISE frame includes optional padding. 1698 // Padding fields and flags are identical to those defined for DATA frames 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 // PushPromiseParam are the parameters for writing a PUSH_PROMISE frame. 1721 type http2PushPromiseParam struct { 1722 // StreamID is the required Stream ID to initiate. 1723 StreamID uint32 1724 1725 // PromiseID is the required Stream ID which this 1726 // Push Promises 1727 PromiseID uint32 1728 1729 // BlockFragment is part (or all) of a Header Block. 1730 BlockFragment []byte 1731 1732 // EndHeaders indicates that this frame contains an entire 1733 // header block and is not followed by any 1734 // CONTINUATION frames. 1735 EndHeaders bool 1736 1737 // PadLength is the optional number of bytes of zeros to add 1738 // to this frame. 1739 PadLength uint8 1740 } 1741 1742 // WritePushPromise writes a single PushPromise Frame. 1743 // 1744 // As with Header Frames, This is the low level call for writing 1745 // individual frames. Continuation frames are handled elsewhere. 1746 // 1747 // It will perform exactly one Write to the underlying Writer. 1748 // It is the caller's responsibility to not call other Write methods concurrently. 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 // WriteRawFrame writes a raw frame. This can be used to write 1774 // extension frames unknown to this package. 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 // A MetaHeadersFrame is the representation of one HEADERS frame and 1809 // zero or more contiguous CONTINUATION frames and the decoding of 1810 // their HPACK-encoded contents. 1811 // 1812 // This type of frame does not appear on the wire and is only returned 1813 // by the Framer when Framer.ReadMetaHeaders is set. 1814 type http2MetaHeadersFrame struct { 1815 *http2HeadersFrame 1816 1817 // Fields are the fields contained in the HEADERS and 1818 // CONTINUATION frames. The underlying slice is owned by the 1819 // Framer and must not be retained after the next call to 1820 // ReadFrame. 1821 // 1822 // Fields are guaranteed to be in the correct http2 order and 1823 // not have unknown pseudo header fields or invalid header 1824 // field names or values. Required pseudo header fields may be 1825 // missing, however. Use the MetaHeadersFrame.Pseudo accessor 1826 // method access pseudo headers. 1827 Fields []hpack.HeaderField 1828 1829 // Truncated is whether the max header list size limit was hit 1830 // and Fields is incomplete. The hpack decoder state is still 1831 // valid, however. 1832 Truncated bool 1833 } 1834 1835 // PseudoValue returns the given pseudo header field's value. 1836 // The provided pseudo field should not contain the leading colon. 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 // RegularFields returns the regular (non-pseudo) header fields of mh. 1850 // The caller does not own the returned slice. 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 // PseudoFields returns the pseudo header fields of mh. 1861 // The caller does not own the returned slice. 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 // readMetaFrame returns 0 or more CONTINUATION frames from fr and 1906 // merge them into into the provided hf and returns a MetaHeadersFrame 1907 // with the decoded hpack values. 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 // pseudo header field errors 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 // isBadCipher reports whether the cipher is blacklisted by the HTTP/2 spec. 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 // parseUintBytes is like strconv.ParseUint, but using a []byte. 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 // Return the first number n such that n*base >= 1<<64. 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{} // Go-Canonical-Case -> lower-case 2301 http2commonCanonHeader = map[string]string{} // lower-case -> Go-Canonical-Case 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 // ClientPreface is the string that must be sent by new 2387 // connections from clients. 2388 http2ClientPreface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" 2389 2390 // SETTINGS_MAX_FRAME_SIZE default 2391 // http://http2.github.io/http2-spec/#rfc.section.6.5.2 2392 http2initialMaxFrameSize = 16384 2393 2394 // NextProtoTLS is the NPN/ALPN protocol negotiated during 2395 // HTTP/2's TLS setup. 2396 http2NextProtoTLS = "h2" 2397 2398 // http://http2.github.io/http2-spec/#SettingValues 2399 http2initialHeaderTableSize = 4096 2400 2401 http2initialWindowSize = 65535 // 6.9.2 Initial Flow Control Window Size 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 // Setting is a setting parameter: which setting it is, and its value. 2437 type http2Setting struct { 2438 // ID is which setting is being set. 2439 // See http://http2.github.io/http2-spec/#SettingValues 2440 ID http2SettingID 2441 2442 // Val is the value. 2443 Val uint32 2444 } 2445 2446 func (s http2Setting) String() string { 2447 return fmt.Sprintf("[%v = %d]", s.ID, s.Val) 2448 } 2449 2450 // Valid reports whether the setting is valid. 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 // A SettingID is an HTTP/2 setting as defined in 2471 // http://http2.github.io/http2-spec/#iana-settings 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 // validWireHeaderFieldName reports whether v is a valid header field 2505 // name (key). See httplex.ValidHeaderName for the base rules. 2506 // 2507 // Further, http2 says: 2508 // "Just as in HTTP/1.x, header field names are strings of ASCII 2509 // characters that are compared in a case-insensitive 2510 // fashion. However, header field names MUST be converted to 2511 // lowercase prior to their encoding in HTTP/2. " 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{} // n -> strconv.Itoa(n) 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 // from pkg io 2545 type http2stringWriter interface { 2546 WriteString(s string) (n int, err error) 2547 } 2548 2549 // A gate lets two goroutines coordinate their activities. 2550 type http2gate chan struct{} 2551 2552 func (g http2gate) Done() { g <- struct{}{} } 2553 2554 func (g http2gate) Wait() { <-g } 2555 2556 // A closeWaiter is like a sync.WaitGroup but only goes 1 to 0 (open to closed). 2557 type http2closeWaiter chan struct{} 2558 2559 // Init makes a closeWaiter usable. 2560 // It exists because so a closeWaiter value can be placed inside a 2561 // larger struct and have the Mutex and Cond's memory in the same 2562 // allocation. 2563 func (cw *http2closeWaiter) Init() { 2564 *cw = make(chan struct{}) 2565 } 2566 2567 // Close marks the closeWaiter as closed and unblocks any waiters. 2568 func (cw http2closeWaiter) Close() { 2569 close(cw) 2570 } 2571 2572 // Wait waits for the closeWaiter to become closed. 2573 func (cw http2closeWaiter) Wait() { 2574 <-cw 2575 } 2576 2577 // bufferedWriter is a buffered writer that writes to w. 2578 // Its buffered writer is lazily allocated as needed, to minimize 2579 // idle memory usage with many connections. 2580 type http2bufferedWriter struct { 2581 w io.Writer // immutable 2582 bw *bufio.Writer // non-nil when data is buffered 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 // bodyAllowedForStatus reports whether a given response status code 2625 // permits a body. See RFC 2616, section 4.4. 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 // owned by sorter 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 // Keys returns the sorted keys of h. 2668 // 2669 // The returned slice is only valid until s used again or returned to 2670 // its pool. 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 // pipe is a goroutine-safe io.Reader/io.Writer pair. It's like 2690 // io.Pipe except there are no PipeReader/PipeWriter halves, and the 2691 // underlying buffer is an interface. (io.Pipe is always unbuffered) 2692 type http2pipe struct { 2693 mu sync.Mutex 2694 c sync.Cond // c.L lazily initialized to &p.mu 2695 b http2pipeBuffer 2696 err error // read error once empty. non-nil means closed. 2697 breakErr error // immediate read error (caller doesn't see rest of b) 2698 donec chan struct{} // closed on error 2699 readFn func() // optional code to run in Read before error 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 // Read waits until data is available and copies bytes 2715 // from the buffer into p. 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 // Write copies bytes from p into the buffer and wakes a reader. 2743 // It is an error to write more data than the buffer can hold. 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 // CloseWithError causes the next Read (waking up a current blocked 2758 // Read if needed) to return the provided err after all data has been 2759 // read. 2760 // 2761 // The error must be non-nil. 2762 func (p *http2pipe) CloseWithError(err error) { p.closeWithError(&p.err, err, nil) } 2763 2764 // BreakWithError causes the next Read (waking up a current blocked 2765 // Read if needed) to return the provided err immediately, without 2766 // waiting for unread data. 2767 func (p *http2pipe) BreakWithError(err error) { p.closeWithError(&p.breakErr, err, nil) } 2768 2769 // closeWithErrorAndCode is like CloseWithError but also sets some code to run 2770 // in the caller's goroutine before returning the error. 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 // requires p.mu be held. 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 // Err returns the error (if any) first set by BreakWithError or CloseWithError. 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 // Done returns a channel which is closed if and when this pipe is closed 2816 // with CloseWithError. 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 // should be in-flight with preface anyway 2833 http2handlerChunkWriteSize = 4 << 10 2834 http2defaultMaxStreams = 250 // TODO: make this 100 as the GFE seems to? 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 // Test hooks. 2853 var ( 2854 http2testHookOnConn func() 2855 http2testHookGetServerConn func(*http2serverConn) 2856 http2testHookOnPanicMu *sync.Mutex // nil except in tests 2857 http2testHookOnPanic func(sc *http2serverConn, panicVal interface{}) (rePanic bool) 2858 ) 2859 2860 // Server is an HTTP/2 server. 2861 type http2Server struct { 2862 // MaxHandlers limits the number of http.Handler ServeHTTP goroutines 2863 // which may run at a time over all connections. 2864 // Negative or zero no limit. 2865 // TODO: implement 2866 MaxHandlers int 2867 2868 // MaxConcurrentStreams optionally specifies the number of 2869 // concurrent streams that each client may have open at a 2870 // time. This is unrelated to the number of http.Handler goroutines 2871 // which may be active globally, which is MaxHandlers. 2872 // If zero, MaxConcurrentStreams defaults to at least 100, per 2873 // the HTTP/2 spec's recommendations. 2874 MaxConcurrentStreams uint32 2875 2876 // MaxReadFrameSize optionally specifies the largest frame 2877 // this server is willing to read. A valid value is between 2878 // 16k and 16M, inclusive. If zero or otherwise invalid, a 2879 // default value is used. 2880 MaxReadFrameSize uint32 2881 2882 // PermitProhibitedCipherSuites, if true, permits the use of 2883 // cipher suites prohibited by the HTTP/2 spec. 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 // ConfigureServer adds HTTP/2 support to a net/http Server. 2902 // 2903 // The configuration conf may be nil. 2904 // 2905 // ConfigureServer must be called before s begins serving. 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 // If they already provided a CipherSuite list, return 2915 // an error if it has a bad order or is missing 2916 // ECDHE_RSA_WITH_AES_128_GCM_SHA256. 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 // ServeConnOpts are options for the Server.ServeConn method. 2968 type http2ServeConnOpts struct { 2969 // BaseConfig optionally sets the base configuration 2970 // for values. If nil, defaults are used. 2971 BaseConfig *Server 2972 2973 // Handler specifies which handler to use for processing 2974 // requests. If nil, BaseConfig.Handler is used. If BaseConfig 2975 // or BaseConfig.Handler is nil, http.DefaultServeMux is used. 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 // ServeConn serves HTTP/2 requests on the provided connection and 2999 // blocks until the connection is no longer readable. 3000 // 3001 // ServeConn starts speaking HTTP/2 assuming that c has not had any 3002 // reads or writes. It writes its initial settings frame and expects 3003 // to be able to read the preface and settings frame from the 3004 // client. If c has a ConnectionState method like a *tls.Conn, the 3005 // ConnectionState is used to verify the TLS ciphersuite and to set 3006 // the Request.TLS field in Handlers. 3007 // 3008 // ServeConn does not support h2c by itself. Any h2c support must be 3009 // implemented in terms of providing a suitably-behaving net.Conn. 3010 // 3011 // The opts parameter is optional. If nil, default values are used. 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 // Immutable: 3086 srv *http2Server 3087 hs *Server 3088 conn net.Conn 3089 bw *http2bufferedWriter // writing to conn 3090 handler Handler 3091 baseCtx http2contextContext 3092 framer *http2Framer 3093 doneServing chan struct{} // closed when serverConn.serve ends 3094 readFrameCh chan http2readFrameResult // written by serverConn.readFrames 3095 wantWriteFrameCh chan http2frameWriteMsg // from handlers -> serve 3096 wroteFrameCh chan http2frameWriteResult // from writeFrameAsync -> serve, tickles more frame writes 3097 bodyReadCh chan http2bodyReadMsg // from handlers -> serve 3098 testHookCh chan func(int) // code to run on the serve loop 3099 flow http2flow // conn-wide (not stream-specific) outbound flow control 3100 inflow http2flow // conn-wide inbound flow control 3101 tlsState *tls.ConnectionState // shared by all handlers, like net/http 3102 remoteAddrStr string 3103 3104 // Everything following is owned by the serve loop; use serveG.check(): 3105 serveG http2goroutineLock // used to verify funcs are on serve() 3106 pushEnabled bool 3107 sawFirstSettings bool // got the initial SETTINGS frame after the preface 3108 needToSendSettingsAck bool 3109 unackedSettings int // how many SETTINGS have we sent without ACKs? 3110 clientMaxStreams uint32 // SETTINGS_MAX_CONCURRENT_STREAMS from client (our PUSH_PROMISE limit) 3111 advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client 3112 curOpenStreams uint32 // client's number of open streams 3113 maxStreamID uint32 // max ever seen 3114 streams map[uint32]*http2stream 3115 initialWindowSize int32 3116 headerTableSize uint32 3117 peerMaxHeaderListSize uint32 // zero means unknown (default) 3118 canonHeader map[string]string // http2-lower-case -> Go-Canonical-Case 3119 writingFrame bool // started write goroutine but haven't heard back on wroteFrameCh 3120 needsFrameFlush bool // last frame write wasn't a flush 3121 writeSched http2writeScheduler 3122 inGoAway bool // we've started to or sent GOAWAY 3123 needToSendGoAway bool // we need to schedule a GOAWAY frame write 3124 goAwayCode http2ErrCode 3125 shutdownTimerCh <-chan time.Time // nil until used 3126 shutdownTimer *time.Timer // nil until used 3127 freeRequestBodyBuf []byte // if non-nil, a free initialWindowSize buffer for getRequestBodyBuf 3128 3129 // Owned by the writeFrameAsync goroutine: 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 // http2's count is in a slightly different unit and includes 32 bytes per pair. 3140 // So, take the net/http.Server value and pad it up a bit, assuming 10 headers. 3141 const perFieldOverhead = 32 // per http2 spec 3142 const typicalHeaders = 10 // conservative 3143 return uint32(n + typicalHeaders*perFieldOverhead) 3144 } 3145 3146 // stream represents a stream. This is the minimal metadata needed by 3147 // the serve goroutine. Most of the actual stream state is owned by 3148 // the http.Handler's goroutine in the responseWriter. Because the 3149 // responseWriter's responseWriterState is recycled at the end of a 3150 // handler, this struct intentionally has no pointer to the 3151 // *responseWriter{,State} itself, as the Handler ending nils out the 3152 // responseWriter's state field. 3153 type http2stream struct { 3154 // immutable: 3155 sc *http2serverConn 3156 id uint32 3157 body *http2pipe // non-nil if expecting DATA frames 3158 cw http2closeWaiter // closed wait stream transitions to closed state 3159 ctx http2contextContext 3160 cancelCtx func() 3161 3162 // owned by serverConn's serve loop: 3163 bodyBytes int64 // body bytes seen so far 3164 declBodyBytes int64 // or -1 if undeclared 3165 flow http2flow // limits writing from Handler to client 3166 inflow http2flow // what the client is allowed to POST/etc to us 3167 parent *http2stream // or nil 3168 numTrailerValues int64 3169 weight uint8 3170 state http2streamState 3171 sentReset bool // only true once detached from streams map 3172 gotReset bool // only true once detacted from streams map 3173 gotTrailerHeader bool // HEADER frame for trailers was seen 3174 wroteHeaders bool // whether we wrote headers (not status 100) 3175 reqBuf []byte 3176 3177 trailer Header // accumulated trailers 3178 reqTrailer Header // handler's Request.Trailer 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 // setConnState calls the net/http ConnState hook for this connection, if configured. 3205 // Note that the net/http package does StateNew and StateClosed for us. 3206 // There is currently no plan for StateHijacked or hijacking HTTP/2 connections. 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 // errno returns v's underlying uintptr, else 0. 3228 // 3229 // TODO: remove this helper function once http2 can use build 3230 // tags. See comment in isClosedConnError. 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 // isClosedConnError reports whether err is an error from use of a closed 3239 // network connection. 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 // valid until readMore is called 3296 err error 3297 3298 // readMore should be called once the consumer no longer needs or 3299 // retains f. After readMore, f is invalid and more frames can be 3300 // read. 3301 readMore func() 3302 } 3303 3304 // readFrames is the loop that reads incoming frames. 3305 // It takes care to only read one frame at a time, blocking until the 3306 // consumer is done with the frame. 3307 // It's run on its own goroutine. 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 // frameWriteResult is the message passed from writeFrameAsync to the serve goroutine. 3330 type http2frameWriteResult struct { 3331 wm http2frameWriteMsg // what was written (or attempted) 3332 err error // result of the writeFrame call 3333 } 3334 3335 // writeFrameAsync runs in its own goroutine and writes a single frame 3336 // and then reports when it's done. 3337 // At most one goroutine can be running writeFrameAsync at a time per 3338 // serverConn. 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 // readPreface reads the ClientPreface greeting from the peer 3437 // or returns an error on timeout or an invalid greeting. 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 // writeDataFromHandler writes DATA response frames from a handler on 3475 // the given stream. 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 // the frame write is done (successfully or not) 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 // writeFrameFromHandler sends wm to sc.wantWriteFrameCh, but aborts 3511 // if the connection has gone away. 3512 // 3513 // This must not be run from the serve goroutine itself, else it might 3514 // deadlock writing to sc.wantWriteFrameCh (which is only mildly 3515 // buffered and is read by serve itself). If you're on the serve 3516 // goroutine, call writeFrame instead. 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 // writeFrame schedules a frame to write and sends it if there's nothing 3529 // already being written. 3530 // 3531 // There is no pushback here (the serve goroutine never blocks). It's 3532 // the http.Handlers that block, waiting for their previous frames to 3533 // make it onto the wire 3534 // 3535 // If you're not on the serve goroutine, use writeFrameFromHandler instead. 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 // startFrameWrite starts a goroutine to write wm (in a separate 3557 // goroutine since that might block on the network), and updates the 3558 // serve goroutine's state about the world, updated from info in wm. 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 // errHandlerPanicked is the error given to any callers blocked in a read from 3586 // Request.Body when the main goroutine panics. Since most handlers read in the 3587 // the main ServeHTTP goroutine, this will show up rarely. 3588 var http2errHandlerPanicked = errors.New("http2: handler panicked") 3589 3590 // wroteFrame is called on the serve goroutine with the result of 3591 // whatever happened on writeFrameAsync. 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 // scheduleFrameWrite tickles the frame writing scheduler. 3636 // 3637 // If a frame is already being written, nothing happens. This will be called again 3638 // when the frame is done being written. 3639 // 3640 // If a frame isn't being written we need to send one, the best frame 3641 // to send is selected, preferring first things that aren't 3642 // stream-specific (e.g. ACKing settings), and then finding the 3643 // highest priority stream. 3644 // 3645 // If a frame isn't being written and there's nothing else to send, we 3646 // flush the write buffer. 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 // processFrameFromReader processes the serve loop's read from readFrameCh from the 3713 // frame-reading goroutine. 3714 // processFrameFromReader returns whether the connection should be kept open. 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 // endStream closes a Request.Body's pipe. It is called when a DATA 3989 // frame says a request body is over (or after trailers). 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 // copyTrailersToHandlerRequest is run in the Handler's goroutine in 4005 // its Request.Body.Read just before it gets io.EOF. 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 // nil if not scheme https 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 // Setup Trailers 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 // Run on its own goroutine. 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 // Same as net/http: 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 // 10.5.1 Limits on Header Block Size: 4320 // .. "A server that receives a larger header block than it is 4321 // willing to handle can send an HTTP 431 (Request Header Fields Too 4322 // Large) status code" 4323 const statusRequestHeaderFieldsTooLarge = 431 // only in Go 1.6+ 4324 w.WriteHeader(statusRequestHeaderFieldsTooLarge) 4325 io.WriteString(w, "<h1>HTTP Error 431</h1><p>Request Header Field(s) Too Large</p>") 4326 } 4327 4328 // called from handler goroutines. 4329 // h may be nil. 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 // called from handler goroutines. 4359 func (sc *http2serverConn) write100ContinueHeaders(st *http2stream) { 4360 sc.writeFrameFromHandler(http2frameWriteMsg{ 4361 write: http2write100ContinueHeadersFrame{st.id}, 4362 stream: st, 4363 }) 4364 } 4365 4366 // A bodyReadMsg tells the server loop that the http.Handler read n 4367 // bytes of the DATA from the client on the given stream. 4368 type http2bodyReadMsg struct { 4369 st *http2stream 4370 n int 4371 } 4372 4373 // called from handler goroutines. 4374 // Notes that the handler for the given stream ID read n bytes of its body 4375 // and schedules flow control tokens to be sent. 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 // st may be nil for conn-level 4394 func (sc *http2serverConn) sendWindowUpdate(st *http2stream, n int) { 4395 sc.serveG.check() 4396 // "The legal range for the increment to the flow control 4397 // window is 1 to 2^31-1 (2,147,483,647) octets." 4398 // A Go Read call on 64-bit machines could in theory read 4399 // a larger Read than this. Very unlikely, but we handle it here 4400 // rather than elsewhere for now. 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 // st may be nil for conn-level 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 // non-nil if we have a HTTP entity message body 4442 needsContinue bool // need to send a 100-continue 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 // responseWriter is the http.ResponseWriter implementation. It's 4469 // intentionally small (1 pointer wide) to minimize garbage. The 4470 // responseWriterState pointer inside is zeroed at the end of a 4471 // request (in handlerDone) and calls on the responseWriter thereafter 4472 // simply crash (caller's mistake), but the much larger responseWriterState 4473 // and buffers are reused between multiple requests. 4474 type http2responseWriter struct { 4475 rws *http2responseWriterState 4476 } 4477 4478 // Optional http.ResponseWriter interfaces implemented. 4479 var ( 4480 _ CloseNotifier = (*http2responseWriter)(nil) 4481 _ Flusher = (*http2responseWriter)(nil) 4482 _ http2stringWriter = (*http2responseWriter)(nil) 4483 ) 4484 4485 type http2responseWriterState struct { 4486 // immutable within a request: 4487 stream *http2stream 4488 req *Request 4489 body *http2requestBody // to close at end of request, if DATA frames didn't 4490 conn *http2serverConn 4491 4492 // TODO: adjust buffer writing sizes based on server config, frame size updates from peer, etc 4493 bw *bufio.Writer // writing to a chunkWriter{this *responseWriterState} 4494 4495 // mutated by http.Handler goroutine: 4496 handlerHeader Header // nil until called 4497 snapHeader Header // snapshot of handlerHeader at WriteHeader time 4498 trailers []string // set in writeChunk 4499 status int // status code passed to WriteHeader 4500 wroteHeader bool // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet. 4501 sentHeader bool // have we sent the header frame? 4502 handlerDone bool // handler has finished 4503 4504 sentContentLen int64 // non-zero if handler set a Content-Length header 4505 wroteBytes int64 4506 4507 closeNotifierMu sync.Mutex // guards closeNotifierCh 4508 closeNotifierCh chan bool // nil until first used 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 // declareTrailer is called for each Trailer header when the 4518 // response header is written. It notes that a header will need to be 4519 // written in the trailers at the end of the response. 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 // writeChunk writes chunks from the bufio.Writer. But because 4533 // bufio.Writer may bypass its chunking, sometimes p may be 4534 // arbitrarily large. 4535 // 4536 // writeChunk is also responsible (on the first chunk) for sending the 4537 // HEADER response. 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 // TrailerPrefix is a magic prefix for ResponseWriter.Header map keys 4622 // that, if present, signals that the map entry is actually for 4623 // the response trailers, and not the response headers. The prefix 4624 // is stripped after the ServeHTTP call finishes and the values are 4625 // sent in the trailers. 4626 // 4627 // This mechanism is intended only for trailers that are not known 4628 // prior to the headers being written. If the set of trailers is fixed 4629 // or known before the header is written, the normal Go trailers mechanism 4630 // is preferred: 4631 // https://golang.org/pkg/net/http/#ResponseWriter 4632 // https://golang.org/pkg/net/http/#example_ResponseWriter_trailers 4633 const http2TrailerPrefix = "Trailer:" 4634 4635 // promoteUndeclaredTrailers permits http.Handlers to set trailers 4636 // after the header has already been flushed. Because the Go 4637 // ResponseWriter interface has no way to set Trailers (only the 4638 // Header), and because we didn't want to expand the ResponseWriter 4639 // interface, and because nobody used trailers, and because RFC 2616 4640 // says you SHOULD (but not must) predeclare any trailers in the 4641 // header, the official ResponseWriter rules said trailers in Go must 4642 // be predeclared, and then we reuse the same ResponseWriter.Header() 4643 // map to mean both Headers and Trailers. When it's time to write the 4644 // Trailers, we pick out the fields of Headers that were declared as 4645 // trailers. That worked for a while, until we found the first major 4646 // user of Trailers in the wild: gRPC (using them only over http2), 4647 // and gRPC libraries permit setting trailers mid-stream without 4648 // predeclarnig them. So: change of plans. We still permit the old 4649 // way, but we also permit this hack: if a Header() key begins with 4650 // "Trailer:", the suffix of that key is a Trailer. Because ':' is an 4651 // invalid token byte anyway, there is no ambiguity. (And it's already 4652 // filtered out) It's mildly hacky, but not terrible. 4653 // 4654 // This method runs after the Handler is done and promotes any Header 4655 // fields to be trailers. 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 // The Life Of A Write is like this: 4748 // 4749 // * Handler calls w.Write or w.WriteString -> 4750 // * -> rws.bw (*bufio.Writer) -> 4751 // * (Handler migth call Flush) 4752 // * -> chunkWriter{rws} 4753 // * -> responseWriterState.writeChunk(p []byte) 4754 // * -> responseWriterState.writeChunk (most of the magic; see comment there) 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 // either dataB or dataS is non-zero. 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 // foreachHeaderElement splits v according to the "#rule" construction 4797 // in RFC 2616 section 2.1 and calls fn for each non-empty element. 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 // From http://httpwg.org/specs/rfc7540.html#rfc.section.8.1.2.2 4815 var http2connHeaders = []string{ 4816 "Connection", 4817 "Keep-Alive", 4818 "Proxy-Connection", 4819 "Transfer-Encoding", 4820 "Upgrade", 4821 } 4822 4823 // checkValidHTTP2Request checks whether req is a valid HTTP/2 request, 4824 // per RFC 7540 Section 8.1.2.2. 4825 // The returned error is reported to users. 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 // ValidTrailerHeader reports whether name is a valid header field name to appear 4846 // in trailers. 4847 // See: http://tools.ietf.org/html/rfc7230#section-4.1.2 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 // transportDefaultConnFlow is how many connection-level flow control 4882 // tokens we give the server at start-up, past the default 64k. 4883 http2transportDefaultConnFlow = 1 << 30 4884 4885 // transportDefaultStreamFlow is how many stream-level flow 4886 // control tokens we announce to the peer, and how many bytes 4887 // we buffer per stream. 4888 http2transportDefaultStreamFlow = 4 << 20 4889 4890 // transportDefaultStreamMinRefresh is the minimum number of bytes we'll send 4891 // a stream-level WINDOW_UPDATE for at a time. 4892 http2transportDefaultStreamMinRefresh = 4 << 10 4893 4894 http2defaultUserAgent = "Go-http-client/2.0" 4895 ) 4896 4897 // Transport is an HTTP/2 Transport. 4898 // 4899 // A Transport internally caches connections to servers. It is safe 4900 // for concurrent use by multiple goroutines. 4901 type http2Transport struct { 4902 // DialTLS specifies an optional dial function for creating 4903 // TLS connections for requests. 4904 // 4905 // If DialTLS is nil, tls.Dial is used. 4906 // 4907 // If the returned net.Conn has a ConnectionState method like tls.Conn, 4908 // it will be used to set http.Response.TLS. 4909 DialTLS func(network, addr string, cfg *tls.Config) (net.Conn, error) 4910 4911 // TLSClientConfig specifies the TLS configuration to use with 4912 // tls.Client. If nil, the default configuration is used. 4913 TLSClientConfig *tls.Config 4914 4915 // ConnPool optionally specifies an alternate connection pool to use. 4916 // If nil, the default is used. 4917 ConnPool http2ClientConnPool 4918 4919 // DisableCompression, if true, prevents the Transport from 4920 // requesting compression with an "Accept-Encoding: gzip" 4921 // request header when the Request contains no existing 4922 // Accept-Encoding value. If the Transport requests gzip on 4923 // its own and gets a gzipped response, it's transparently 4924 // decoded in the Response.Body. However, if the user 4925 // explicitly requested gzip it is not automatically 4926 // uncompressed. 4927 DisableCompression bool 4928 4929 // AllowHTTP, if true, permits HTTP/2 requests using the insecure, 4930 // plain-text "http" scheme. Note that this does not enable h2c support. 4931 AllowHTTP bool 4932 4933 // MaxHeaderListSize is the http2 SETTINGS_MAX_HEADER_LIST_SIZE to 4934 // send in the initial settings frame. It is how many bytes 4935 // of response headers are allow. Unlike the http2 spec, zero here 4936 // means to use a default limit (currently 10MB). If you actually 4937 // want to advertise an ulimited value to the peer, Transport 4938 // interprets the highest possible value here (0xffffffff or 1<<32-1) 4939 // to mean no limit. 4940 MaxHeaderListSize uint32 4941 4942 // t1, if non-nil, is the standard library Transport using 4943 // this transport. Its settings are used (but not its 4944 // RoundTrip method, etc). 4945 t1 *Transport 4946 4947 connPoolOnce sync.Once 4948 connPoolOrDef http2ClientConnPool // non-nil version of ConnPool 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 // ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2. 4968 // It requires Go 1.6 or later and returns an error if the net/http package is too old 4969 // or if t1 has already been HTTP/2-enabled. 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 // ClientConn is the state of a single HTTP/2 client connection to an 4989 // HTTP/2 server. 4990 type http2ClientConn struct { 4991 t *http2Transport 4992 tconn net.Conn // usually *tls.Conn, except specialized impls 4993 tlsState *tls.ConnectionState // nil only for specialized impls 4994 singleUse bool // whether being used for a single http.Request 4995 4996 // readLoop goroutine fields: 4997 readerDone chan struct{} // closed on error 4998 readerErr error // set before readerDone is closed 4999 5000 mu sync.Mutex // guards following 5001 cond *sync.Cond // hold mu; broadcast on flow/closed changes 5002 flow http2flow // our conn-level flow control quota (cs.flow is per stream) 5003 inflow http2flow // peer's conn-level flow control 5004 closed bool 5005 wantSettingsAck bool // we sent a SETTINGS frame and haven't heard back 5006 goAway *http2GoAwayFrame // if non-nil, the GoAwayFrame we received 5007 goAwayDebug string // goAway frame's debug data, retained as a string 5008 streams map[uint32]*http2clientStream // client-initiated 5009 nextStreamID uint32 5010 bw *bufio.Writer 5011 br *bufio.Reader 5012 fr *http2Framer 5013 lastActive time.Time 5014 // Settings from peer: (also guarded by mu) 5015 maxFrameSize uint32 5016 maxConcurrentStreams uint32 5017 initialWindowSize uint32 5018 5019 hbuf bytes.Buffer // HPACK encoder writes into this 5020 henc *hpack.Encoder 5021 freeBuf [][]byte 5022 5023 wmu sync.Mutex // held while writing; acquire AFTER mu if holding both 5024 werr error // first write error that has occurred 5025 } 5026 5027 // clientStream is the state for a single HTTP/2 stream. One of these 5028 // is created for each Transport.RoundTrip call. 5029 type http2clientStream struct { 5030 cc *http2ClientConn 5031 req *Request 5032 trace *http2clientTrace // or nil 5033 ID uint32 5034 resc chan http2resAndError 5035 bufPipe http2pipe // buffered pipe with the flow-controlled response payload 5036 requestedGzip bool 5037 on100 func() // optional code to run if get a 100 continue response 5038 5039 flow http2flow // guarded by cc.mu 5040 inflow http2flow // guarded by cc.mu 5041 bytesRemain int64 // -1 means unknown; owned by transportResponseBody.Read 5042 readErr error // sticky read error; owned by transportResponseBody.Read 5043 stopReqBody error // if non-nil, stop writing req body; guarded by cc.mu 5044 5045 peerReset chan struct{} // closed on peer reset 5046 resetErr error // populated before peerReset is closed 5047 5048 done chan struct{} // closed when stream remove from cc.streams map; close calls guarded by cc.mu 5049 5050 // owned by clientConnReadLoop: 5051 firstByte bool // got the first response byte 5052 pastHeaders bool // got first MetaHeadersFrame (actual headers) 5053 pastTrailers bool // got optional second MetaHeadersFrame (trailers) 5054 5055 trailer Header // accumulated trailers 5056 resTrailer *Header // client's Response.Trailer 5057 } 5058 5059 // awaitRequestCancel runs in its own goroutine and waits for the user 5060 // to cancel a RoundTrip request, its context to expire, or for the 5061 // request to be done (any way it might be removed from the cc.streams 5062 // map: peer reset, successful completion, TCP connection breakage, 5063 // etc) 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 // checkResetOrDone reports any error sent in a RST_STREAM frame by the 5081 // server, or errStreamClosed if the stream is complete. 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 // RoundTripOpt are options for the Transport.RoundTripOpt method. 5121 type http2RoundTripOpt struct { 5122 // OnlyCachedConn controls whether RoundTripOpt may 5123 // create a new TCP connection. If set true and 5124 // no cached connection is available, RoundTripOpt 5125 // will return ErrNoCachedConn. 5126 OnlyCachedConn bool 5127 } 5128 5129 func (t *http2Transport) RoundTrip(req *Request) (*Response, error) { 5130 return t.RoundTripOpt(req, http2RoundTripOpt{}) 5131 } 5132 5133 // authorityAddr returns a given authority (a host/IP, or host:port / ip:port) 5134 // and returns a host:port. The port 443 is added if needed. 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 // RoundTripOpt is like RoundTrip, but takes options. 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 // CloseIdleConnections closes any connections which were previously 5173 // connected from previous requests but are now sitting idle. 5174 // It does not interrupt any connections currently in use. 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 // disableKeepAlives reports whether connections should be closed as 5248 // soon as possible after handling the first request. 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 // frameBuffer returns a scratch buffer suitable for writing DATA frames. 5368 // They're capped at the min of the peer's max frame size or 512KB 5369 // (kinda arbitrarily), but definitely capped so we don't allocate 4GB 5370 // bufers. 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 // arbitrary; 4 concurrent requests per conn? investigate. 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 // errRequestCanceled is a copy of net/http's errRequestCanceled because it's not 5406 // exported. At least they'll be DeepEqual for h1-vs-h2 comparisons tests. 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 // checkConnHeaders checks whether req has any invalid connection-level headers. 5436 // per RFC 7540 section 8.1.2.2: Connection-Specific Header Fields. 5437 // Certain headers are special-cased as okay but not transmitted later. 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 // actualContentLength returns a sanitized version of 5452 // req.ContentLength, where 0 actually means zero (not unknown) and -1 5453 // means unknown. 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 // TODO(bradfitz): this is a copy of the logic in net/http. Unify somewhere? 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 // requires cc.wmu be held 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 // internal error values; they don't escape to callers 5642 var ( 5643 // abort request body write; don't send cancel 5644 http2errStopReqBodyWrite = errors.New("http2: aborting request body write") 5645 5646 // abort request body write, but send stream reset of cancel. 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 // awaitFlowControl waits for [1, min(maxBytes, cc.cs.maxFrameSize)] flow 5734 // control tokens from the server. 5735 // It returns either the non-zero number of tokens taken or an error 5736 // if the stream is dead. 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 // requires cc.mu be held. 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 // shouldSendReqContentLength reports whether the http2.Transport should send 5842 // a "content-length" request header. This logic is basically a copy of the net/http 5843 // transferWriter.shouldSendContentLength. 5844 // The contentLength is the corrected contentLength (so 0 means actually 0, not unknown). 5845 // -1 means unknown. 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 // requires cc.mu be held. 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 // requires cc.mu be held. 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 // clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop. 5923 type http2clientConnReadLoop struct { 5924 cc *http2ClientConn 5925 activeRes map[uint32]*http2clientStream // keyed by streamID 5926 closeWhenIdle bool 5927 } 5928 5929 // readLoop runs in its own goroutine and reads and dispatches frames. 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 // GoAwayError is returned by the Transport when the server closes the 5946 // TCP connection after sending a GOAWAY frame. 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 // may return error types nil, or ConnectionError. Any other error value 6112 // is a StreamError of type ErrCodeProtocol. The returned error in that case 6113 // is the detail. 6114 // 6115 // As a special case, handleResponse may return (nil, nil) to skip the 6116 // frame (currently only used for 100 expect continue). This special 6117 // case is going away after Issue 13851 is fixed. 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 // transportResponseBody is the concrete type of Transport.RoundTrip's 6228 // Response.Body. It is an io.ReadCloser. On Read, it reads from cs.body. 6229 // On Close it sends RST_STREAM if EOF wasn't already seen. 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 // gzipReader wraps a response body so it can lazily 6593 // call gzip.NewReader on the first call to Read 6594 type http2gzipReader struct { 6595 body io.ReadCloser // underlying Response.Body 6596 zr *gzip.Reader // lazily-initialized gzip reader 6597 zerr error // sticky 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 // bodyWriterState encapsulates various state around the Transport's writing 6623 // of the request body, particularly regarding doing delayed writes of the body 6624 // when the request contains "Expect: 100-continue". 6625 type http2bodyWriterState struct { 6626 cs *http2clientStream 6627 timer *time.Timer // if non-nil, we're doing a delayed write 6628 fnonce *sync.Once // to call fn with 6629 fn func() // the code to run in the goroutine, writing the body 6630 resc chan error // result of fn's execution 6631 delay time.Duration // how long we should delay a delayed write for 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 // Arm the timer with a very large duration, which we'll 6654 // intentionally lower later. It has to be large now because 6655 // we need a handle to it before writing the headers, but the 6656 // s.delay value is defined to not start until after the 6657 // request headers were written. 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 // scheduleBodyWrite starts writing the body, either immediately (in 6681 // the common case) or after the delay timeout. It should not be 6682 // called until after the headers have been written. 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 // isConnectionCloseRequest reports whether req should use its own 6696 // connection for a single request and then close the connection. 6697 func http2isConnectionCloseRequest(req *Request) bool { 6698 return req.Close || httplex.HeaderValuesContainsToken(req.Header["Connection"], "close") 6699 } 6700 6701 // writeFramer is implemented by any type that is used to write frames. 6702 type http2writeFramer interface { 6703 writeFrame(http2writeContext) error 6704 } 6705 6706 // writeContext is the interface needed by the various frame writer 6707 // types below. All the writeFrame methods below are scheduled via the 6708 // frame writing scheduler (see writeScheduler in writesched.go). 6709 // 6710 // This interface is implemented by *serverConn. 6711 // 6712 // TODO: decide whether to a) use this in the client code (which didn't 6713 // end up using this yet, because it has a simpler design, not 6714 // currently implementing priorities), or b) delete this and 6715 // make the server code a bit more concrete. 6716 type http2writeContext interface { 6717 Framer() *http2Framer 6718 Flush() error 6719 CloseConn() error 6720 // HeaderEncoder returns an HPACK encoder that writes to the 6721 // returned buffer. 6722 HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) 6723 } 6724 6725 // endsStream reports whether the given frame writer w will locally 6726 // close the stream. 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 // handlerPanicRST is the message sent from handler goroutines when 6782 // the handler panics. 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 // writeResHeaders is a request to write a HEADERS and 0+ CONTINUATION frames 6808 // for HTTP response headers or trailers from a server handler. 6809 type http2writeResHeaders struct { 6810 streamID uint32 6811 httpResCode int // 0 means no ":status" line 6812 h Header // may be nil 6813 trailers []string // if non-nil, which keys of h to write. nil means all. 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 // For now we're lazy and just pick the minimum MAX_FRAME_SIZE 6854 // that all peers must support (16KB). Later we could care 6855 // more and send larger frames if the peer advertised it, but 6856 // there's little point. Most headers are small anyway (so we 6857 // generally won't have CONTINUATION frames), and extra frames 6858 // only waste 9 bytes anyway. 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 // or 0 for conn-level 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 // frameWriteMsg is a request to write a frame. 6943 type http2frameWriteMsg struct { 6944 // write is the interface value that does the writing, once the 6945 // writeScheduler (below) has decided to select this frame 6946 // to write. The write functions are all defined in write.go. 6947 write http2writeFramer 6948 6949 stream *http2stream // used for prioritization. nil for non-stream frames. 6950 6951 // done, if non-nil, must be a buffered channel with space for 6952 // 1 message and is sent the return value from write (or an 6953 // earlier error) when the frame has been written. 6954 done chan error 6955 } 6956 6957 // for debugging only: 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 // writeScheduler tracks pending frames to write, priorities, and decides 6973 // the next one to use. It is not thread-safe. 6974 type http2writeScheduler struct { 6975 // zero are frames not associated with a specific stream. 6976 // They're sent before any stream-specific freams. 6977 zero http2writeQueue 6978 6979 // maxFrameSize is the maximum size of a DATA frame 6980 // we'll write. Must be non-zero and between 16K-16M. 6981 maxFrameSize uint32 6982 6983 // sq contains the stream-specific queues, keyed by stream ID. 6984 // when a stream is idle, it's deleted from the map. 6985 sq map[uint32]*http2writeQueue 6986 6987 // canSend is a slice of memory that's reused between frame 6988 // scheduling decisions to hold the list of writeQueues (from sq) 6989 // which have enough flow control data to send. After canSend is 6990 // built, the best is selected. 6991 canSend []*http2writeQueue 6992 6993 // pool of empty queues for reuse. 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 // take returns the most important frame to write and removes it from the scheduler. 7038 // It is illegal to call this if the scheduler is empty or if there are no connection-level 7039 // flow control bytes available. 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 // zeroCanSend is defered from take. 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 // streamWritableBytes returns the number of DATA bytes we could write 7085 // from the given queue's stream, if this stream/queue were 7086 // selected. It is an error to call this if q's head isn't a 7087 // *writeData. 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 // streamID returns the stream ID for a non-empty stream-specific queue. 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 // head returns the next item that would be removed by shift. 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 }