github.com/sbinet/go@v0.0.0-20160827155028-54d7de7dd62b/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 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  func http2bodyAndLength(req *Request) (body io.Reader, contentLen int64) {
  5452  	body = req.Body
  5453  	if body == nil {
  5454  		return nil, 0
  5455  	}
  5456  	if req.ContentLength != 0 {
  5457  		return req.Body, req.ContentLength
  5458  	}
  5459  
  5460  	// We have a body but a zero content length. Test to see if
  5461  	// it's actually zero or just unset.
  5462  	var buf [1]byte
  5463  	n, rerr := body.Read(buf[:])
  5464  	if rerr != nil && rerr != io.EOF {
  5465  		return http2errorReader{rerr}, -1
  5466  	}
  5467  	if n == 1 {
  5468  
  5469  		if rerr == io.EOF {
  5470  			return bytes.NewReader(buf[:]), 1
  5471  		}
  5472  		return io.MultiReader(bytes.NewReader(buf[:]), body), -1
  5473  	}
  5474  
  5475  	return nil, 0
  5476  }
  5477  
  5478  func (cc *http2ClientConn) RoundTrip(req *Request) (*Response, error) {
  5479  	if err := http2checkConnHeaders(req); err != nil {
  5480  		return nil, err
  5481  	}
  5482  
  5483  	trailers, err := http2commaSeparatedTrailers(req)
  5484  	if err != nil {
  5485  		return nil, err
  5486  	}
  5487  	hasTrailers := trailers != ""
  5488  
  5489  	body, contentLen := http2bodyAndLength(req)
  5490  	hasBody := body != nil
  5491  
  5492  	cc.mu.Lock()
  5493  	cc.lastActive = time.Now()
  5494  	if cc.closed || !cc.canTakeNewRequestLocked() {
  5495  		cc.mu.Unlock()
  5496  		return nil, http2errClientConnUnusable
  5497  	}
  5498  
  5499  	// TODO(bradfitz): this is a copy of the logic in net/http. Unify somewhere?
  5500  	var requestedGzip bool
  5501  	if !cc.t.disableCompression() &&
  5502  		req.Header.Get("Accept-Encoding") == "" &&
  5503  		req.Header.Get("Range") == "" &&
  5504  		req.Method != "HEAD" {
  5505  
  5506  		requestedGzip = true
  5507  	}
  5508  
  5509  	hdrs, err := cc.encodeHeaders(req, requestedGzip, trailers, contentLen)
  5510  	if err != nil {
  5511  		cc.mu.Unlock()
  5512  		return nil, err
  5513  	}
  5514  
  5515  	cs := cc.newStream()
  5516  	cs.req = req
  5517  	cs.trace = http2requestTrace(req)
  5518  	cs.requestedGzip = requestedGzip
  5519  	bodyWriter := cc.t.getBodyWriterState(cs, body)
  5520  	cs.on100 = bodyWriter.on100
  5521  
  5522  	cc.wmu.Lock()
  5523  	endStream := !hasBody && !hasTrailers
  5524  	werr := cc.writeHeaders(cs.ID, endStream, hdrs)
  5525  	cc.wmu.Unlock()
  5526  	http2traceWroteHeaders(cs.trace)
  5527  	cc.mu.Unlock()
  5528  
  5529  	if werr != nil {
  5530  		if hasBody {
  5531  			req.Body.Close()
  5532  			bodyWriter.cancel()
  5533  		}
  5534  		cc.forgetStreamID(cs.ID)
  5535  
  5536  		http2traceWroteRequest(cs.trace, werr)
  5537  		return nil, werr
  5538  	}
  5539  
  5540  	var respHeaderTimer <-chan time.Time
  5541  	if hasBody {
  5542  		bodyWriter.scheduleBodyWrite()
  5543  	} else {
  5544  		http2traceWroteRequest(cs.trace, nil)
  5545  		if d := cc.responseHeaderTimeout(); d != 0 {
  5546  			timer := time.NewTimer(d)
  5547  			defer timer.Stop()
  5548  			respHeaderTimer = timer.C
  5549  		}
  5550  	}
  5551  
  5552  	readLoopResCh := cs.resc
  5553  	bodyWritten := false
  5554  	ctx := http2reqContext(req)
  5555  
  5556  	handleReadLoopResponse := func(re http2resAndError) (*Response, error) {
  5557  		res := re.res
  5558  		if re.err != nil || res.StatusCode > 299 {
  5559  
  5560  			bodyWriter.cancel()
  5561  			cs.abortRequestBodyWrite(http2errStopReqBodyWrite)
  5562  		}
  5563  		if re.err != nil {
  5564  			cc.forgetStreamID(cs.ID)
  5565  			return nil, re.err
  5566  		}
  5567  		res.Request = req
  5568  		res.TLS = cc.tlsState
  5569  		return res, nil
  5570  	}
  5571  
  5572  	for {
  5573  		select {
  5574  		case re := <-readLoopResCh:
  5575  			return handleReadLoopResponse(re)
  5576  		case <-respHeaderTimer:
  5577  			cc.forgetStreamID(cs.ID)
  5578  			if !hasBody || bodyWritten {
  5579  				cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
  5580  			} else {
  5581  				bodyWriter.cancel()
  5582  				cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
  5583  			}
  5584  			return nil, http2errTimeout
  5585  		case <-ctx.Done():
  5586  			cc.forgetStreamID(cs.ID)
  5587  			if !hasBody || bodyWritten {
  5588  				cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
  5589  			} else {
  5590  				bodyWriter.cancel()
  5591  				cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
  5592  			}
  5593  			return nil, ctx.Err()
  5594  		case <-req.Cancel:
  5595  			cc.forgetStreamID(cs.ID)
  5596  			if !hasBody || bodyWritten {
  5597  				cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
  5598  			} else {
  5599  				bodyWriter.cancel()
  5600  				cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
  5601  			}
  5602  			return nil, http2errRequestCanceled
  5603  		case <-cs.peerReset:
  5604  
  5605  			return nil, cs.resetErr
  5606  		case err := <-bodyWriter.resc:
  5607  
  5608  			select {
  5609  			case re := <-readLoopResCh:
  5610  				return handleReadLoopResponse(re)
  5611  			default:
  5612  			}
  5613  			if err != nil {
  5614  				return nil, err
  5615  			}
  5616  			bodyWritten = true
  5617  			if d := cc.responseHeaderTimeout(); d != 0 {
  5618  				timer := time.NewTimer(d)
  5619  				defer timer.Stop()
  5620  				respHeaderTimer = timer.C
  5621  			}
  5622  		}
  5623  	}
  5624  }
  5625  
  5626  // requires cc.wmu be held
  5627  func (cc *http2ClientConn) writeHeaders(streamID uint32, endStream bool, hdrs []byte) error {
  5628  	first := true
  5629  	frameSize := int(cc.maxFrameSize)
  5630  	for len(hdrs) > 0 && cc.werr == nil {
  5631  		chunk := hdrs
  5632  		if len(chunk) > frameSize {
  5633  			chunk = chunk[:frameSize]
  5634  		}
  5635  		hdrs = hdrs[len(chunk):]
  5636  		endHeaders := len(hdrs) == 0
  5637  		if first {
  5638  			cc.fr.WriteHeaders(http2HeadersFrameParam{
  5639  				StreamID:      streamID,
  5640  				BlockFragment: chunk,
  5641  				EndStream:     endStream,
  5642  				EndHeaders:    endHeaders,
  5643  			})
  5644  			first = false
  5645  		} else {
  5646  			cc.fr.WriteContinuation(streamID, endHeaders, chunk)
  5647  		}
  5648  	}
  5649  
  5650  	cc.bw.Flush()
  5651  	return cc.werr
  5652  }
  5653  
  5654  // internal error values; they don't escape to callers
  5655  var (
  5656  	// abort request body write; don't send cancel
  5657  	http2errStopReqBodyWrite = errors.New("http2: aborting request body write")
  5658  
  5659  	// abort request body write, but send stream reset of cancel.
  5660  	http2errStopReqBodyWriteAndCancel = errors.New("http2: canceling request")
  5661  )
  5662  
  5663  func (cs *http2clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (err error) {
  5664  	cc := cs.cc
  5665  	sentEnd := false
  5666  	buf := cc.frameScratchBuffer()
  5667  	defer cc.putFrameScratchBuffer(buf)
  5668  
  5669  	defer func() {
  5670  		http2traceWroteRequest(cs.trace, err)
  5671  
  5672  		cerr := bodyCloser.Close()
  5673  		if err == nil {
  5674  			err = cerr
  5675  		}
  5676  	}()
  5677  
  5678  	req := cs.req
  5679  	hasTrailers := req.Trailer != nil
  5680  
  5681  	var sawEOF bool
  5682  	for !sawEOF {
  5683  		n, err := body.Read(buf)
  5684  		if err == io.EOF {
  5685  			sawEOF = true
  5686  			err = nil
  5687  		} else if err != nil {
  5688  			return err
  5689  		}
  5690  
  5691  		remain := buf[:n]
  5692  		for len(remain) > 0 && err == nil {
  5693  			var allowed int32
  5694  			allowed, err = cs.awaitFlowControl(len(remain))
  5695  			switch {
  5696  			case err == http2errStopReqBodyWrite:
  5697  				return err
  5698  			case err == http2errStopReqBodyWriteAndCancel:
  5699  				cc.writeStreamReset(cs.ID, http2ErrCodeCancel, nil)
  5700  				return err
  5701  			case err != nil:
  5702  				return err
  5703  			}
  5704  			cc.wmu.Lock()
  5705  			data := remain[:allowed]
  5706  			remain = remain[allowed:]
  5707  			sentEnd = sawEOF && len(remain) == 0 && !hasTrailers
  5708  			err = cc.fr.WriteData(cs.ID, sentEnd, data)
  5709  			if err == nil {
  5710  
  5711  				err = cc.bw.Flush()
  5712  			}
  5713  			cc.wmu.Unlock()
  5714  		}
  5715  		if err != nil {
  5716  			return err
  5717  		}
  5718  	}
  5719  
  5720  	if sentEnd {
  5721  
  5722  		return nil
  5723  	}
  5724  
  5725  	var trls []byte
  5726  	if hasTrailers {
  5727  		cc.mu.Lock()
  5728  		defer cc.mu.Unlock()
  5729  		trls = cc.encodeTrailers(req)
  5730  	}
  5731  
  5732  	cc.wmu.Lock()
  5733  	defer cc.wmu.Unlock()
  5734  
  5735  	if len(trls) > 0 {
  5736  		err = cc.writeHeaders(cs.ID, true, trls)
  5737  	} else {
  5738  		err = cc.fr.WriteData(cs.ID, true, nil)
  5739  	}
  5740  	if ferr := cc.bw.Flush(); ferr != nil && err == nil {
  5741  		err = ferr
  5742  	}
  5743  	return err
  5744  }
  5745  
  5746  // awaitFlowControl waits for [1, min(maxBytes, cc.cs.maxFrameSize)] flow
  5747  // control tokens from the server.
  5748  // It returns either the non-zero number of tokens taken or an error
  5749  // if the stream is dead.
  5750  func (cs *http2clientStream) awaitFlowControl(maxBytes int) (taken int32, err error) {
  5751  	cc := cs.cc
  5752  	cc.mu.Lock()
  5753  	defer cc.mu.Unlock()
  5754  	for {
  5755  		if cc.closed {
  5756  			return 0, http2errClientConnClosed
  5757  		}
  5758  		if cs.stopReqBody != nil {
  5759  			return 0, cs.stopReqBody
  5760  		}
  5761  		if err := cs.checkResetOrDone(); err != nil {
  5762  			return 0, err
  5763  		}
  5764  		if a := cs.flow.available(); a > 0 {
  5765  			take := a
  5766  			if int(take) > maxBytes {
  5767  
  5768  				take = int32(maxBytes)
  5769  			}
  5770  			if take > int32(cc.maxFrameSize) {
  5771  				take = int32(cc.maxFrameSize)
  5772  			}
  5773  			cs.flow.take(take)
  5774  			return take, nil
  5775  		}
  5776  		cc.cond.Wait()
  5777  	}
  5778  }
  5779  
  5780  type http2badStringError struct {
  5781  	what string
  5782  	str  string
  5783  }
  5784  
  5785  func (e *http2badStringError) Error() string { return fmt.Sprintf("%s %q", e.what, e.str) }
  5786  
  5787  // requires cc.mu be held.
  5788  func (cc *http2ClientConn) encodeHeaders(req *Request, addGzipHeader bool, trailers string, contentLength int64) ([]byte, error) {
  5789  	cc.hbuf.Reset()
  5790  
  5791  	host := req.Host
  5792  	if host == "" {
  5793  		host = req.URL.Host
  5794  	}
  5795  
  5796  	for k, vv := range req.Header {
  5797  		if !httplex.ValidHeaderFieldName(k) {
  5798  			return nil, fmt.Errorf("invalid HTTP header name %q", k)
  5799  		}
  5800  		for _, v := range vv {
  5801  			if !httplex.ValidHeaderFieldValue(v) {
  5802  				return nil, fmt.Errorf("invalid HTTP header value %q for header %q", v, k)
  5803  			}
  5804  		}
  5805  	}
  5806  
  5807  	cc.writeHeader(":authority", host)
  5808  	cc.writeHeader(":method", req.Method)
  5809  	if req.Method != "CONNECT" {
  5810  		cc.writeHeader(":path", req.URL.RequestURI())
  5811  		cc.writeHeader(":scheme", "https")
  5812  	}
  5813  	if trailers != "" {
  5814  		cc.writeHeader("trailer", trailers)
  5815  	}
  5816  
  5817  	var didUA bool
  5818  	for k, vv := range req.Header {
  5819  		lowKey := strings.ToLower(k)
  5820  		switch lowKey {
  5821  		case "host", "content-length":
  5822  
  5823  			continue
  5824  		case "connection", "proxy-connection", "transfer-encoding", "upgrade", "keep-alive":
  5825  
  5826  			continue
  5827  		case "user-agent":
  5828  
  5829  			didUA = true
  5830  			if len(vv) < 1 {
  5831  				continue
  5832  			}
  5833  			vv = vv[:1]
  5834  			if vv[0] == "" {
  5835  				continue
  5836  			}
  5837  		}
  5838  		for _, v := range vv {
  5839  			cc.writeHeader(lowKey, v)
  5840  		}
  5841  	}
  5842  	if http2shouldSendReqContentLength(req.Method, contentLength) {
  5843  		cc.writeHeader("content-length", strconv.FormatInt(contentLength, 10))
  5844  	}
  5845  	if addGzipHeader {
  5846  		cc.writeHeader("accept-encoding", "gzip")
  5847  	}
  5848  	if !didUA {
  5849  		cc.writeHeader("user-agent", http2defaultUserAgent)
  5850  	}
  5851  	return cc.hbuf.Bytes(), nil
  5852  }
  5853  
  5854  // shouldSendReqContentLength reports whether the http2.Transport should send
  5855  // a "content-length" request header. This logic is basically a copy of the net/http
  5856  // transferWriter.shouldSendContentLength.
  5857  // The contentLength is the corrected contentLength (so 0 means actually 0, not unknown).
  5858  // -1 means unknown.
  5859  func http2shouldSendReqContentLength(method string, contentLength int64) bool {
  5860  	if contentLength > 0 {
  5861  		return true
  5862  	}
  5863  	if contentLength < 0 {
  5864  		return false
  5865  	}
  5866  
  5867  	switch method {
  5868  	case "POST", "PUT", "PATCH":
  5869  		return true
  5870  	default:
  5871  		return false
  5872  	}
  5873  }
  5874  
  5875  // requires cc.mu be held.
  5876  func (cc *http2ClientConn) encodeTrailers(req *Request) []byte {
  5877  	cc.hbuf.Reset()
  5878  	for k, vv := range req.Trailer {
  5879  
  5880  		lowKey := strings.ToLower(k)
  5881  		for _, v := range vv {
  5882  			cc.writeHeader(lowKey, v)
  5883  		}
  5884  	}
  5885  	return cc.hbuf.Bytes()
  5886  }
  5887  
  5888  func (cc *http2ClientConn) writeHeader(name, value string) {
  5889  	if http2VerboseLogs {
  5890  		log.Printf("http2: Transport encoding header %q = %q", name, value)
  5891  	}
  5892  	cc.henc.WriteField(hpack.HeaderField{Name: name, Value: value})
  5893  }
  5894  
  5895  type http2resAndError struct {
  5896  	res *Response
  5897  	err error
  5898  }
  5899  
  5900  // requires cc.mu be held.
  5901  func (cc *http2ClientConn) newStream() *http2clientStream {
  5902  	cs := &http2clientStream{
  5903  		cc:        cc,
  5904  		ID:        cc.nextStreamID,
  5905  		resc:      make(chan http2resAndError, 1),
  5906  		peerReset: make(chan struct{}),
  5907  		done:      make(chan struct{}),
  5908  	}
  5909  	cs.flow.add(int32(cc.initialWindowSize))
  5910  	cs.flow.setConnFlow(&cc.flow)
  5911  	cs.inflow.add(http2transportDefaultStreamFlow)
  5912  	cs.inflow.setConnFlow(&cc.inflow)
  5913  	cc.nextStreamID += 2
  5914  	cc.streams[cs.ID] = cs
  5915  	return cs
  5916  }
  5917  
  5918  func (cc *http2ClientConn) forgetStreamID(id uint32) {
  5919  	cc.streamByID(id, true)
  5920  }
  5921  
  5922  func (cc *http2ClientConn) streamByID(id uint32, andRemove bool) *http2clientStream {
  5923  	cc.mu.Lock()
  5924  	defer cc.mu.Unlock()
  5925  	cs := cc.streams[id]
  5926  	if andRemove && cs != nil && !cc.closed {
  5927  		cc.lastActive = time.Now()
  5928  		delete(cc.streams, id)
  5929  		close(cs.done)
  5930  		cc.cond.Broadcast()
  5931  	}
  5932  	return cs
  5933  }
  5934  
  5935  // clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop.
  5936  type http2clientConnReadLoop struct {
  5937  	cc            *http2ClientConn
  5938  	activeRes     map[uint32]*http2clientStream // keyed by streamID
  5939  	closeWhenIdle bool
  5940  }
  5941  
  5942  // readLoop runs in its own goroutine and reads and dispatches frames.
  5943  func (cc *http2ClientConn) readLoop() {
  5944  	rl := &http2clientConnReadLoop{
  5945  		cc:        cc,
  5946  		activeRes: make(map[uint32]*http2clientStream),
  5947  	}
  5948  
  5949  	defer rl.cleanup()
  5950  	cc.readerErr = rl.run()
  5951  	if ce, ok := cc.readerErr.(http2ConnectionError); ok {
  5952  		cc.wmu.Lock()
  5953  		cc.fr.WriteGoAway(0, http2ErrCode(ce), nil)
  5954  		cc.wmu.Unlock()
  5955  	}
  5956  }
  5957  
  5958  // GoAwayError is returned by the Transport when the server closes the
  5959  // TCP connection after sending a GOAWAY frame.
  5960  type http2GoAwayError struct {
  5961  	LastStreamID uint32
  5962  	ErrCode      http2ErrCode
  5963  	DebugData    string
  5964  }
  5965  
  5966  func (e http2GoAwayError) Error() string {
  5967  	return fmt.Sprintf("http2: server sent GOAWAY and closed the connection; LastStreamID=%v, ErrCode=%v, debug=%q",
  5968  		e.LastStreamID, e.ErrCode, e.DebugData)
  5969  }
  5970  
  5971  func http2isEOFOrNetReadError(err error) bool {
  5972  	if err == io.EOF {
  5973  		return true
  5974  	}
  5975  	ne, ok := err.(*net.OpError)
  5976  	return ok && ne.Op == "read"
  5977  }
  5978  
  5979  func (rl *http2clientConnReadLoop) cleanup() {
  5980  	cc := rl.cc
  5981  	defer cc.tconn.Close()
  5982  	defer cc.t.connPool().MarkDead(cc)
  5983  	defer close(cc.readerDone)
  5984  
  5985  	err := cc.readerErr
  5986  	cc.mu.Lock()
  5987  	if cc.goAway != nil && http2isEOFOrNetReadError(err) {
  5988  		err = http2GoAwayError{
  5989  			LastStreamID: cc.goAway.LastStreamID,
  5990  			ErrCode:      cc.goAway.ErrCode,
  5991  			DebugData:    cc.goAwayDebug,
  5992  		}
  5993  	} else if err == io.EOF {
  5994  		err = io.ErrUnexpectedEOF
  5995  	}
  5996  	for _, cs := range rl.activeRes {
  5997  		cs.bufPipe.CloseWithError(err)
  5998  	}
  5999  	for _, cs := range cc.streams {
  6000  		select {
  6001  		case cs.resc <- http2resAndError{err: err}:
  6002  		default:
  6003  		}
  6004  		close(cs.done)
  6005  	}
  6006  	cc.closed = true
  6007  	cc.cond.Broadcast()
  6008  	cc.mu.Unlock()
  6009  }
  6010  
  6011  func (rl *http2clientConnReadLoop) run() error {
  6012  	cc := rl.cc
  6013  	rl.closeWhenIdle = cc.t.disableKeepAlives() || cc.singleUse
  6014  	gotReply := false
  6015  	gotSettings := false
  6016  	for {
  6017  		f, err := cc.fr.ReadFrame()
  6018  		if err != nil {
  6019  			cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err)
  6020  		}
  6021  		if se, ok := err.(http2StreamError); ok {
  6022  			if cs := cc.streamByID(se.StreamID, true); cs != nil {
  6023  				cs.cc.writeStreamReset(cs.ID, se.Code, err)
  6024  				if se.Cause == nil {
  6025  					se.Cause = cc.fr.errDetail
  6026  				}
  6027  				rl.endStreamError(cs, se)
  6028  			}
  6029  			continue
  6030  		} else if err != nil {
  6031  			return err
  6032  		}
  6033  		if http2VerboseLogs {
  6034  			cc.vlogf("http2: Transport received %s", http2summarizeFrame(f))
  6035  		}
  6036  		if !gotSettings {
  6037  			if _, ok := f.(*http2SettingsFrame); !ok {
  6038  				cc.logf("protocol error: received %T before a SETTINGS frame", f)
  6039  				return http2ConnectionError(http2ErrCodeProtocol)
  6040  			}
  6041  			gotSettings = true
  6042  		}
  6043  		maybeIdle := false
  6044  
  6045  		switch f := f.(type) {
  6046  		case *http2MetaHeadersFrame:
  6047  			err = rl.processHeaders(f)
  6048  			maybeIdle = true
  6049  			gotReply = true
  6050  		case *http2DataFrame:
  6051  			err = rl.processData(f)
  6052  			maybeIdle = true
  6053  		case *http2GoAwayFrame:
  6054  			err = rl.processGoAway(f)
  6055  			maybeIdle = true
  6056  		case *http2RSTStreamFrame:
  6057  			err = rl.processResetStream(f)
  6058  			maybeIdle = true
  6059  		case *http2SettingsFrame:
  6060  			err = rl.processSettings(f)
  6061  		case *http2PushPromiseFrame:
  6062  			err = rl.processPushPromise(f)
  6063  		case *http2WindowUpdateFrame:
  6064  			err = rl.processWindowUpdate(f)
  6065  		case *http2PingFrame:
  6066  			err = rl.processPing(f)
  6067  		default:
  6068  			cc.logf("Transport: unhandled response frame type %T", f)
  6069  		}
  6070  		if err != nil {
  6071  			if http2VerboseLogs {
  6072  				cc.vlogf("http2: Transport conn %p received error from processing frame %v: %v", cc, http2summarizeFrame(f), err)
  6073  			}
  6074  			return err
  6075  		}
  6076  		if rl.closeWhenIdle && gotReply && maybeIdle && len(rl.activeRes) == 0 {
  6077  			cc.closeIfIdle()
  6078  		}
  6079  	}
  6080  }
  6081  
  6082  func (rl *http2clientConnReadLoop) processHeaders(f *http2MetaHeadersFrame) error {
  6083  	cc := rl.cc
  6084  	cs := cc.streamByID(f.StreamID, f.StreamEnded())
  6085  	if cs == nil {
  6086  
  6087  		return nil
  6088  	}
  6089  	if !cs.firstByte {
  6090  		if cs.trace != nil {
  6091  
  6092  			http2traceFirstResponseByte(cs.trace)
  6093  		}
  6094  		cs.firstByte = true
  6095  	}
  6096  	if !cs.pastHeaders {
  6097  		cs.pastHeaders = true
  6098  	} else {
  6099  		return rl.processTrailers(cs, f)
  6100  	}
  6101  
  6102  	res, err := rl.handleResponse(cs, f)
  6103  	if err != nil {
  6104  		if _, ok := err.(http2ConnectionError); ok {
  6105  			return err
  6106  		}
  6107  
  6108  		cs.cc.writeStreamReset(f.StreamID, http2ErrCodeProtocol, err)
  6109  		cs.resc <- http2resAndError{err: err}
  6110  		return nil
  6111  	}
  6112  	if res == nil {
  6113  
  6114  		return nil
  6115  	}
  6116  	if res.Body != http2noBody {
  6117  		rl.activeRes[cs.ID] = cs
  6118  	}
  6119  	cs.resTrailer = &res.Trailer
  6120  	cs.resc <- http2resAndError{res: res}
  6121  	return nil
  6122  }
  6123  
  6124  // may return error types nil, or ConnectionError. Any other error value
  6125  // is a StreamError of type ErrCodeProtocol. The returned error in that case
  6126  // is the detail.
  6127  //
  6128  // As a special case, handleResponse may return (nil, nil) to skip the
  6129  // frame (currently only used for 100 expect continue). This special
  6130  // case is going away after Issue 13851 is fixed.
  6131  func (rl *http2clientConnReadLoop) handleResponse(cs *http2clientStream, f *http2MetaHeadersFrame) (*Response, error) {
  6132  	if f.Truncated {
  6133  		return nil, http2errResponseHeaderListSize
  6134  	}
  6135  
  6136  	status := f.PseudoValue("status")
  6137  	if status == "" {
  6138  		return nil, errors.New("missing status pseudo header")
  6139  	}
  6140  	statusCode, err := strconv.Atoi(status)
  6141  	if err != nil {
  6142  		return nil, errors.New("malformed non-numeric status pseudo header")
  6143  	}
  6144  
  6145  	if statusCode == 100 {
  6146  		http2traceGot100Continue(cs.trace)
  6147  		if cs.on100 != nil {
  6148  			cs.on100()
  6149  		}
  6150  		cs.pastHeaders = false
  6151  		return nil, nil
  6152  	}
  6153  
  6154  	header := make(Header)
  6155  	res := &Response{
  6156  		Proto:      "HTTP/2.0",
  6157  		ProtoMajor: 2,
  6158  		Header:     header,
  6159  		StatusCode: statusCode,
  6160  		Status:     status + " " + StatusText(statusCode),
  6161  	}
  6162  	for _, hf := range f.RegularFields() {
  6163  		key := CanonicalHeaderKey(hf.Name)
  6164  		if key == "Trailer" {
  6165  			t := res.Trailer
  6166  			if t == nil {
  6167  				t = make(Header)
  6168  				res.Trailer = t
  6169  			}
  6170  			http2foreachHeaderElement(hf.Value, func(v string) {
  6171  				t[CanonicalHeaderKey(v)] = nil
  6172  			})
  6173  		} else {
  6174  			header[key] = append(header[key], hf.Value)
  6175  		}
  6176  	}
  6177  
  6178  	streamEnded := f.StreamEnded()
  6179  	isHead := cs.req.Method == "HEAD"
  6180  	if !streamEnded || isHead {
  6181  		res.ContentLength = -1
  6182  		if clens := res.Header["Content-Length"]; len(clens) == 1 {
  6183  			if clen64, err := strconv.ParseInt(clens[0], 10, 64); err == nil {
  6184  				res.ContentLength = clen64
  6185  			} else {
  6186  
  6187  			}
  6188  		} else if len(clens) > 1 {
  6189  
  6190  		}
  6191  	}
  6192  
  6193  	if streamEnded || isHead {
  6194  		res.Body = http2noBody
  6195  		return res, nil
  6196  	}
  6197  
  6198  	buf := new(bytes.Buffer)
  6199  	cs.bufPipe = http2pipe{b: buf}
  6200  	cs.bytesRemain = res.ContentLength
  6201  	res.Body = http2transportResponseBody{cs}
  6202  	go cs.awaitRequestCancel(cs.req)
  6203  
  6204  	if cs.requestedGzip && res.Header.Get("Content-Encoding") == "gzip" {
  6205  		res.Header.Del("Content-Encoding")
  6206  		res.Header.Del("Content-Length")
  6207  		res.ContentLength = -1
  6208  		res.Body = &http2gzipReader{body: res.Body}
  6209  		http2setResponseUncompressed(res)
  6210  	}
  6211  	return res, nil
  6212  }
  6213  
  6214  func (rl *http2clientConnReadLoop) processTrailers(cs *http2clientStream, f *http2MetaHeadersFrame) error {
  6215  	if cs.pastTrailers {
  6216  
  6217  		return http2ConnectionError(http2ErrCodeProtocol)
  6218  	}
  6219  	cs.pastTrailers = true
  6220  	if !f.StreamEnded() {
  6221  
  6222  		return http2ConnectionError(http2ErrCodeProtocol)
  6223  	}
  6224  	if len(f.PseudoFields()) > 0 {
  6225  
  6226  		return http2ConnectionError(http2ErrCodeProtocol)
  6227  	}
  6228  
  6229  	trailer := make(Header)
  6230  	for _, hf := range f.RegularFields() {
  6231  		key := CanonicalHeaderKey(hf.Name)
  6232  		trailer[key] = append(trailer[key], hf.Value)
  6233  	}
  6234  	cs.trailer = trailer
  6235  
  6236  	rl.endStream(cs)
  6237  	return nil
  6238  }
  6239  
  6240  // transportResponseBody is the concrete type of Transport.RoundTrip's
  6241  // Response.Body. It is an io.ReadCloser. On Read, it reads from cs.body.
  6242  // On Close it sends RST_STREAM if EOF wasn't already seen.
  6243  type http2transportResponseBody struct {
  6244  	cs *http2clientStream
  6245  }
  6246  
  6247  func (b http2transportResponseBody) Read(p []byte) (n int, err error) {
  6248  	cs := b.cs
  6249  	cc := cs.cc
  6250  
  6251  	if cs.readErr != nil {
  6252  		return 0, cs.readErr
  6253  	}
  6254  	n, err = b.cs.bufPipe.Read(p)
  6255  	if cs.bytesRemain != -1 {
  6256  		if int64(n) > cs.bytesRemain {
  6257  			n = int(cs.bytesRemain)
  6258  			if err == nil {
  6259  				err = errors.New("net/http: server replied with more than declared Content-Length; truncated")
  6260  				cc.writeStreamReset(cs.ID, http2ErrCodeProtocol, err)
  6261  			}
  6262  			cs.readErr = err
  6263  			return int(cs.bytesRemain), err
  6264  		}
  6265  		cs.bytesRemain -= int64(n)
  6266  		if err == io.EOF && cs.bytesRemain > 0 {
  6267  			err = io.ErrUnexpectedEOF
  6268  			cs.readErr = err
  6269  			return n, err
  6270  		}
  6271  	}
  6272  	if n == 0 {
  6273  
  6274  		return
  6275  	}
  6276  
  6277  	cc.mu.Lock()
  6278  	defer cc.mu.Unlock()
  6279  
  6280  	var connAdd, streamAdd int32
  6281  
  6282  	if v := cc.inflow.available(); v < http2transportDefaultConnFlow/2 {
  6283  		connAdd = http2transportDefaultConnFlow - v
  6284  		cc.inflow.add(connAdd)
  6285  	}
  6286  	if err == nil {
  6287  
  6288  		v := int(cs.inflow.available()) + cs.bufPipe.Len()
  6289  		if v < http2transportDefaultStreamFlow-http2transportDefaultStreamMinRefresh {
  6290  			streamAdd = int32(http2transportDefaultStreamFlow - v)
  6291  			cs.inflow.add(streamAdd)
  6292  		}
  6293  	}
  6294  	if connAdd != 0 || streamAdd != 0 {
  6295  		cc.wmu.Lock()
  6296  		defer cc.wmu.Unlock()
  6297  		if connAdd != 0 {
  6298  			cc.fr.WriteWindowUpdate(0, http2mustUint31(connAdd))
  6299  		}
  6300  		if streamAdd != 0 {
  6301  			cc.fr.WriteWindowUpdate(cs.ID, http2mustUint31(streamAdd))
  6302  		}
  6303  		cc.bw.Flush()
  6304  	}
  6305  	return
  6306  }
  6307  
  6308  var http2errClosedResponseBody = errors.New("http2: response body closed")
  6309  
  6310  func (b http2transportResponseBody) Close() error {
  6311  	cs := b.cs
  6312  	cc := cs.cc
  6313  
  6314  	serverSentStreamEnd := cs.bufPipe.Err() == io.EOF
  6315  	unread := cs.bufPipe.Len()
  6316  
  6317  	if unread > 0 || !serverSentStreamEnd {
  6318  		cc.mu.Lock()
  6319  		cc.wmu.Lock()
  6320  		if !serverSentStreamEnd {
  6321  			cc.fr.WriteRSTStream(cs.ID, http2ErrCodeCancel)
  6322  		}
  6323  
  6324  		if unread > 0 {
  6325  			cc.inflow.add(int32(unread))
  6326  			cc.fr.WriteWindowUpdate(0, uint32(unread))
  6327  		}
  6328  		cc.bw.Flush()
  6329  		cc.wmu.Unlock()
  6330  		cc.mu.Unlock()
  6331  	}
  6332  
  6333  	cs.bufPipe.BreakWithError(http2errClosedResponseBody)
  6334  	return nil
  6335  }
  6336  
  6337  func (rl *http2clientConnReadLoop) processData(f *http2DataFrame) error {
  6338  	cc := rl.cc
  6339  	cs := cc.streamByID(f.StreamID, f.StreamEnded())
  6340  	data := f.Data()
  6341  	if cs == nil {
  6342  		cc.mu.Lock()
  6343  		neverSent := cc.nextStreamID
  6344  		cc.mu.Unlock()
  6345  		if f.StreamID >= neverSent {
  6346  
  6347  			cc.logf("http2: Transport received unsolicited DATA frame; closing connection")
  6348  			return http2ConnectionError(http2ErrCodeProtocol)
  6349  		}
  6350  
  6351  		if f.Length > 0 {
  6352  			cc.mu.Lock()
  6353  			cc.inflow.add(int32(f.Length))
  6354  			cc.mu.Unlock()
  6355  
  6356  			cc.wmu.Lock()
  6357  			cc.fr.WriteWindowUpdate(0, uint32(f.Length))
  6358  			cc.bw.Flush()
  6359  			cc.wmu.Unlock()
  6360  		}
  6361  		return nil
  6362  	}
  6363  	if f.Length > 0 {
  6364  		if len(data) > 0 && cs.bufPipe.b == nil {
  6365  
  6366  			cc.logf("http2: Transport received DATA frame for closed stream; closing connection")
  6367  			return http2ConnectionError(http2ErrCodeProtocol)
  6368  		}
  6369  
  6370  		cc.mu.Lock()
  6371  		if cs.inflow.available() >= int32(f.Length) {
  6372  			cs.inflow.take(int32(f.Length))
  6373  		} else {
  6374  			cc.mu.Unlock()
  6375  			return http2ConnectionError(http2ErrCodeFlowControl)
  6376  		}
  6377  
  6378  		if pad := int32(f.Length) - int32(len(data)); pad > 0 {
  6379  			cs.inflow.add(pad)
  6380  			cc.inflow.add(pad)
  6381  			cc.wmu.Lock()
  6382  			cc.fr.WriteWindowUpdate(0, uint32(pad))
  6383  			cc.fr.WriteWindowUpdate(cs.ID, uint32(pad))
  6384  			cc.bw.Flush()
  6385  			cc.wmu.Unlock()
  6386  		}
  6387  		cc.mu.Unlock()
  6388  
  6389  		if len(data) > 0 {
  6390  			if _, err := cs.bufPipe.Write(data); err != nil {
  6391  				rl.endStreamError(cs, err)
  6392  				return err
  6393  			}
  6394  		}
  6395  	}
  6396  
  6397  	if f.StreamEnded() {
  6398  		rl.endStream(cs)
  6399  	}
  6400  	return nil
  6401  }
  6402  
  6403  var http2errInvalidTrailers = errors.New("http2: invalid trailers")
  6404  
  6405  func (rl *http2clientConnReadLoop) endStream(cs *http2clientStream) {
  6406  
  6407  	rl.endStreamError(cs, nil)
  6408  }
  6409  
  6410  func (rl *http2clientConnReadLoop) endStreamError(cs *http2clientStream, err error) {
  6411  	var code func()
  6412  	if err == nil {
  6413  		err = io.EOF
  6414  		code = cs.copyTrailers
  6415  	}
  6416  	cs.bufPipe.closeWithErrorAndCode(err, code)
  6417  	delete(rl.activeRes, cs.ID)
  6418  	if http2isConnectionCloseRequest(cs.req) {
  6419  		rl.closeWhenIdle = true
  6420  	}
  6421  
  6422  	select {
  6423  	case cs.resc <- http2resAndError{err: err}:
  6424  	default:
  6425  	}
  6426  }
  6427  
  6428  func (cs *http2clientStream) copyTrailers() {
  6429  	for k, vv := range cs.trailer {
  6430  		t := cs.resTrailer
  6431  		if *t == nil {
  6432  			*t = make(Header)
  6433  		}
  6434  		(*t)[k] = vv
  6435  	}
  6436  }
  6437  
  6438  func (rl *http2clientConnReadLoop) processGoAway(f *http2GoAwayFrame) error {
  6439  	cc := rl.cc
  6440  	cc.t.connPool().MarkDead(cc)
  6441  	if f.ErrCode != 0 {
  6442  
  6443  		cc.vlogf("transport got GOAWAY with error code = %v", f.ErrCode)
  6444  	}
  6445  	cc.setGoAway(f)
  6446  	return nil
  6447  }
  6448  
  6449  func (rl *http2clientConnReadLoop) processSettings(f *http2SettingsFrame) error {
  6450  	cc := rl.cc
  6451  	cc.mu.Lock()
  6452  	defer cc.mu.Unlock()
  6453  
  6454  	if f.IsAck() {
  6455  		if cc.wantSettingsAck {
  6456  			cc.wantSettingsAck = false
  6457  			return nil
  6458  		}
  6459  		return http2ConnectionError(http2ErrCodeProtocol)
  6460  	}
  6461  
  6462  	err := f.ForeachSetting(func(s http2Setting) error {
  6463  		switch s.ID {
  6464  		case http2SettingMaxFrameSize:
  6465  			cc.maxFrameSize = s.Val
  6466  		case http2SettingMaxConcurrentStreams:
  6467  			cc.maxConcurrentStreams = s.Val
  6468  		case http2SettingInitialWindowSize:
  6469  
  6470  			if s.Val > math.MaxInt32 {
  6471  				return http2ConnectionError(http2ErrCodeFlowControl)
  6472  			}
  6473  
  6474  			delta := int32(s.Val) - int32(cc.initialWindowSize)
  6475  			for _, cs := range cc.streams {
  6476  				cs.flow.add(delta)
  6477  			}
  6478  			cc.cond.Broadcast()
  6479  
  6480  			cc.initialWindowSize = s.Val
  6481  		default:
  6482  
  6483  			cc.vlogf("Unhandled Setting: %v", s)
  6484  		}
  6485  		return nil
  6486  	})
  6487  	if err != nil {
  6488  		return err
  6489  	}
  6490  
  6491  	cc.wmu.Lock()
  6492  	defer cc.wmu.Unlock()
  6493  
  6494  	cc.fr.WriteSettingsAck()
  6495  	cc.bw.Flush()
  6496  	return cc.werr
  6497  }
  6498  
  6499  func (rl *http2clientConnReadLoop) processWindowUpdate(f *http2WindowUpdateFrame) error {
  6500  	cc := rl.cc
  6501  	cs := cc.streamByID(f.StreamID, false)
  6502  	if f.StreamID != 0 && cs == nil {
  6503  		return nil
  6504  	}
  6505  
  6506  	cc.mu.Lock()
  6507  	defer cc.mu.Unlock()
  6508  
  6509  	fl := &cc.flow
  6510  	if cs != nil {
  6511  		fl = &cs.flow
  6512  	}
  6513  	if !fl.add(int32(f.Increment)) {
  6514  		return http2ConnectionError(http2ErrCodeFlowControl)
  6515  	}
  6516  	cc.cond.Broadcast()
  6517  	return nil
  6518  }
  6519  
  6520  func (rl *http2clientConnReadLoop) processResetStream(f *http2RSTStreamFrame) error {
  6521  	cs := rl.cc.streamByID(f.StreamID, true)
  6522  	if cs == nil {
  6523  
  6524  		return nil
  6525  	}
  6526  	select {
  6527  	case <-cs.peerReset:
  6528  
  6529  	default:
  6530  		err := http2streamError(cs.ID, f.ErrCode)
  6531  		cs.resetErr = err
  6532  		close(cs.peerReset)
  6533  		cs.bufPipe.CloseWithError(err)
  6534  		cs.cc.cond.Broadcast()
  6535  	}
  6536  	delete(rl.activeRes, cs.ID)
  6537  	return nil
  6538  }
  6539  
  6540  func (rl *http2clientConnReadLoop) processPing(f *http2PingFrame) error {
  6541  	if f.IsAck() {
  6542  
  6543  		return nil
  6544  	}
  6545  	cc := rl.cc
  6546  	cc.wmu.Lock()
  6547  	defer cc.wmu.Unlock()
  6548  	if err := cc.fr.WritePing(true, f.Data); err != nil {
  6549  		return err
  6550  	}
  6551  	return cc.bw.Flush()
  6552  }
  6553  
  6554  func (rl *http2clientConnReadLoop) processPushPromise(f *http2PushPromiseFrame) error {
  6555  
  6556  	return http2ConnectionError(http2ErrCodeProtocol)
  6557  }
  6558  
  6559  func (cc *http2ClientConn) writeStreamReset(streamID uint32, code http2ErrCode, err error) {
  6560  
  6561  	cc.wmu.Lock()
  6562  	cc.fr.WriteRSTStream(streamID, code)
  6563  	cc.bw.Flush()
  6564  	cc.wmu.Unlock()
  6565  }
  6566  
  6567  var (
  6568  	http2errResponseHeaderListSize = errors.New("http2: response header list larger than advertised limit")
  6569  	http2errPseudoTrailers         = errors.New("http2: invalid pseudo header in trailers")
  6570  )
  6571  
  6572  func (cc *http2ClientConn) logf(format string, args ...interface{}) {
  6573  	cc.t.logf(format, args...)
  6574  }
  6575  
  6576  func (cc *http2ClientConn) vlogf(format string, args ...interface{}) {
  6577  	cc.t.vlogf(format, args...)
  6578  }
  6579  
  6580  func (t *http2Transport) vlogf(format string, args ...interface{}) {
  6581  	if http2VerboseLogs {
  6582  		t.logf(format, args...)
  6583  	}
  6584  }
  6585  
  6586  func (t *http2Transport) logf(format string, args ...interface{}) {
  6587  	log.Printf(format, args...)
  6588  }
  6589  
  6590  var http2noBody io.ReadCloser = ioutil.NopCloser(bytes.NewReader(nil))
  6591  
  6592  func http2strSliceContains(ss []string, s string) bool {
  6593  	for _, v := range ss {
  6594  		if v == s {
  6595  			return true
  6596  		}
  6597  	}
  6598  	return false
  6599  }
  6600  
  6601  type http2erringRoundTripper struct{ err error }
  6602  
  6603  func (rt http2erringRoundTripper) RoundTrip(*Request) (*Response, error) { return nil, rt.err }
  6604  
  6605  // gzipReader wraps a response body so it can lazily
  6606  // call gzip.NewReader on the first call to Read
  6607  type http2gzipReader struct {
  6608  	body io.ReadCloser // underlying Response.Body
  6609  	zr   *gzip.Reader  // lazily-initialized gzip reader
  6610  	zerr error         // sticky error
  6611  }
  6612  
  6613  func (gz *http2gzipReader) Read(p []byte) (n int, err error) {
  6614  	if gz.zerr != nil {
  6615  		return 0, gz.zerr
  6616  	}
  6617  	if gz.zr == nil {
  6618  		gz.zr, err = gzip.NewReader(gz.body)
  6619  		if err != nil {
  6620  			gz.zerr = err
  6621  			return 0, err
  6622  		}
  6623  	}
  6624  	return gz.zr.Read(p)
  6625  }
  6626  
  6627  func (gz *http2gzipReader) Close() error {
  6628  	return gz.body.Close()
  6629  }
  6630  
  6631  type http2errorReader struct{ err error }
  6632  
  6633  func (r http2errorReader) Read(p []byte) (int, error) { return 0, r.err }
  6634  
  6635  // bodyWriterState encapsulates various state around the Transport's writing
  6636  // of the request body, particularly regarding doing delayed writes of the body
  6637  // when the request contains "Expect: 100-continue".
  6638  type http2bodyWriterState struct {
  6639  	cs     *http2clientStream
  6640  	timer  *time.Timer   // if non-nil, we're doing a delayed write
  6641  	fnonce *sync.Once    // to call fn with
  6642  	fn     func()        // the code to run in the goroutine, writing the body
  6643  	resc   chan error    // result of fn's execution
  6644  	delay  time.Duration // how long we should delay a delayed write for
  6645  }
  6646  
  6647  func (t *http2Transport) getBodyWriterState(cs *http2clientStream, body io.Reader) (s http2bodyWriterState) {
  6648  	s.cs = cs
  6649  	if body == nil {
  6650  		return
  6651  	}
  6652  	resc := make(chan error, 1)
  6653  	s.resc = resc
  6654  	s.fn = func() {
  6655  		resc <- cs.writeRequestBody(body, cs.req.Body)
  6656  	}
  6657  	s.delay = t.expectContinueTimeout()
  6658  	if s.delay == 0 ||
  6659  		!httplex.HeaderValuesContainsToken(
  6660  			cs.req.Header["Expect"],
  6661  			"100-continue") {
  6662  		return
  6663  	}
  6664  	s.fnonce = new(sync.Once)
  6665  
  6666  	// Arm the timer with a very large duration, which we'll
  6667  	// intentionally lower later. It has to be large now because
  6668  	// we need a handle to it before writing the headers, but the
  6669  	// s.delay value is defined to not start until after the
  6670  	// request headers were written.
  6671  	const hugeDuration = 365 * 24 * time.Hour
  6672  	s.timer = time.AfterFunc(hugeDuration, func() {
  6673  		s.fnonce.Do(s.fn)
  6674  	})
  6675  	return
  6676  }
  6677  
  6678  func (s http2bodyWriterState) cancel() {
  6679  	if s.timer != nil {
  6680  		s.timer.Stop()
  6681  	}
  6682  }
  6683  
  6684  func (s http2bodyWriterState) on100() {
  6685  	if s.timer == nil {
  6686  
  6687  		return
  6688  	}
  6689  	s.timer.Stop()
  6690  	go func() { s.fnonce.Do(s.fn) }()
  6691  }
  6692  
  6693  // scheduleBodyWrite starts writing the body, either immediately (in
  6694  // the common case) or after the delay timeout. It should not be
  6695  // called until after the headers have been written.
  6696  func (s http2bodyWriterState) scheduleBodyWrite() {
  6697  	if s.timer == nil {
  6698  
  6699  		go s.fn()
  6700  		return
  6701  	}
  6702  	http2traceWait100Continue(s.cs.trace)
  6703  	if s.timer.Stop() {
  6704  		s.timer.Reset(s.delay)
  6705  	}
  6706  }
  6707  
  6708  // isConnectionCloseRequest reports whether req should use its own
  6709  // connection for a single request and then close the connection.
  6710  func http2isConnectionCloseRequest(req *Request) bool {
  6711  	return req.Close || httplex.HeaderValuesContainsToken(req.Header["Connection"], "close")
  6712  }
  6713  
  6714  // writeFramer is implemented by any type that is used to write frames.
  6715  type http2writeFramer interface {
  6716  	writeFrame(http2writeContext) error
  6717  }
  6718  
  6719  // writeContext is the interface needed by the various frame writer
  6720  // types below. All the writeFrame methods below are scheduled via the
  6721  // frame writing scheduler (see writeScheduler in writesched.go).
  6722  //
  6723  // This interface is implemented by *serverConn.
  6724  //
  6725  // TODO: decide whether to a) use this in the client code (which didn't
  6726  // end up using this yet, because it has a simpler design, not
  6727  // currently implementing priorities), or b) delete this and
  6728  // make the server code a bit more concrete.
  6729  type http2writeContext interface {
  6730  	Framer() *http2Framer
  6731  	Flush() error
  6732  	CloseConn() error
  6733  	// HeaderEncoder returns an HPACK encoder that writes to the
  6734  	// returned buffer.
  6735  	HeaderEncoder() (*hpack.Encoder, *bytes.Buffer)
  6736  }
  6737  
  6738  // endsStream reports whether the given frame writer w will locally
  6739  // close the stream.
  6740  func http2endsStream(w http2writeFramer) bool {
  6741  	switch v := w.(type) {
  6742  	case *http2writeData:
  6743  		return v.endStream
  6744  	case *http2writeResHeaders:
  6745  		return v.endStream
  6746  	case nil:
  6747  
  6748  		panic("endsStream called on nil writeFramer")
  6749  	}
  6750  	return false
  6751  }
  6752  
  6753  type http2flushFrameWriter struct{}
  6754  
  6755  func (http2flushFrameWriter) writeFrame(ctx http2writeContext) error {
  6756  	return ctx.Flush()
  6757  }
  6758  
  6759  type http2writeSettings []http2Setting
  6760  
  6761  func (s http2writeSettings) writeFrame(ctx http2writeContext) error {
  6762  	return ctx.Framer().WriteSettings([]http2Setting(s)...)
  6763  }
  6764  
  6765  type http2writeGoAway struct {
  6766  	maxStreamID uint32
  6767  	code        http2ErrCode
  6768  }
  6769  
  6770  func (p *http2writeGoAway) writeFrame(ctx http2writeContext) error {
  6771  	err := ctx.Framer().WriteGoAway(p.maxStreamID, p.code, nil)
  6772  	if p.code != 0 {
  6773  		ctx.Flush()
  6774  		time.Sleep(50 * time.Millisecond)
  6775  		ctx.CloseConn()
  6776  	}
  6777  	return err
  6778  }
  6779  
  6780  type http2writeData struct {
  6781  	streamID  uint32
  6782  	p         []byte
  6783  	endStream bool
  6784  }
  6785  
  6786  func (w *http2writeData) String() string {
  6787  	return fmt.Sprintf("writeData(stream=%d, p=%d, endStream=%v)", w.streamID, len(w.p), w.endStream)
  6788  }
  6789  
  6790  func (w *http2writeData) writeFrame(ctx http2writeContext) error {
  6791  	return ctx.Framer().WriteData(w.streamID, w.endStream, w.p)
  6792  }
  6793  
  6794  // handlerPanicRST is the message sent from handler goroutines when
  6795  // the handler panics.
  6796  type http2handlerPanicRST struct {
  6797  	StreamID uint32
  6798  }
  6799  
  6800  func (hp http2handlerPanicRST) writeFrame(ctx http2writeContext) error {
  6801  	return ctx.Framer().WriteRSTStream(hp.StreamID, http2ErrCodeInternal)
  6802  }
  6803  
  6804  func (se http2StreamError) writeFrame(ctx http2writeContext) error {
  6805  	return ctx.Framer().WriteRSTStream(se.StreamID, se.Code)
  6806  }
  6807  
  6808  type http2writePingAck struct{ pf *http2PingFrame }
  6809  
  6810  func (w http2writePingAck) writeFrame(ctx http2writeContext) error {
  6811  	return ctx.Framer().WritePing(true, w.pf.Data)
  6812  }
  6813  
  6814  type http2writeSettingsAck struct{}
  6815  
  6816  func (http2writeSettingsAck) writeFrame(ctx http2writeContext) error {
  6817  	return ctx.Framer().WriteSettingsAck()
  6818  }
  6819  
  6820  // writeResHeaders is a request to write a HEADERS and 0+ CONTINUATION frames
  6821  // for HTTP response headers or trailers from a server handler.
  6822  type http2writeResHeaders struct {
  6823  	streamID    uint32
  6824  	httpResCode int      // 0 means no ":status" line
  6825  	h           Header   // may be nil
  6826  	trailers    []string // if non-nil, which keys of h to write. nil means all.
  6827  	endStream   bool
  6828  
  6829  	date          string
  6830  	contentType   string
  6831  	contentLength string
  6832  }
  6833  
  6834  func http2encKV(enc *hpack.Encoder, k, v string) {
  6835  	if http2VerboseLogs {
  6836  		log.Printf("http2: server encoding header %q = %q", k, v)
  6837  	}
  6838  	enc.WriteField(hpack.HeaderField{Name: k, Value: v})
  6839  }
  6840  
  6841  func (w *http2writeResHeaders) writeFrame(ctx http2writeContext) error {
  6842  	enc, buf := ctx.HeaderEncoder()
  6843  	buf.Reset()
  6844  
  6845  	if w.httpResCode != 0 {
  6846  		http2encKV(enc, ":status", http2httpCodeString(w.httpResCode))
  6847  	}
  6848  
  6849  	http2encodeHeaders(enc, w.h, w.trailers)
  6850  
  6851  	if w.contentType != "" {
  6852  		http2encKV(enc, "content-type", w.contentType)
  6853  	}
  6854  	if w.contentLength != "" {
  6855  		http2encKV(enc, "content-length", w.contentLength)
  6856  	}
  6857  	if w.date != "" {
  6858  		http2encKV(enc, "date", w.date)
  6859  	}
  6860  
  6861  	headerBlock := buf.Bytes()
  6862  	if len(headerBlock) == 0 && w.trailers == nil {
  6863  		panic("unexpected empty hpack")
  6864  	}
  6865  
  6866  	// For now we're lazy and just pick the minimum MAX_FRAME_SIZE
  6867  	// that all peers must support (16KB). Later we could care
  6868  	// more and send larger frames if the peer advertised it, but
  6869  	// there's little point. Most headers are small anyway (so we
  6870  	// generally won't have CONTINUATION frames), and extra frames
  6871  	// only waste 9 bytes anyway.
  6872  	const maxFrameSize = 16384
  6873  
  6874  	first := true
  6875  	for len(headerBlock) > 0 {
  6876  		frag := headerBlock
  6877  		if len(frag) > maxFrameSize {
  6878  			frag = frag[:maxFrameSize]
  6879  		}
  6880  		headerBlock = headerBlock[len(frag):]
  6881  		endHeaders := len(headerBlock) == 0
  6882  		var err error
  6883  		if first {
  6884  			first = false
  6885  			err = ctx.Framer().WriteHeaders(http2HeadersFrameParam{
  6886  				StreamID:      w.streamID,
  6887  				BlockFragment: frag,
  6888  				EndStream:     w.endStream,
  6889  				EndHeaders:    endHeaders,
  6890  			})
  6891  		} else {
  6892  			err = ctx.Framer().WriteContinuation(w.streamID, endHeaders, frag)
  6893  		}
  6894  		if err != nil {
  6895  			return err
  6896  		}
  6897  	}
  6898  	return nil
  6899  }
  6900  
  6901  type http2write100ContinueHeadersFrame struct {
  6902  	streamID uint32
  6903  }
  6904  
  6905  func (w http2write100ContinueHeadersFrame) writeFrame(ctx http2writeContext) error {
  6906  	enc, buf := ctx.HeaderEncoder()
  6907  	buf.Reset()
  6908  	http2encKV(enc, ":status", "100")
  6909  	return ctx.Framer().WriteHeaders(http2HeadersFrameParam{
  6910  		StreamID:      w.streamID,
  6911  		BlockFragment: buf.Bytes(),
  6912  		EndStream:     false,
  6913  		EndHeaders:    true,
  6914  	})
  6915  }
  6916  
  6917  type http2writeWindowUpdate struct {
  6918  	streamID uint32 // or 0 for conn-level
  6919  	n        uint32
  6920  }
  6921  
  6922  func (wu http2writeWindowUpdate) writeFrame(ctx http2writeContext) error {
  6923  	return ctx.Framer().WriteWindowUpdate(wu.streamID, wu.n)
  6924  }
  6925  
  6926  func http2encodeHeaders(enc *hpack.Encoder, h Header, keys []string) {
  6927  	if keys == nil {
  6928  		sorter := http2sorterPool.Get().(*http2sorter)
  6929  
  6930  		defer http2sorterPool.Put(sorter)
  6931  		keys = sorter.Keys(h)
  6932  	}
  6933  	for _, k := range keys {
  6934  		vv := h[k]
  6935  		k = http2lowerHeader(k)
  6936  		if !http2validWireHeaderFieldName(k) {
  6937  
  6938  			continue
  6939  		}
  6940  		isTE := k == "transfer-encoding"
  6941  		for _, v := range vv {
  6942  			if !httplex.ValidHeaderFieldValue(v) {
  6943  
  6944  				continue
  6945  			}
  6946  
  6947  			if isTE && v != "trailers" {
  6948  				continue
  6949  			}
  6950  			http2encKV(enc, k, v)
  6951  		}
  6952  	}
  6953  }
  6954  
  6955  // frameWriteMsg is a request to write a frame.
  6956  type http2frameWriteMsg struct {
  6957  	// write is the interface value that does the writing, once the
  6958  	// writeScheduler (below) has decided to select this frame
  6959  	// to write. The write functions are all defined in write.go.
  6960  	write http2writeFramer
  6961  
  6962  	stream *http2stream // used for prioritization. nil for non-stream frames.
  6963  
  6964  	// done, if non-nil, must be a buffered channel with space for
  6965  	// 1 message and is sent the return value from write (or an
  6966  	// earlier error) when the frame has been written.
  6967  	done chan error
  6968  }
  6969  
  6970  // for debugging only:
  6971  func (wm http2frameWriteMsg) String() string {
  6972  	var streamID uint32
  6973  	if wm.stream != nil {
  6974  		streamID = wm.stream.id
  6975  	}
  6976  	var des string
  6977  	if s, ok := wm.write.(fmt.Stringer); ok {
  6978  		des = s.String()
  6979  	} else {
  6980  		des = fmt.Sprintf("%T", wm.write)
  6981  	}
  6982  	return fmt.Sprintf("[frameWriteMsg stream=%d, ch=%v, type: %v]", streamID, wm.done != nil, des)
  6983  }
  6984  
  6985  // writeScheduler tracks pending frames to write, priorities, and decides
  6986  // the next one to use. It is not thread-safe.
  6987  type http2writeScheduler struct {
  6988  	// zero are frames not associated with a specific stream.
  6989  	// They're sent before any stream-specific freams.
  6990  	zero http2writeQueue
  6991  
  6992  	// maxFrameSize is the maximum size of a DATA frame
  6993  	// we'll write. Must be non-zero and between 16K-16M.
  6994  	maxFrameSize uint32
  6995  
  6996  	// sq contains the stream-specific queues, keyed by stream ID.
  6997  	// when a stream is idle, it's deleted from the map.
  6998  	sq map[uint32]*http2writeQueue
  6999  
  7000  	// canSend is a slice of memory that's reused between frame
  7001  	// scheduling decisions to hold the list of writeQueues (from sq)
  7002  	// which have enough flow control data to send. After canSend is
  7003  	// built, the best is selected.
  7004  	canSend []*http2writeQueue
  7005  
  7006  	// pool of empty queues for reuse.
  7007  	queuePool []*http2writeQueue
  7008  }
  7009  
  7010  func (ws *http2writeScheduler) putEmptyQueue(q *http2writeQueue) {
  7011  	if len(q.s) != 0 {
  7012  		panic("queue must be empty")
  7013  	}
  7014  	ws.queuePool = append(ws.queuePool, q)
  7015  }
  7016  
  7017  func (ws *http2writeScheduler) getEmptyQueue() *http2writeQueue {
  7018  	ln := len(ws.queuePool)
  7019  	if ln == 0 {
  7020  		return new(http2writeQueue)
  7021  	}
  7022  	q := ws.queuePool[ln-1]
  7023  	ws.queuePool = ws.queuePool[:ln-1]
  7024  	return q
  7025  }
  7026  
  7027  func (ws *http2writeScheduler) empty() bool { return ws.zero.empty() && len(ws.sq) == 0 }
  7028  
  7029  func (ws *http2writeScheduler) add(wm http2frameWriteMsg) {
  7030  	st := wm.stream
  7031  	if st == nil {
  7032  		ws.zero.push(wm)
  7033  	} else {
  7034  		ws.streamQueue(st.id).push(wm)
  7035  	}
  7036  }
  7037  
  7038  func (ws *http2writeScheduler) streamQueue(streamID uint32) *http2writeQueue {
  7039  	if q, ok := ws.sq[streamID]; ok {
  7040  		return q
  7041  	}
  7042  	if ws.sq == nil {
  7043  		ws.sq = make(map[uint32]*http2writeQueue)
  7044  	}
  7045  	q := ws.getEmptyQueue()
  7046  	ws.sq[streamID] = q
  7047  	return q
  7048  }
  7049  
  7050  // take returns the most important frame to write and removes it from the scheduler.
  7051  // It is illegal to call this if the scheduler is empty or if there are no connection-level
  7052  // flow control bytes available.
  7053  func (ws *http2writeScheduler) take() (wm http2frameWriteMsg, ok bool) {
  7054  	if ws.maxFrameSize == 0 {
  7055  		panic("internal error: ws.maxFrameSize not initialized or invalid")
  7056  	}
  7057  
  7058  	if !ws.zero.empty() {
  7059  		return ws.zero.shift(), true
  7060  	}
  7061  	if len(ws.sq) == 0 {
  7062  		return
  7063  	}
  7064  
  7065  	for id, q := range ws.sq {
  7066  		if q.firstIsNoCost() {
  7067  			return ws.takeFrom(id, q)
  7068  		}
  7069  	}
  7070  
  7071  	if len(ws.canSend) != 0 {
  7072  		panic("should be empty")
  7073  	}
  7074  	for _, q := range ws.sq {
  7075  		if n := ws.streamWritableBytes(q); n > 0 {
  7076  			ws.canSend = append(ws.canSend, q)
  7077  		}
  7078  	}
  7079  	if len(ws.canSend) == 0 {
  7080  		return
  7081  	}
  7082  	defer ws.zeroCanSend()
  7083  
  7084  	q := ws.canSend[0]
  7085  
  7086  	return ws.takeFrom(q.streamID(), q)
  7087  }
  7088  
  7089  // zeroCanSend is defered from take.
  7090  func (ws *http2writeScheduler) zeroCanSend() {
  7091  	for i := range ws.canSend {
  7092  		ws.canSend[i] = nil
  7093  	}
  7094  	ws.canSend = ws.canSend[:0]
  7095  }
  7096  
  7097  // streamWritableBytes returns the number of DATA bytes we could write
  7098  // from the given queue's stream, if this stream/queue were
  7099  // selected. It is an error to call this if q's head isn't a
  7100  // *writeData.
  7101  func (ws *http2writeScheduler) streamWritableBytes(q *http2writeQueue) int32 {
  7102  	wm := q.head()
  7103  	ret := wm.stream.flow.available()
  7104  	if ret == 0 {
  7105  		return 0
  7106  	}
  7107  	if int32(ws.maxFrameSize) < ret {
  7108  		ret = int32(ws.maxFrameSize)
  7109  	}
  7110  	if ret == 0 {
  7111  		panic("internal error: ws.maxFrameSize not initialized or invalid")
  7112  	}
  7113  	wd := wm.write.(*http2writeData)
  7114  	if len(wd.p) < int(ret) {
  7115  		ret = int32(len(wd.p))
  7116  	}
  7117  	return ret
  7118  }
  7119  
  7120  func (ws *http2writeScheduler) takeFrom(id uint32, q *http2writeQueue) (wm http2frameWriteMsg, ok bool) {
  7121  	wm = q.head()
  7122  
  7123  	if wd, ok := wm.write.(*http2writeData); ok && len(wd.p) > 0 {
  7124  		allowed := wm.stream.flow.available()
  7125  		if allowed == 0 {
  7126  
  7127  			return http2frameWriteMsg{}, false
  7128  		}
  7129  		if int32(ws.maxFrameSize) < allowed {
  7130  			allowed = int32(ws.maxFrameSize)
  7131  		}
  7132  
  7133  		if len(wd.p) > int(allowed) {
  7134  			wm.stream.flow.take(allowed)
  7135  			chunk := wd.p[:allowed]
  7136  			wd.p = wd.p[allowed:]
  7137  
  7138  			return http2frameWriteMsg{
  7139  				stream: wm.stream,
  7140  				write: &http2writeData{
  7141  					streamID: wd.streamID,
  7142  					p:        chunk,
  7143  
  7144  					endStream: false,
  7145  				},
  7146  
  7147  				done: nil,
  7148  			}, true
  7149  		}
  7150  		wm.stream.flow.take(int32(len(wd.p)))
  7151  	}
  7152  
  7153  	q.shift()
  7154  	if q.empty() {
  7155  		ws.putEmptyQueue(q)
  7156  		delete(ws.sq, id)
  7157  	}
  7158  	return wm, true
  7159  }
  7160  
  7161  func (ws *http2writeScheduler) forgetStream(id uint32) {
  7162  	q, ok := ws.sq[id]
  7163  	if !ok {
  7164  		return
  7165  	}
  7166  	delete(ws.sq, id)
  7167  
  7168  	for i := range q.s {
  7169  		q.s[i] = http2frameWriteMsg{}
  7170  	}
  7171  	q.s = q.s[:0]
  7172  	ws.putEmptyQueue(q)
  7173  }
  7174  
  7175  type http2writeQueue struct {
  7176  	s []http2frameWriteMsg
  7177  }
  7178  
  7179  // streamID returns the stream ID for a non-empty stream-specific queue.
  7180  func (q *http2writeQueue) streamID() uint32 { return q.s[0].stream.id }
  7181  
  7182  func (q *http2writeQueue) empty() bool { return len(q.s) == 0 }
  7183  
  7184  func (q *http2writeQueue) push(wm http2frameWriteMsg) {
  7185  	q.s = append(q.s, wm)
  7186  }
  7187  
  7188  // head returns the next item that would be removed by shift.
  7189  func (q *http2writeQueue) head() http2frameWriteMsg {
  7190  	if len(q.s) == 0 {
  7191  		panic("invalid use of queue")
  7192  	}
  7193  	return q.s[0]
  7194  }
  7195  
  7196  func (q *http2writeQueue) shift() http2frameWriteMsg {
  7197  	if len(q.s) == 0 {
  7198  		panic("invalid use of queue")
  7199  	}
  7200  	wm := q.s[0]
  7201  
  7202  	copy(q.s, q.s[1:])
  7203  	q.s[len(q.s)-1] = http2frameWriteMsg{}
  7204  	q.s = q.s[:len(q.s)-1]
  7205  	return wm
  7206  }
  7207  
  7208  func (q *http2writeQueue) firstIsNoCost() bool {
  7209  	if df, ok := q.s[0].write.(*http2writeData); ok {
  7210  		return len(df.p) == 0
  7211  	}
  7212  	return true
  7213  }