github.com/Andyfoo/golang/x/net@v0.0.0-20190901054642-57c1bf301704/http2/server.go (about)

     1  // Copyright 2014 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // TODO: turn off the serve goroutine when idle, so
     6  // an idle conn only has the readFrames goroutine active. (which could
     7  // also be optimized probably to pin less memory in crypto/tls). This
     8  // would involve tracking when the serve goroutine is active (atomic
     9  // int32 read/CAS probably?) and starting it up when frames arrive,
    10  // and shutting it down when all handlers exit. the occasional PING
    11  // packets could use time.AfterFunc to call sc.wakeStartServeLoop()
    12  // (which is a no-op if already running) and then queue the PING write
    13  // as normal. The serve loop would then exit in most cases (if no
    14  // Handlers running) and not be woken up again until the PING packet
    15  // returns.
    16  
    17  // TODO (maybe): add a mechanism for Handlers to going into
    18  // half-closed-local mode (rw.(io.Closer) test?) but not exit their
    19  // handler, and continue to be able to read from the
    20  // Request.Body. This would be a somewhat semantic change from HTTP/1
    21  // (or at least what we expose in net/http), so I'd probably want to
    22  // add it there too. For now, this package says that returning from
    23  // the Handler ServeHTTP function means you're both done reading and
    24  // done writing, without a way to stop just one or the other.
    25  
    26  package http2
    27  
    28  import (
    29  	"bufio"
    30  	"bytes"
    31  	"context"
    32  	"crypto/tls"
    33  	"errors"
    34  	"fmt"
    35  	"io"
    36  	"log"
    37  	"math"
    38  	"net"
    39  	"net/http"
    40  	"net/textproto"
    41  	"net/url"
    42  	"os"
    43  	"reflect"
    44  	"runtime"
    45  	"strconv"
    46  	"strings"
    47  	"sync"
    48  	"time"
    49  
    50  	"github.com/Andyfoo/golang/x/net/http/httpguts"
    51  	"github.com/Andyfoo/golang/x/net/http2/hpack"
    52  )
    53  
    54  const (
    55  	prefaceTimeout         = 10 * time.Second
    56  	firstSettingsTimeout   = 2 * time.Second // should be in-flight with preface anyway
    57  	handlerChunkWriteSize  = 4 << 10
    58  	defaultMaxStreams      = 250 // TODO: make this 100 as the GFE seems to?
    59  	maxQueuedControlFrames = 10000
    60  )
    61  
    62  var (
    63  	errClientDisconnected = errors.New("client disconnected")
    64  	errClosedBody         = errors.New("body closed by handler")
    65  	errHandlerComplete    = errors.New("http2: request body closed due to handler exiting")
    66  	errStreamClosed       = errors.New("http2: stream closed")
    67  )
    68  
    69  var responseWriterStatePool = sync.Pool{
    70  	New: func() interface{} {
    71  		rws := &responseWriterState{}
    72  		rws.bw = bufio.NewWriterSize(chunkWriter{rws}, handlerChunkWriteSize)
    73  		return rws
    74  	},
    75  }
    76  
    77  // Test hooks.
    78  var (
    79  	testHookOnConn        func()
    80  	testHookGetServerConn func(*serverConn)
    81  	testHookOnPanicMu     *sync.Mutex // nil except in tests
    82  	testHookOnPanic       func(sc *serverConn, panicVal interface{}) (rePanic bool)
    83  )
    84  
    85  // Server is an HTTP/2 server.
    86  type Server struct {
    87  	// MaxHandlers limits the number of http.Handler ServeHTTP goroutines
    88  	// which may run at a time over all connections.
    89  	// Negative or zero no limit.
    90  	// TODO: implement
    91  	MaxHandlers int
    92  
    93  	// MaxConcurrentStreams optionally specifies the number of
    94  	// concurrent streams that each client may have open at a
    95  	// time. This is unrelated to the number of http.Handler goroutines
    96  	// which may be active globally, which is MaxHandlers.
    97  	// If zero, MaxConcurrentStreams defaults to at least 100, per
    98  	// the HTTP/2 spec's recommendations.
    99  	MaxConcurrentStreams uint32
   100  
   101  	// MaxReadFrameSize optionally specifies the largest frame
   102  	// this server is willing to read. A valid value is between
   103  	// 16k and 16M, inclusive. If zero or otherwise invalid, a
   104  	// default value is used.
   105  	MaxReadFrameSize uint32
   106  
   107  	// PermitProhibitedCipherSuites, if true, permits the use of
   108  	// cipher suites prohibited by the HTTP/2 spec.
   109  	PermitProhibitedCipherSuites bool
   110  
   111  	// IdleTimeout specifies how long until idle clients should be
   112  	// closed with a GOAWAY frame. PING frames are not considered
   113  	// activity for the purposes of IdleTimeout.
   114  	IdleTimeout time.Duration
   115  
   116  	// MaxUploadBufferPerConnection is the size of the initial flow
   117  	// control window for each connections. The HTTP/2 spec does not
   118  	// allow this to be smaller than 65535 or larger than 2^32-1.
   119  	// If the value is outside this range, a default value will be
   120  	// used instead.
   121  	MaxUploadBufferPerConnection int32
   122  
   123  	// MaxUploadBufferPerStream is the size of the initial flow control
   124  	// window for each stream. The HTTP/2 spec does not allow this to
   125  	// be larger than 2^32-1. If the value is zero or larger than the
   126  	// maximum, a default value will be used instead.
   127  	MaxUploadBufferPerStream int32
   128  
   129  	// NewWriteScheduler constructs a write scheduler for a connection.
   130  	// If nil, a default scheduler is chosen.
   131  	NewWriteScheduler func() WriteScheduler
   132  
   133  	// Internal state. This is a pointer (rather than embedded directly)
   134  	// so that we don't embed a Mutex in this struct, which will make the
   135  	// struct non-copyable, which might break some callers.
   136  	state *serverInternalState
   137  }
   138  
   139  func (s *Server) initialConnRecvWindowSize() int32 {
   140  	if s.MaxUploadBufferPerConnection > initialWindowSize {
   141  		return s.MaxUploadBufferPerConnection
   142  	}
   143  	return 1 << 20
   144  }
   145  
   146  func (s *Server) initialStreamRecvWindowSize() int32 {
   147  	if s.MaxUploadBufferPerStream > 0 {
   148  		return s.MaxUploadBufferPerStream
   149  	}
   150  	return 1 << 20
   151  }
   152  
   153  func (s *Server) maxReadFrameSize() uint32 {
   154  	if v := s.MaxReadFrameSize; v >= minMaxFrameSize && v <= maxFrameSize {
   155  		return v
   156  	}
   157  	return defaultMaxReadFrameSize
   158  }
   159  
   160  func (s *Server) maxConcurrentStreams() uint32 {
   161  	if v := s.MaxConcurrentStreams; v > 0 {
   162  		return v
   163  	}
   164  	return defaultMaxStreams
   165  }
   166  
   167  // maxQueuedControlFrames is the maximum number of control frames like
   168  // SETTINGS, PING and RST_STREAM that will be queued for writing before
   169  // the connection is closed to prevent memory exhaustion attacks.
   170  func (s *Server) maxQueuedControlFrames() int {
   171  	// TODO: if anybody asks, add a Server field, and remember to define the
   172  	// behavior of negative values.
   173  	return maxQueuedControlFrames
   174  }
   175  
   176  type serverInternalState struct {
   177  	mu          sync.Mutex
   178  	activeConns map[*serverConn]struct{}
   179  }
   180  
   181  func (s *serverInternalState) registerConn(sc *serverConn) {
   182  	if s == nil {
   183  		return // if the Server was used without calling ConfigureServer
   184  	}
   185  	s.mu.Lock()
   186  	s.activeConns[sc] = struct{}{}
   187  	s.mu.Unlock()
   188  }
   189  
   190  func (s *serverInternalState) unregisterConn(sc *serverConn) {
   191  	if s == nil {
   192  		return // if the Server was used without calling ConfigureServer
   193  	}
   194  	s.mu.Lock()
   195  	delete(s.activeConns, sc)
   196  	s.mu.Unlock()
   197  }
   198  
   199  func (s *serverInternalState) startGracefulShutdown() {
   200  	if s == nil {
   201  		return // if the Server was used without calling ConfigureServer
   202  	}
   203  	s.mu.Lock()
   204  	for sc := range s.activeConns {
   205  		sc.startGracefulShutdown()
   206  	}
   207  	s.mu.Unlock()
   208  }
   209  
   210  // ConfigureServer adds HTTP/2 support to a net/http Server.
   211  //
   212  // The configuration conf may be nil.
   213  //
   214  // ConfigureServer must be called before s begins serving.
   215  func ConfigureServer(s *http.Server, conf *Server) error {
   216  	if s == nil {
   217  		panic("nil *http.Server")
   218  	}
   219  	if conf == nil {
   220  		conf = new(Server)
   221  	}
   222  	conf.state = &serverInternalState{activeConns: make(map[*serverConn]struct{})}
   223  	if h1, h2 := s, conf; h2.IdleTimeout == 0 {
   224  		if h1.IdleTimeout != 0 {
   225  			h2.IdleTimeout = h1.IdleTimeout
   226  		} else {
   227  			h2.IdleTimeout = h1.ReadTimeout
   228  		}
   229  	}
   230  	s.RegisterOnShutdown(conf.state.startGracefulShutdown)
   231  
   232  	if s.TLSConfig == nil {
   233  		s.TLSConfig = new(tls.Config)
   234  	} else if s.TLSConfig.CipherSuites != nil {
   235  		// If they already provided a CipherSuite list, return
   236  		// an error if it has a bad order or is missing
   237  		// ECDHE_RSA_WITH_AES_128_GCM_SHA256 or ECDHE_ECDSA_WITH_AES_128_GCM_SHA256.
   238  		haveRequired := false
   239  		sawBad := false
   240  		for i, cs := range s.TLSConfig.CipherSuites {
   241  			switch cs {
   242  			case tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
   243  				// Alternative MTI cipher to not discourage ECDSA-only servers.
   244  				// See http://golang.org/cl/30721 for further information.
   245  				tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
   246  				haveRequired = true
   247  			}
   248  			if isBadCipher(cs) {
   249  				sawBad = true
   250  			} else if sawBad {
   251  				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)
   252  			}
   253  		}
   254  		if !haveRequired {
   255  			return fmt.Errorf("http2: TLSConfig.CipherSuites is missing an HTTP/2-required AES_128_GCM_SHA256 cipher.")
   256  		}
   257  	}
   258  
   259  	// Note: not setting MinVersion to tls.VersionTLS12,
   260  	// as we don't want to interfere with HTTP/1.1 traffic
   261  	// on the user's server. We enforce TLS 1.2 later once
   262  	// we accept a connection. Ideally this should be done
   263  	// during next-proto selection, but using TLS <1.2 with
   264  	// HTTP/2 is still the client's bug.
   265  
   266  	s.TLSConfig.PreferServerCipherSuites = true
   267  
   268  	haveNPN := false
   269  	for _, p := range s.TLSConfig.NextProtos {
   270  		if p == NextProtoTLS {
   271  			haveNPN = true
   272  			break
   273  		}
   274  	}
   275  	if !haveNPN {
   276  		s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, NextProtoTLS)
   277  	}
   278  
   279  	if s.TLSNextProto == nil {
   280  		s.TLSNextProto = map[string]func(*http.Server, *tls.Conn, http.Handler){}
   281  	}
   282  	protoHandler := func(hs *http.Server, c *tls.Conn, h http.Handler) {
   283  		if testHookOnConn != nil {
   284  			testHookOnConn()
   285  		}
   286  		// The TLSNextProto interface predates contexts, so
   287  		// the net/http package passes down its per-connection
   288  		// base context via an exported but unadvertised
   289  		// method on the Handler. This is for internal
   290  		// net/http<=>http2 use only.
   291  		var ctx context.Context
   292  		type baseContexter interface {
   293  			BaseContext() context.Context
   294  		}
   295  		if bc, ok := h.(baseContexter); ok {
   296  			ctx = bc.BaseContext()
   297  		}
   298  		conf.ServeConn(c, &ServeConnOpts{
   299  			Context:    ctx,
   300  			Handler:    h,
   301  			BaseConfig: hs,
   302  		})
   303  	}
   304  	s.TLSNextProto[NextProtoTLS] = protoHandler
   305  	return nil
   306  }
   307  
   308  // ServeConnOpts are options for the Server.ServeConn method.
   309  type ServeConnOpts struct {
   310  	// Context is the base context to use.
   311  	// If nil, context.Background is used.
   312  	Context context.Context
   313  
   314  	// BaseConfig optionally sets the base configuration
   315  	// for values. If nil, defaults are used.
   316  	BaseConfig *http.Server
   317  
   318  	// Handler specifies which handler to use for processing
   319  	// requests. If nil, BaseConfig.Handler is used. If BaseConfig
   320  	// or BaseConfig.Handler is nil, http.DefaultServeMux is used.
   321  	Handler http.Handler
   322  }
   323  
   324  func (o *ServeConnOpts) context() context.Context {
   325  	if o != nil && o.Context != nil {
   326  		return o.Context
   327  	}
   328  	return context.Background()
   329  }
   330  
   331  func (o *ServeConnOpts) baseConfig() *http.Server {
   332  	if o != nil && o.BaseConfig != nil {
   333  		return o.BaseConfig
   334  	}
   335  	return new(http.Server)
   336  }
   337  
   338  func (o *ServeConnOpts) handler() http.Handler {
   339  	if o != nil {
   340  		if o.Handler != nil {
   341  			return o.Handler
   342  		}
   343  		if o.BaseConfig != nil && o.BaseConfig.Handler != nil {
   344  			return o.BaseConfig.Handler
   345  		}
   346  	}
   347  	return http.DefaultServeMux
   348  }
   349  
   350  // ServeConn serves HTTP/2 requests on the provided connection and
   351  // blocks until the connection is no longer readable.
   352  //
   353  // ServeConn starts speaking HTTP/2 assuming that c has not had any
   354  // reads or writes. It writes its initial settings frame and expects
   355  // to be able to read the preface and settings frame from the
   356  // client. If c has a ConnectionState method like a *tls.Conn, the
   357  // ConnectionState is used to verify the TLS ciphersuite and to set
   358  // the Request.TLS field in Handlers.
   359  //
   360  // ServeConn does not support h2c by itself. Any h2c support must be
   361  // implemented in terms of providing a suitably-behaving net.Conn.
   362  //
   363  // The opts parameter is optional. If nil, default values are used.
   364  func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) {
   365  	baseCtx, cancel := serverConnBaseContext(c, opts)
   366  	defer cancel()
   367  
   368  	sc := &serverConn{
   369  		srv:                         s,
   370  		hs:                          opts.baseConfig(),
   371  		conn:                        c,
   372  		baseCtx:                     baseCtx,
   373  		remoteAddrStr:               c.RemoteAddr().String(),
   374  		bw:                          newBufferedWriter(c),
   375  		handler:                     opts.handler(),
   376  		streams:                     make(map[uint32]*stream),
   377  		readFrameCh:                 make(chan readFrameResult),
   378  		wantWriteFrameCh:            make(chan FrameWriteRequest, 8),
   379  		serveMsgCh:                  make(chan interface{}, 8),
   380  		wroteFrameCh:                make(chan frameWriteResult, 1), // buffered; one send in writeFrameAsync
   381  		bodyReadCh:                  make(chan bodyReadMsg),         // buffering doesn't matter either way
   382  		doneServing:                 make(chan struct{}),
   383  		clientMaxStreams:            math.MaxUint32, // Section 6.5.2: "Initially, there is no limit to this value"
   384  		advMaxStreams:               s.maxConcurrentStreams(),
   385  		initialStreamSendWindowSize: initialWindowSize,
   386  		maxFrameSize:                initialMaxFrameSize,
   387  		headerTableSize:             initialHeaderTableSize,
   388  		serveG:                      newGoroutineLock(),
   389  		pushEnabled:                 true,
   390  	}
   391  
   392  	s.state.registerConn(sc)
   393  	defer s.state.unregisterConn(sc)
   394  
   395  	// The net/http package sets the write deadline from the
   396  	// http.Server.WriteTimeout during the TLS handshake, but then
   397  	// passes the connection off to us with the deadline already set.
   398  	// Write deadlines are set per stream in serverConn.newStream.
   399  	// Disarm the net.Conn write deadline here.
   400  	if sc.hs.WriteTimeout != 0 {
   401  		sc.conn.SetWriteDeadline(time.Time{})
   402  	}
   403  
   404  	if s.NewWriteScheduler != nil {
   405  		sc.writeSched = s.NewWriteScheduler()
   406  	} else {
   407  		sc.writeSched = NewRandomWriteScheduler()
   408  	}
   409  
   410  	// These start at the RFC-specified defaults. If there is a higher
   411  	// configured value for inflow, that will be updated when we send a
   412  	// WINDOW_UPDATE shortly after sending SETTINGS.
   413  	sc.flow.add(initialWindowSize)
   414  	sc.inflow.add(initialWindowSize)
   415  	sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf)
   416  
   417  	fr := NewFramer(sc.bw, c)
   418  	fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil)
   419  	fr.MaxHeaderListSize = sc.maxHeaderListSize()
   420  	fr.SetMaxReadFrameSize(s.maxReadFrameSize())
   421  	sc.framer = fr
   422  
   423  	if tc, ok := c.(connectionStater); ok {
   424  		sc.tlsState = new(tls.ConnectionState)
   425  		*sc.tlsState = tc.ConnectionState()
   426  		// 9.2 Use of TLS Features
   427  		// An implementation of HTTP/2 over TLS MUST use TLS
   428  		// 1.2 or higher with the restrictions on feature set
   429  		// and cipher suite described in this section. Due to
   430  		// implementation limitations, it might not be
   431  		// possible to fail TLS negotiation. An endpoint MUST
   432  		// immediately terminate an HTTP/2 connection that
   433  		// does not meet the TLS requirements described in
   434  		// this section with a connection error (Section
   435  		// 5.4.1) of type INADEQUATE_SECURITY.
   436  		if sc.tlsState.Version < tls.VersionTLS12 {
   437  			sc.rejectConn(ErrCodeInadequateSecurity, "TLS version too low")
   438  			return
   439  		}
   440  
   441  		if sc.tlsState.ServerName == "" {
   442  			// Client must use SNI, but we don't enforce that anymore,
   443  			// since it was causing problems when connecting to bare IP
   444  			// addresses during development.
   445  			//
   446  			// TODO: optionally enforce? Or enforce at the time we receive
   447  			// a new request, and verify the ServerName matches the :authority?
   448  			// But that precludes proxy situations, perhaps.
   449  			//
   450  			// So for now, do nothing here again.
   451  		}
   452  
   453  		if !s.PermitProhibitedCipherSuites && isBadCipher(sc.tlsState.CipherSuite) {
   454  			// "Endpoints MAY choose to generate a connection error
   455  			// (Section 5.4.1) of type INADEQUATE_SECURITY if one of
   456  			// the prohibited cipher suites are negotiated."
   457  			//
   458  			// We choose that. In my opinion, the spec is weak
   459  			// here. It also says both parties must support at least
   460  			// TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 so there's no
   461  			// excuses here. If we really must, we could allow an
   462  			// "AllowInsecureWeakCiphers" option on the server later.
   463  			// Let's see how it plays out first.
   464  			sc.rejectConn(ErrCodeInadequateSecurity, fmt.Sprintf("Prohibited TLS 1.2 Cipher Suite: %x", sc.tlsState.CipherSuite))
   465  			return
   466  		}
   467  	}
   468  
   469  	if hook := testHookGetServerConn; hook != nil {
   470  		hook(sc)
   471  	}
   472  	sc.serve()
   473  }
   474  
   475  func serverConnBaseContext(c net.Conn, opts *ServeConnOpts) (ctx context.Context, cancel func()) {
   476  	ctx, cancel = context.WithCancel(opts.context())
   477  	ctx = context.WithValue(ctx, http.LocalAddrContextKey, c.LocalAddr())
   478  	if hs := opts.baseConfig(); hs != nil {
   479  		ctx = context.WithValue(ctx, http.ServerContextKey, hs)
   480  	}
   481  	return
   482  }
   483  
   484  func (sc *serverConn) rejectConn(err ErrCode, debug string) {
   485  	sc.vlogf("http2: server rejecting conn: %v, %s", err, debug)
   486  	// ignoring errors. hanging up anyway.
   487  	sc.framer.WriteGoAway(0, err, []byte(debug))
   488  	sc.bw.Flush()
   489  	sc.conn.Close()
   490  }
   491  
   492  type serverConn struct {
   493  	// Immutable:
   494  	srv              *Server
   495  	hs               *http.Server
   496  	conn             net.Conn
   497  	bw               *bufferedWriter // writing to conn
   498  	handler          http.Handler
   499  	baseCtx          context.Context
   500  	framer           *Framer
   501  	doneServing      chan struct{}          // closed when serverConn.serve ends
   502  	readFrameCh      chan readFrameResult   // written by serverConn.readFrames
   503  	wantWriteFrameCh chan FrameWriteRequest // from handlers -> serve
   504  	wroteFrameCh     chan frameWriteResult  // from writeFrameAsync -> serve, tickles more frame writes
   505  	bodyReadCh       chan bodyReadMsg       // from handlers -> serve
   506  	serveMsgCh       chan interface{}       // misc messages & code to send to / run on the serve loop
   507  	flow             flow                   // conn-wide (not stream-specific) outbound flow control
   508  	inflow           flow                   // conn-wide inbound flow control
   509  	tlsState         *tls.ConnectionState   // shared by all handlers, like net/http
   510  	remoteAddrStr    string
   511  	writeSched       WriteScheduler
   512  
   513  	// Everything following is owned by the serve loop; use serveG.check():
   514  	serveG                      goroutineLock // used to verify funcs are on serve()
   515  	pushEnabled                 bool
   516  	sawFirstSettings            bool // got the initial SETTINGS frame after the preface
   517  	needToSendSettingsAck       bool
   518  	unackedSettings             int    // how many SETTINGS have we sent without ACKs?
   519  	queuedControlFrames         int    // control frames in the writeSched queue
   520  	clientMaxStreams            uint32 // SETTINGS_MAX_CONCURRENT_STREAMS from client (our PUSH_PROMISE limit)
   521  	advMaxStreams               uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client
   522  	curClientStreams            uint32 // number of open streams initiated by the client
   523  	curPushedStreams            uint32 // number of open streams initiated by server push
   524  	maxClientStreamID           uint32 // max ever seen from client (odd), or 0 if there have been no client requests
   525  	maxPushPromiseID            uint32 // ID of the last push promise (even), or 0 if there have been no pushes
   526  	streams                     map[uint32]*stream
   527  	initialStreamSendWindowSize int32
   528  	maxFrameSize                int32
   529  	headerTableSize             uint32
   530  	peerMaxHeaderListSize       uint32            // zero means unknown (default)
   531  	canonHeader                 map[string]string // http2-lower-case -> Go-Canonical-Case
   532  	writingFrame                bool              // started writing a frame (on serve goroutine or separate)
   533  	writingFrameAsync           bool              // started a frame on its own goroutine but haven't heard back on wroteFrameCh
   534  	needsFrameFlush             bool              // last frame write wasn't a flush
   535  	inGoAway                    bool              // we've started to or sent GOAWAY
   536  	inFrameScheduleLoop         bool              // whether we're in the scheduleFrameWrite loop
   537  	needToSendGoAway            bool              // we need to schedule a GOAWAY frame write
   538  	goAwayCode                  ErrCode
   539  	shutdownTimer               *time.Timer // nil until used
   540  	idleTimer                   *time.Timer // nil if unused
   541  
   542  	// Owned by the writeFrameAsync goroutine:
   543  	headerWriteBuf bytes.Buffer
   544  	hpackEncoder   *hpack.Encoder
   545  
   546  	// Used by startGracefulShutdown.
   547  	shutdownOnce sync.Once
   548  }
   549  
   550  func (sc *serverConn) maxHeaderListSize() uint32 {
   551  	n := sc.hs.MaxHeaderBytes
   552  	if n <= 0 {
   553  		n = http.DefaultMaxHeaderBytes
   554  	}
   555  	// http2's count is in a slightly different unit and includes 32 bytes per pair.
   556  	// So, take the net/http.Server value and pad it up a bit, assuming 10 headers.
   557  	const perFieldOverhead = 32 // per http2 spec
   558  	const typicalHeaders = 10   // conservative
   559  	return uint32(n + typicalHeaders*perFieldOverhead)
   560  }
   561  
   562  func (sc *serverConn) curOpenStreams() uint32 {
   563  	sc.serveG.check()
   564  	return sc.curClientStreams + sc.curPushedStreams
   565  }
   566  
   567  // stream represents a stream. This is the minimal metadata needed by
   568  // the serve goroutine. Most of the actual stream state is owned by
   569  // the http.Handler's goroutine in the responseWriter. Because the
   570  // responseWriter's responseWriterState is recycled at the end of a
   571  // handler, this struct intentionally has no pointer to the
   572  // *responseWriter{,State} itself, as the Handler ending nils out the
   573  // responseWriter's state field.
   574  type stream struct {
   575  	// immutable:
   576  	sc        *serverConn
   577  	id        uint32
   578  	body      *pipe       // non-nil if expecting DATA frames
   579  	cw        closeWaiter // closed wait stream transitions to closed state
   580  	ctx       context.Context
   581  	cancelCtx func()
   582  
   583  	// owned by serverConn's serve loop:
   584  	bodyBytes        int64   // body bytes seen so far
   585  	declBodyBytes    int64   // or -1 if undeclared
   586  	flow             flow    // limits writing from Handler to client
   587  	inflow           flow    // what the client is allowed to POST/etc to us
   588  	parent           *stream // or nil
   589  	numTrailerValues int64
   590  	weight           uint8
   591  	state            streamState
   592  	resetQueued      bool        // RST_STREAM queued for write; set by sc.resetStream
   593  	gotTrailerHeader bool        // HEADER frame for trailers was seen
   594  	wroteHeaders     bool        // whether we wrote headers (not status 100)
   595  	writeDeadline    *time.Timer // nil if unused
   596  
   597  	trailer    http.Header // accumulated trailers
   598  	reqTrailer http.Header // handler's Request.Trailer
   599  }
   600  
   601  func (sc *serverConn) Framer() *Framer  { return sc.framer }
   602  func (sc *serverConn) CloseConn() error { return sc.conn.Close() }
   603  func (sc *serverConn) Flush() error     { return sc.bw.Flush() }
   604  func (sc *serverConn) HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) {
   605  	return sc.hpackEncoder, &sc.headerWriteBuf
   606  }
   607  
   608  func (sc *serverConn) state(streamID uint32) (streamState, *stream) {
   609  	sc.serveG.check()
   610  	// http://tools.ietf.org/html/rfc7540#section-5.1
   611  	if st, ok := sc.streams[streamID]; ok {
   612  		return st.state, st
   613  	}
   614  	// "The first use of a new stream identifier implicitly closes all
   615  	// streams in the "idle" state that might have been initiated by
   616  	// that peer with a lower-valued stream identifier. For example, if
   617  	// a client sends a HEADERS frame on stream 7 without ever sending a
   618  	// frame on stream 5, then stream 5 transitions to the "closed"
   619  	// state when the first frame for stream 7 is sent or received."
   620  	if streamID%2 == 1 {
   621  		if streamID <= sc.maxClientStreamID {
   622  			return stateClosed, nil
   623  		}
   624  	} else {
   625  		if streamID <= sc.maxPushPromiseID {
   626  			return stateClosed, nil
   627  		}
   628  	}
   629  	return stateIdle, nil
   630  }
   631  
   632  // setConnState calls the net/http ConnState hook for this connection, if configured.
   633  // Note that the net/http package does StateNew and StateClosed for us.
   634  // There is currently no plan for StateHijacked or hijacking HTTP/2 connections.
   635  func (sc *serverConn) setConnState(state http.ConnState) {
   636  	if sc.hs.ConnState != nil {
   637  		sc.hs.ConnState(sc.conn, state)
   638  	}
   639  }
   640  
   641  func (sc *serverConn) vlogf(format string, args ...interface{}) {
   642  	if VerboseLogs {
   643  		sc.logf(format, args...)
   644  	}
   645  }
   646  
   647  func (sc *serverConn) logf(format string, args ...interface{}) {
   648  	if lg := sc.hs.ErrorLog; lg != nil {
   649  		lg.Printf(format, args...)
   650  	} else {
   651  		log.Printf(format, args...)
   652  	}
   653  }
   654  
   655  // errno returns v's underlying uintptr, else 0.
   656  //
   657  // TODO: remove this helper function once http2 can use build
   658  // tags. See comment in isClosedConnError.
   659  func errno(v error) uintptr {
   660  	if rv := reflect.ValueOf(v); rv.Kind() == reflect.Uintptr {
   661  		return uintptr(rv.Uint())
   662  	}
   663  	return 0
   664  }
   665  
   666  // isClosedConnError reports whether err is an error from use of a closed
   667  // network connection.
   668  func isClosedConnError(err error) bool {
   669  	if err == nil {
   670  		return false
   671  	}
   672  
   673  	// TODO: remove this string search and be more like the Windows
   674  	// case below. That might involve modifying the standard library
   675  	// to return better error types.
   676  	str := err.Error()
   677  	if strings.Contains(str, "use of closed network connection") {
   678  		return true
   679  	}
   680  
   681  	// TODO(bradfitz): x/tools/cmd/bundle doesn't really support
   682  	// build tags, so I can't make an http2_windows.go file with
   683  	// Windows-specific stuff. Fix that and move this, once we
   684  	// have a way to bundle this into std's net/http somehow.
   685  	if runtime.GOOS == "windows" {
   686  		if oe, ok := err.(*net.OpError); ok && oe.Op == "read" {
   687  			if se, ok := oe.Err.(*os.SyscallError); ok && se.Syscall == "wsarecv" {
   688  				const WSAECONNABORTED = 10053
   689  				const WSAECONNRESET = 10054
   690  				if n := errno(se.Err); n == WSAECONNRESET || n == WSAECONNABORTED {
   691  					return true
   692  				}
   693  			}
   694  		}
   695  	}
   696  	return false
   697  }
   698  
   699  func (sc *serverConn) condlogf(err error, format string, args ...interface{}) {
   700  	if err == nil {
   701  		return
   702  	}
   703  	if err == io.EOF || err == io.ErrUnexpectedEOF || isClosedConnError(err) || err == errPrefaceTimeout {
   704  		// Boring, expected errors.
   705  		sc.vlogf(format, args...)
   706  	} else {
   707  		sc.logf(format, args...)
   708  	}
   709  }
   710  
   711  func (sc *serverConn) canonicalHeader(v string) string {
   712  	sc.serveG.check()
   713  	buildCommonHeaderMapsOnce()
   714  	cv, ok := commonCanonHeader[v]
   715  	if ok {
   716  		return cv
   717  	}
   718  	cv, ok = sc.canonHeader[v]
   719  	if ok {
   720  		return cv
   721  	}
   722  	if sc.canonHeader == nil {
   723  		sc.canonHeader = make(map[string]string)
   724  	}
   725  	cv = http.CanonicalHeaderKey(v)
   726  	sc.canonHeader[v] = cv
   727  	return cv
   728  }
   729  
   730  type readFrameResult struct {
   731  	f   Frame // valid until readMore is called
   732  	err error
   733  
   734  	// readMore should be called once the consumer no longer needs or
   735  	// retains f. After readMore, f is invalid and more frames can be
   736  	// read.
   737  	readMore func()
   738  }
   739  
   740  // readFrames is the loop that reads incoming frames.
   741  // It takes care to only read one frame at a time, blocking until the
   742  // consumer is done with the frame.
   743  // It's run on its own goroutine.
   744  func (sc *serverConn) readFrames() {
   745  	gate := make(gate)
   746  	gateDone := gate.Done
   747  	for {
   748  		f, err := sc.framer.ReadFrame()
   749  		select {
   750  		case sc.readFrameCh <- readFrameResult{f, err, gateDone}:
   751  		case <-sc.doneServing:
   752  			return
   753  		}
   754  		select {
   755  		case <-gate:
   756  		case <-sc.doneServing:
   757  			return
   758  		}
   759  		if terminalReadFrameError(err) {
   760  			return
   761  		}
   762  	}
   763  }
   764  
   765  // frameWriteResult is the message passed from writeFrameAsync to the serve goroutine.
   766  type frameWriteResult struct {
   767  	wr  FrameWriteRequest // what was written (or attempted)
   768  	err error             // result of the writeFrame call
   769  }
   770  
   771  // writeFrameAsync runs in its own goroutine and writes a single frame
   772  // and then reports when it's done.
   773  // At most one goroutine can be running writeFrameAsync at a time per
   774  // serverConn.
   775  func (sc *serverConn) writeFrameAsync(wr FrameWriteRequest) {
   776  	err := wr.write.writeFrame(sc)
   777  	sc.wroteFrameCh <- frameWriteResult{wr, err}
   778  }
   779  
   780  func (sc *serverConn) closeAllStreamsOnConnClose() {
   781  	sc.serveG.check()
   782  	for _, st := range sc.streams {
   783  		sc.closeStream(st, errClientDisconnected)
   784  	}
   785  }
   786  
   787  func (sc *serverConn) stopShutdownTimer() {
   788  	sc.serveG.check()
   789  	if t := sc.shutdownTimer; t != nil {
   790  		t.Stop()
   791  	}
   792  }
   793  
   794  func (sc *serverConn) notePanic() {
   795  	// Note: this is for serverConn.serve panicking, not http.Handler code.
   796  	if testHookOnPanicMu != nil {
   797  		testHookOnPanicMu.Lock()
   798  		defer testHookOnPanicMu.Unlock()
   799  	}
   800  	if testHookOnPanic != nil {
   801  		if e := recover(); e != nil {
   802  			if testHookOnPanic(sc, e) {
   803  				panic(e)
   804  			}
   805  		}
   806  	}
   807  }
   808  
   809  func (sc *serverConn) serve() {
   810  	sc.serveG.check()
   811  	defer sc.notePanic()
   812  	defer sc.conn.Close()
   813  	defer sc.closeAllStreamsOnConnClose()
   814  	defer sc.stopShutdownTimer()
   815  	defer close(sc.doneServing) // unblocks handlers trying to send
   816  
   817  	if VerboseLogs {
   818  		sc.vlogf("http2: server connection from %v on %p", sc.conn.RemoteAddr(), sc.hs)
   819  	}
   820  
   821  	sc.writeFrame(FrameWriteRequest{
   822  		write: writeSettings{
   823  			{SettingMaxFrameSize, sc.srv.maxReadFrameSize()},
   824  			{SettingMaxConcurrentStreams, sc.advMaxStreams},
   825  			{SettingMaxHeaderListSize, sc.maxHeaderListSize()},
   826  			{SettingInitialWindowSize, uint32(sc.srv.initialStreamRecvWindowSize())},
   827  		},
   828  	})
   829  	sc.unackedSettings++
   830  
   831  	// Each connection starts with intialWindowSize inflow tokens.
   832  	// If a higher value is configured, we add more tokens.
   833  	if diff := sc.srv.initialConnRecvWindowSize() - initialWindowSize; diff > 0 {
   834  		sc.sendWindowUpdate(nil, int(diff))
   835  	}
   836  
   837  	if err := sc.readPreface(); err != nil {
   838  		sc.condlogf(err, "http2: server: error reading preface from client %v: %v", sc.conn.RemoteAddr(), err)
   839  		return
   840  	}
   841  	// Now that we've got the preface, get us out of the
   842  	// "StateNew" state. We can't go directly to idle, though.
   843  	// Active means we read some data and anticipate a request. We'll
   844  	// do another Active when we get a HEADERS frame.
   845  	sc.setConnState(http.StateActive)
   846  	sc.setConnState(http.StateIdle)
   847  
   848  	if sc.srv.IdleTimeout != 0 {
   849  		sc.idleTimer = time.AfterFunc(sc.srv.IdleTimeout, sc.onIdleTimer)
   850  		defer sc.idleTimer.Stop()
   851  	}
   852  
   853  	go sc.readFrames() // closed by defer sc.conn.Close above
   854  
   855  	settingsTimer := time.AfterFunc(firstSettingsTimeout, sc.onSettingsTimer)
   856  	defer settingsTimer.Stop()
   857  
   858  	loopNum := 0
   859  	for {
   860  		loopNum++
   861  		select {
   862  		case wr := <-sc.wantWriteFrameCh:
   863  			if se, ok := wr.write.(StreamError); ok {
   864  				sc.resetStream(se)
   865  				break
   866  			}
   867  			sc.writeFrame(wr)
   868  		case res := <-sc.wroteFrameCh:
   869  			sc.wroteFrame(res)
   870  		case res := <-sc.readFrameCh:
   871  			if !sc.processFrameFromReader(res) {
   872  				return
   873  			}
   874  			res.readMore()
   875  			if settingsTimer != nil {
   876  				settingsTimer.Stop()
   877  				settingsTimer = nil
   878  			}
   879  		case m := <-sc.bodyReadCh:
   880  			sc.noteBodyRead(m.st, m.n)
   881  		case msg := <-sc.serveMsgCh:
   882  			switch v := msg.(type) {
   883  			case func(int):
   884  				v(loopNum) // for testing
   885  			case *serverMessage:
   886  				switch v {
   887  				case settingsTimerMsg:
   888  					sc.logf("timeout waiting for SETTINGS frames from %v", sc.conn.RemoteAddr())
   889  					return
   890  				case idleTimerMsg:
   891  					sc.vlogf("connection is idle")
   892  					sc.goAway(ErrCodeNo)
   893  				case shutdownTimerMsg:
   894  					sc.vlogf("GOAWAY close timer fired; closing conn from %v", sc.conn.RemoteAddr())
   895  					return
   896  				case gracefulShutdownMsg:
   897  					sc.startGracefulShutdownInternal()
   898  				default:
   899  					panic("unknown timer")
   900  				}
   901  			case *startPushRequest:
   902  				sc.startPush(v)
   903  			default:
   904  				panic(fmt.Sprintf("unexpected type %T", v))
   905  			}
   906  		}
   907  
   908  		// If the peer is causing us to generate a lot of control frames,
   909  		// but not reading them from us, assume they are trying to make us
   910  		// run out of memory.
   911  		if sc.queuedControlFrames > sc.srv.maxQueuedControlFrames() {
   912  			sc.vlogf("http2: too many control frames in send queue, closing connection")
   913  			return
   914  		}
   915  
   916  		// Start the shutdown timer after sending a GOAWAY. When sending GOAWAY
   917  		// with no error code (graceful shutdown), don't start the timer until
   918  		// all open streams have been completed.
   919  		sentGoAway := sc.inGoAway && !sc.needToSendGoAway && !sc.writingFrame
   920  		gracefulShutdownComplete := sc.goAwayCode == ErrCodeNo && sc.curOpenStreams() == 0
   921  		if sentGoAway && sc.shutdownTimer == nil && (sc.goAwayCode != ErrCodeNo || gracefulShutdownComplete) {
   922  			sc.shutDownIn(goAwayTimeout)
   923  		}
   924  	}
   925  }
   926  
   927  func (sc *serverConn) awaitGracefulShutdown(sharedCh <-chan struct{}, privateCh chan struct{}) {
   928  	select {
   929  	case <-sc.doneServing:
   930  	case <-sharedCh:
   931  		close(privateCh)
   932  	}
   933  }
   934  
   935  type serverMessage int
   936  
   937  // Message values sent to serveMsgCh.
   938  var (
   939  	settingsTimerMsg    = new(serverMessage)
   940  	idleTimerMsg        = new(serverMessage)
   941  	shutdownTimerMsg    = new(serverMessage)
   942  	gracefulShutdownMsg = new(serverMessage)
   943  )
   944  
   945  func (sc *serverConn) onSettingsTimer() { sc.sendServeMsg(settingsTimerMsg) }
   946  func (sc *serverConn) onIdleTimer()     { sc.sendServeMsg(idleTimerMsg) }
   947  func (sc *serverConn) onShutdownTimer() { sc.sendServeMsg(shutdownTimerMsg) }
   948  
   949  func (sc *serverConn) sendServeMsg(msg interface{}) {
   950  	sc.serveG.checkNotOn() // NOT
   951  	select {
   952  	case sc.serveMsgCh <- msg:
   953  	case <-sc.doneServing:
   954  	}
   955  }
   956  
   957  var errPrefaceTimeout = errors.New("timeout waiting for client preface")
   958  
   959  // readPreface reads the ClientPreface greeting from the peer or
   960  // returns errPrefaceTimeout on timeout, or an error if the greeting
   961  // is invalid.
   962  func (sc *serverConn) readPreface() error {
   963  	errc := make(chan error, 1)
   964  	go func() {
   965  		// Read the client preface
   966  		buf := make([]byte, len(ClientPreface))
   967  		if _, err := io.ReadFull(sc.conn, buf); err != nil {
   968  			errc <- err
   969  		} else if !bytes.Equal(buf, clientPreface) {
   970  			errc <- fmt.Errorf("bogus greeting %q", buf)
   971  		} else {
   972  			errc <- nil
   973  		}
   974  	}()
   975  	timer := time.NewTimer(prefaceTimeout) // TODO: configurable on *Server?
   976  	defer timer.Stop()
   977  	select {
   978  	case <-timer.C:
   979  		return errPrefaceTimeout
   980  	case err := <-errc:
   981  		if err == nil {
   982  			if VerboseLogs {
   983  				sc.vlogf("http2: server: client %v said hello", sc.conn.RemoteAddr())
   984  			}
   985  		}
   986  		return err
   987  	}
   988  }
   989  
   990  var errChanPool = sync.Pool{
   991  	New: func() interface{} { return make(chan error, 1) },
   992  }
   993  
   994  var writeDataPool = sync.Pool{
   995  	New: func() interface{} { return new(writeData) },
   996  }
   997  
   998  // writeDataFromHandler writes DATA response frames from a handler on
   999  // the given stream.
  1000  func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStream bool) error {
  1001  	ch := errChanPool.Get().(chan error)
  1002  	writeArg := writeDataPool.Get().(*writeData)
  1003  	*writeArg = writeData{stream.id, data, endStream}
  1004  	err := sc.writeFrameFromHandler(FrameWriteRequest{
  1005  		write:  writeArg,
  1006  		stream: stream,
  1007  		done:   ch,
  1008  	})
  1009  	if err != nil {
  1010  		return err
  1011  	}
  1012  	var frameWriteDone bool // the frame write is done (successfully or not)
  1013  	select {
  1014  	case err = <-ch:
  1015  		frameWriteDone = true
  1016  	case <-sc.doneServing:
  1017  		return errClientDisconnected
  1018  	case <-stream.cw:
  1019  		// If both ch and stream.cw were ready (as might
  1020  		// happen on the final Write after an http.Handler
  1021  		// ends), prefer the write result. Otherwise this
  1022  		// might just be us successfully closing the stream.
  1023  		// The writeFrameAsync and serve goroutines guarantee
  1024  		// that the ch send will happen before the stream.cw
  1025  		// close.
  1026  		select {
  1027  		case err = <-ch:
  1028  			frameWriteDone = true
  1029  		default:
  1030  			return errStreamClosed
  1031  		}
  1032  	}
  1033  	errChanPool.Put(ch)
  1034  	if frameWriteDone {
  1035  		writeDataPool.Put(writeArg)
  1036  	}
  1037  	return err
  1038  }
  1039  
  1040  // writeFrameFromHandler sends wr to sc.wantWriteFrameCh, but aborts
  1041  // if the connection has gone away.
  1042  //
  1043  // This must not be run from the serve goroutine itself, else it might
  1044  // deadlock writing to sc.wantWriteFrameCh (which is only mildly
  1045  // buffered and is read by serve itself). If you're on the serve
  1046  // goroutine, call writeFrame instead.
  1047  func (sc *serverConn) writeFrameFromHandler(wr FrameWriteRequest) error {
  1048  	sc.serveG.checkNotOn() // NOT
  1049  	select {
  1050  	case sc.wantWriteFrameCh <- wr:
  1051  		return nil
  1052  	case <-sc.doneServing:
  1053  		// Serve loop is gone.
  1054  		// Client has closed their connection to the server.
  1055  		return errClientDisconnected
  1056  	}
  1057  }
  1058  
  1059  // writeFrame schedules a frame to write and sends it if there's nothing
  1060  // already being written.
  1061  //
  1062  // There is no pushback here (the serve goroutine never blocks). It's
  1063  // the http.Handlers that block, waiting for their previous frames to
  1064  // make it onto the wire
  1065  //
  1066  // If you're not on the serve goroutine, use writeFrameFromHandler instead.
  1067  func (sc *serverConn) writeFrame(wr FrameWriteRequest) {
  1068  	sc.serveG.check()
  1069  
  1070  	// If true, wr will not be written and wr.done will not be signaled.
  1071  	var ignoreWrite bool
  1072  
  1073  	// We are not allowed to write frames on closed streams. RFC 7540 Section
  1074  	// 5.1.1 says: "An endpoint MUST NOT send frames other than PRIORITY on
  1075  	// a closed stream." Our server never sends PRIORITY, so that exception
  1076  	// does not apply.
  1077  	//
  1078  	// The serverConn might close an open stream while the stream's handler
  1079  	// is still running. For example, the server might close a stream when it
  1080  	// receives bad data from the client. If this happens, the handler might
  1081  	// attempt to write a frame after the stream has been closed (since the
  1082  	// handler hasn't yet been notified of the close). In this case, we simply
  1083  	// ignore the frame. The handler will notice that the stream is closed when
  1084  	// it waits for the frame to be written.
  1085  	//
  1086  	// As an exception to this rule, we allow sending RST_STREAM after close.
  1087  	// This allows us to immediately reject new streams without tracking any
  1088  	// state for those streams (except for the queued RST_STREAM frame). This
  1089  	// may result in duplicate RST_STREAMs in some cases, but the client should
  1090  	// ignore those.
  1091  	if wr.StreamID() != 0 {
  1092  		_, isReset := wr.write.(StreamError)
  1093  		if state, _ := sc.state(wr.StreamID()); state == stateClosed && !isReset {
  1094  			ignoreWrite = true
  1095  		}
  1096  	}
  1097  
  1098  	// Don't send a 100-continue response if we've already sent headers.
  1099  	// See golang.org/issue/14030.
  1100  	switch wr.write.(type) {
  1101  	case *writeResHeaders:
  1102  		wr.stream.wroteHeaders = true
  1103  	case write100ContinueHeadersFrame:
  1104  		if wr.stream.wroteHeaders {
  1105  			// We do not need to notify wr.done because this frame is
  1106  			// never written with wr.done != nil.
  1107  			if wr.done != nil {
  1108  				panic("wr.done != nil for write100ContinueHeadersFrame")
  1109  			}
  1110  			ignoreWrite = true
  1111  		}
  1112  	}
  1113  
  1114  	if !ignoreWrite {
  1115  		if wr.isControl() {
  1116  			sc.queuedControlFrames++
  1117  			// For extra safety, detect wraparounds, which should not happen,
  1118  			// and pull the plug.
  1119  			if sc.queuedControlFrames < 0 {
  1120  				sc.conn.Close()
  1121  			}
  1122  		}
  1123  		sc.writeSched.Push(wr)
  1124  	}
  1125  	sc.scheduleFrameWrite()
  1126  }
  1127  
  1128  // startFrameWrite starts a goroutine to write wr (in a separate
  1129  // goroutine since that might block on the network), and updates the
  1130  // serve goroutine's state about the world, updated from info in wr.
  1131  func (sc *serverConn) startFrameWrite(wr FrameWriteRequest) {
  1132  	sc.serveG.check()
  1133  	if sc.writingFrame {
  1134  		panic("internal error: can only be writing one frame at a time")
  1135  	}
  1136  
  1137  	st := wr.stream
  1138  	if st != nil {
  1139  		switch st.state {
  1140  		case stateHalfClosedLocal:
  1141  			switch wr.write.(type) {
  1142  			case StreamError, handlerPanicRST, writeWindowUpdate:
  1143  				// RFC 7540 Section 5.1 allows sending RST_STREAM, PRIORITY, and WINDOW_UPDATE
  1144  				// in this state. (We never send PRIORITY from the server, so that is not checked.)
  1145  			default:
  1146  				panic(fmt.Sprintf("internal error: attempt to send frame on a half-closed-local stream: %v", wr))
  1147  			}
  1148  		case stateClosed:
  1149  			panic(fmt.Sprintf("internal error: attempt to send frame on a closed stream: %v", wr))
  1150  		}
  1151  	}
  1152  	if wpp, ok := wr.write.(*writePushPromise); ok {
  1153  		var err error
  1154  		wpp.promisedID, err = wpp.allocatePromisedID()
  1155  		if err != nil {
  1156  			sc.writingFrameAsync = false
  1157  			wr.replyToWriter(err)
  1158  			return
  1159  		}
  1160  	}
  1161  
  1162  	sc.writingFrame = true
  1163  	sc.needsFrameFlush = true
  1164  	if wr.write.staysWithinBuffer(sc.bw.Available()) {
  1165  		sc.writingFrameAsync = false
  1166  		err := wr.write.writeFrame(sc)
  1167  		sc.wroteFrame(frameWriteResult{wr, err})
  1168  	} else {
  1169  		sc.writingFrameAsync = true
  1170  		go sc.writeFrameAsync(wr)
  1171  	}
  1172  }
  1173  
  1174  // errHandlerPanicked is the error given to any callers blocked in a read from
  1175  // Request.Body when the main goroutine panics. Since most handlers read in the
  1176  // main ServeHTTP goroutine, this will show up rarely.
  1177  var errHandlerPanicked = errors.New("http2: handler panicked")
  1178  
  1179  // wroteFrame is called on the serve goroutine with the result of
  1180  // whatever happened on writeFrameAsync.
  1181  func (sc *serverConn) wroteFrame(res frameWriteResult) {
  1182  	sc.serveG.check()
  1183  	if !sc.writingFrame {
  1184  		panic("internal error: expected to be already writing a frame")
  1185  	}
  1186  	sc.writingFrame = false
  1187  	sc.writingFrameAsync = false
  1188  
  1189  	wr := res.wr
  1190  
  1191  	if writeEndsStream(wr.write) {
  1192  		st := wr.stream
  1193  		if st == nil {
  1194  			panic("internal error: expecting non-nil stream")
  1195  		}
  1196  		switch st.state {
  1197  		case stateOpen:
  1198  			// Here we would go to stateHalfClosedLocal in
  1199  			// theory, but since our handler is done and
  1200  			// the net/http package provides no mechanism
  1201  			// for closing a ResponseWriter while still
  1202  			// reading data (see possible TODO at top of
  1203  			// this file), we go into closed state here
  1204  			// anyway, after telling the peer we're
  1205  			// hanging up on them. We'll transition to
  1206  			// stateClosed after the RST_STREAM frame is
  1207  			// written.
  1208  			st.state = stateHalfClosedLocal
  1209  			// Section 8.1: a server MAY request that the client abort
  1210  			// transmission of a request without error by sending a
  1211  			// RST_STREAM with an error code of NO_ERROR after sending
  1212  			// a complete response.
  1213  			sc.resetStream(streamError(st.id, ErrCodeNo))
  1214  		case stateHalfClosedRemote:
  1215  			sc.closeStream(st, errHandlerComplete)
  1216  		}
  1217  	} else {
  1218  		switch v := wr.write.(type) {
  1219  		case StreamError:
  1220  			// st may be unknown if the RST_STREAM was generated to reject bad input.
  1221  			if st, ok := sc.streams[v.StreamID]; ok {
  1222  				sc.closeStream(st, v)
  1223  			}
  1224  		case handlerPanicRST:
  1225  			sc.closeStream(wr.stream, errHandlerPanicked)
  1226  		}
  1227  	}
  1228  
  1229  	// Reply (if requested) to unblock the ServeHTTP goroutine.
  1230  	wr.replyToWriter(res.err)
  1231  
  1232  	sc.scheduleFrameWrite()
  1233  }
  1234  
  1235  // scheduleFrameWrite tickles the frame writing scheduler.
  1236  //
  1237  // If a frame is already being written, nothing happens. This will be called again
  1238  // when the frame is done being written.
  1239  //
  1240  // If a frame isn't being written and we need to send one, the best frame
  1241  // to send is selected by writeSched.
  1242  //
  1243  // If a frame isn't being written and there's nothing else to send, we
  1244  // flush the write buffer.
  1245  func (sc *serverConn) scheduleFrameWrite() {
  1246  	sc.serveG.check()
  1247  	if sc.writingFrame || sc.inFrameScheduleLoop {
  1248  		return
  1249  	}
  1250  	sc.inFrameScheduleLoop = true
  1251  	for !sc.writingFrameAsync {
  1252  		if sc.needToSendGoAway {
  1253  			sc.needToSendGoAway = false
  1254  			sc.startFrameWrite(FrameWriteRequest{
  1255  				write: &writeGoAway{
  1256  					maxStreamID: sc.maxClientStreamID,
  1257  					code:        sc.goAwayCode,
  1258  				},
  1259  			})
  1260  			continue
  1261  		}
  1262  		if sc.needToSendSettingsAck {
  1263  			sc.needToSendSettingsAck = false
  1264  			sc.startFrameWrite(FrameWriteRequest{write: writeSettingsAck{}})
  1265  			continue
  1266  		}
  1267  		if !sc.inGoAway || sc.goAwayCode == ErrCodeNo {
  1268  			if wr, ok := sc.writeSched.Pop(); ok {
  1269  				if wr.isControl() {
  1270  					sc.queuedControlFrames--
  1271  				}
  1272  				sc.startFrameWrite(wr)
  1273  				continue
  1274  			}
  1275  		}
  1276  		if sc.needsFrameFlush {
  1277  			sc.startFrameWrite(FrameWriteRequest{write: flushFrameWriter{}})
  1278  			sc.needsFrameFlush = false // after startFrameWrite, since it sets this true
  1279  			continue
  1280  		}
  1281  		break
  1282  	}
  1283  	sc.inFrameScheduleLoop = false
  1284  }
  1285  
  1286  // startGracefulShutdown gracefully shuts down a connection. This
  1287  // sends GOAWAY with ErrCodeNo to tell the client we're gracefully
  1288  // shutting down. The connection isn't closed until all current
  1289  // streams are done.
  1290  //
  1291  // startGracefulShutdown returns immediately; it does not wait until
  1292  // the connection has shut down.
  1293  func (sc *serverConn) startGracefulShutdown() {
  1294  	sc.serveG.checkNotOn() // NOT
  1295  	sc.shutdownOnce.Do(func() { sc.sendServeMsg(gracefulShutdownMsg) })
  1296  }
  1297  
  1298  // After sending GOAWAY, the connection will close after goAwayTimeout.
  1299  // If we close the connection immediately after sending GOAWAY, there may
  1300  // be unsent data in our kernel receive buffer, which will cause the kernel
  1301  // to send a TCP RST on close() instead of a FIN. This RST will abort the
  1302  // connection immediately, whether or not the client had received the GOAWAY.
  1303  //
  1304  // Ideally we should delay for at least 1 RTT + epsilon so the client has
  1305  // a chance to read the GOAWAY and stop sending messages. Measuring RTT
  1306  // is hard, so we approximate with 1 second. See golang.org/issue/18701.
  1307  //
  1308  // This is a var so it can be shorter in tests, where all requests uses the
  1309  // loopback interface making the expected RTT very small.
  1310  //
  1311  // TODO: configurable?
  1312  var goAwayTimeout = 1 * time.Second
  1313  
  1314  func (sc *serverConn) startGracefulShutdownInternal() {
  1315  	sc.goAway(ErrCodeNo)
  1316  }
  1317  
  1318  func (sc *serverConn) goAway(code ErrCode) {
  1319  	sc.serveG.check()
  1320  	if sc.inGoAway {
  1321  		return
  1322  	}
  1323  	sc.inGoAway = true
  1324  	sc.needToSendGoAway = true
  1325  	sc.goAwayCode = code
  1326  	sc.scheduleFrameWrite()
  1327  }
  1328  
  1329  func (sc *serverConn) shutDownIn(d time.Duration) {
  1330  	sc.serveG.check()
  1331  	sc.shutdownTimer = time.AfterFunc(d, sc.onShutdownTimer)
  1332  }
  1333  
  1334  func (sc *serverConn) resetStream(se StreamError) {
  1335  	sc.serveG.check()
  1336  	sc.writeFrame(FrameWriteRequest{write: se})
  1337  	if st, ok := sc.streams[se.StreamID]; ok {
  1338  		st.resetQueued = true
  1339  	}
  1340  }
  1341  
  1342  // processFrameFromReader processes the serve loop's read from readFrameCh from the
  1343  // frame-reading goroutine.
  1344  // processFrameFromReader returns whether the connection should be kept open.
  1345  func (sc *serverConn) processFrameFromReader(res readFrameResult) bool {
  1346  	sc.serveG.check()
  1347  	err := res.err
  1348  	if err != nil {
  1349  		if err == ErrFrameTooLarge {
  1350  			sc.goAway(ErrCodeFrameSize)
  1351  			return true // goAway will close the loop
  1352  		}
  1353  		clientGone := err == io.EOF || err == io.ErrUnexpectedEOF || isClosedConnError(err)
  1354  		if clientGone {
  1355  			// TODO: could we also get into this state if
  1356  			// the peer does a half close
  1357  			// (e.g. CloseWrite) because they're done
  1358  			// sending frames but they're still wanting
  1359  			// our open replies?  Investigate.
  1360  			// TODO: add CloseWrite to crypto/tls.Conn first
  1361  			// so we have a way to test this? I suppose
  1362  			// just for testing we could have a non-TLS mode.
  1363  			return false
  1364  		}
  1365  	} else {
  1366  		f := res.f
  1367  		if VerboseLogs {
  1368  			sc.vlogf("http2: server read frame %v", summarizeFrame(f))
  1369  		}
  1370  		err = sc.processFrame(f)
  1371  		if err == nil {
  1372  			return true
  1373  		}
  1374  	}
  1375  
  1376  	switch ev := err.(type) {
  1377  	case StreamError:
  1378  		sc.resetStream(ev)
  1379  		return true
  1380  	case goAwayFlowError:
  1381  		sc.goAway(ErrCodeFlowControl)
  1382  		return true
  1383  	case ConnectionError:
  1384  		sc.logf("http2: server connection error from %v: %v", sc.conn.RemoteAddr(), ev)
  1385  		sc.goAway(ErrCode(ev))
  1386  		return true // goAway will handle shutdown
  1387  	default:
  1388  		if res.err != nil {
  1389  			sc.vlogf("http2: server closing client connection; error reading frame from client %s: %v", sc.conn.RemoteAddr(), err)
  1390  		} else {
  1391  			sc.logf("http2: server closing client connection: %v", err)
  1392  		}
  1393  		return false
  1394  	}
  1395  }
  1396  
  1397  func (sc *serverConn) processFrame(f Frame) error {
  1398  	sc.serveG.check()
  1399  
  1400  	// First frame received must be SETTINGS.
  1401  	if !sc.sawFirstSettings {
  1402  		if _, ok := f.(*SettingsFrame); !ok {
  1403  			return ConnectionError(ErrCodeProtocol)
  1404  		}
  1405  		sc.sawFirstSettings = true
  1406  	}
  1407  
  1408  	switch f := f.(type) {
  1409  	case *SettingsFrame:
  1410  		return sc.processSettings(f)
  1411  	case *MetaHeadersFrame:
  1412  		return sc.processHeaders(f)
  1413  	case *WindowUpdateFrame:
  1414  		return sc.processWindowUpdate(f)
  1415  	case *PingFrame:
  1416  		return sc.processPing(f)
  1417  	case *DataFrame:
  1418  		return sc.processData(f)
  1419  	case *RSTStreamFrame:
  1420  		return sc.processResetStream(f)
  1421  	case *PriorityFrame:
  1422  		return sc.processPriority(f)
  1423  	case *GoAwayFrame:
  1424  		return sc.processGoAway(f)
  1425  	case *PushPromiseFrame:
  1426  		// A client cannot push. Thus, servers MUST treat the receipt of a PUSH_PROMISE
  1427  		// frame as a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
  1428  		return ConnectionError(ErrCodeProtocol)
  1429  	default:
  1430  		sc.vlogf("http2: server ignoring frame: %v", f.Header())
  1431  		return nil
  1432  	}
  1433  }
  1434  
  1435  func (sc *serverConn) processPing(f *PingFrame) error {
  1436  	sc.serveG.check()
  1437  	if f.IsAck() {
  1438  		// 6.7 PING: " An endpoint MUST NOT respond to PING frames
  1439  		// containing this flag."
  1440  		return nil
  1441  	}
  1442  	if f.StreamID != 0 {
  1443  		// "PING frames are not associated with any individual
  1444  		// stream. If a PING frame is received with a stream
  1445  		// identifier field value other than 0x0, the recipient MUST
  1446  		// respond with a connection error (Section 5.4.1) of type
  1447  		// PROTOCOL_ERROR."
  1448  		return ConnectionError(ErrCodeProtocol)
  1449  	}
  1450  	if sc.inGoAway && sc.goAwayCode != ErrCodeNo {
  1451  		return nil
  1452  	}
  1453  	sc.writeFrame(FrameWriteRequest{write: writePingAck{f}})
  1454  	return nil
  1455  }
  1456  
  1457  func (sc *serverConn) processWindowUpdate(f *WindowUpdateFrame) error {
  1458  	sc.serveG.check()
  1459  	switch {
  1460  	case f.StreamID != 0: // stream-level flow control
  1461  		state, st := sc.state(f.StreamID)
  1462  		if state == stateIdle {
  1463  			// Section 5.1: "Receiving any frame other than HEADERS
  1464  			// or PRIORITY on a stream in this state MUST be
  1465  			// treated as a connection error (Section 5.4.1) of
  1466  			// type PROTOCOL_ERROR."
  1467  			return ConnectionError(ErrCodeProtocol)
  1468  		}
  1469  		if st == nil {
  1470  			// "WINDOW_UPDATE can be sent by a peer that has sent a
  1471  			// frame bearing the END_STREAM flag. This means that a
  1472  			// receiver could receive a WINDOW_UPDATE frame on a "half
  1473  			// closed (remote)" or "closed" stream. A receiver MUST
  1474  			// NOT treat this as an error, see Section 5.1."
  1475  			return nil
  1476  		}
  1477  		if !st.flow.add(int32(f.Increment)) {
  1478  			return streamError(f.StreamID, ErrCodeFlowControl)
  1479  		}
  1480  	default: // connection-level flow control
  1481  		if !sc.flow.add(int32(f.Increment)) {
  1482  			return goAwayFlowError{}
  1483  		}
  1484  	}
  1485  	sc.scheduleFrameWrite()
  1486  	return nil
  1487  }
  1488  
  1489  func (sc *serverConn) processResetStream(f *RSTStreamFrame) error {
  1490  	sc.serveG.check()
  1491  
  1492  	state, st := sc.state(f.StreamID)
  1493  	if state == stateIdle {
  1494  		// 6.4 "RST_STREAM frames MUST NOT be sent for a
  1495  		// stream in the "idle" state. If a RST_STREAM frame
  1496  		// identifying an idle stream is received, the
  1497  		// recipient MUST treat this as a connection error
  1498  		// (Section 5.4.1) of type PROTOCOL_ERROR.
  1499  		return ConnectionError(ErrCodeProtocol)
  1500  	}
  1501  	if st != nil {
  1502  		st.cancelCtx()
  1503  		sc.closeStream(st, streamError(f.StreamID, f.ErrCode))
  1504  	}
  1505  	return nil
  1506  }
  1507  
  1508  func (sc *serverConn) closeStream(st *stream, err error) {
  1509  	sc.serveG.check()
  1510  	if st.state == stateIdle || st.state == stateClosed {
  1511  		panic(fmt.Sprintf("invariant; can't close stream in state %v", st.state))
  1512  	}
  1513  	st.state = stateClosed
  1514  	if st.writeDeadline != nil {
  1515  		st.writeDeadline.Stop()
  1516  	}
  1517  	if st.isPushed() {
  1518  		sc.curPushedStreams--
  1519  	} else {
  1520  		sc.curClientStreams--
  1521  	}
  1522  	delete(sc.streams, st.id)
  1523  	if len(sc.streams) == 0 {
  1524  		sc.setConnState(http.StateIdle)
  1525  		if sc.srv.IdleTimeout != 0 {
  1526  			sc.idleTimer.Reset(sc.srv.IdleTimeout)
  1527  		}
  1528  		if h1ServerKeepAlivesDisabled(sc.hs) {
  1529  			sc.startGracefulShutdownInternal()
  1530  		}
  1531  	}
  1532  	if p := st.body; p != nil {
  1533  		// Return any buffered unread bytes worth of conn-level flow control.
  1534  		// See golang.org/issue/16481
  1535  		sc.sendWindowUpdate(nil, p.Len())
  1536  
  1537  		p.CloseWithError(err)
  1538  	}
  1539  	st.cw.Close() // signals Handler's CloseNotifier, unblocks writes, etc
  1540  	sc.writeSched.CloseStream(st.id)
  1541  }
  1542  
  1543  func (sc *serverConn) processSettings(f *SettingsFrame) error {
  1544  	sc.serveG.check()
  1545  	if f.IsAck() {
  1546  		sc.unackedSettings--
  1547  		if sc.unackedSettings < 0 {
  1548  			// Why is the peer ACKing settings we never sent?
  1549  			// The spec doesn't mention this case, but
  1550  			// hang up on them anyway.
  1551  			return ConnectionError(ErrCodeProtocol)
  1552  		}
  1553  		return nil
  1554  	}
  1555  	if f.NumSettings() > 100 || f.HasDuplicates() {
  1556  		// This isn't actually in the spec, but hang up on
  1557  		// suspiciously large settings frames or those with
  1558  		// duplicate entries.
  1559  		return ConnectionError(ErrCodeProtocol)
  1560  	}
  1561  	if err := f.ForeachSetting(sc.processSetting); err != nil {
  1562  		return err
  1563  	}
  1564  	// TODO: judging by RFC 7540, Section 6.5.3 each SETTINGS frame should be
  1565  	// acknowledged individually, even if multiple are received before the ACK.
  1566  	sc.needToSendSettingsAck = true
  1567  	sc.scheduleFrameWrite()
  1568  	return nil
  1569  }
  1570  
  1571  func (sc *serverConn) processSetting(s Setting) error {
  1572  	sc.serveG.check()
  1573  	if err := s.Valid(); err != nil {
  1574  		return err
  1575  	}
  1576  	if VerboseLogs {
  1577  		sc.vlogf("http2: server processing setting %v", s)
  1578  	}
  1579  	switch s.ID {
  1580  	case SettingHeaderTableSize:
  1581  		sc.headerTableSize = s.Val
  1582  		sc.hpackEncoder.SetMaxDynamicTableSize(s.Val)
  1583  	case SettingEnablePush:
  1584  		sc.pushEnabled = s.Val != 0
  1585  	case SettingMaxConcurrentStreams:
  1586  		sc.clientMaxStreams = s.Val
  1587  	case SettingInitialWindowSize:
  1588  		return sc.processSettingInitialWindowSize(s.Val)
  1589  	case SettingMaxFrameSize:
  1590  		sc.maxFrameSize = int32(s.Val) // the maximum valid s.Val is < 2^31
  1591  	case SettingMaxHeaderListSize:
  1592  		sc.peerMaxHeaderListSize = s.Val
  1593  	default:
  1594  		// Unknown setting: "An endpoint that receives a SETTINGS
  1595  		// frame with any unknown or unsupported identifier MUST
  1596  		// ignore that setting."
  1597  		if VerboseLogs {
  1598  			sc.vlogf("http2: server ignoring unknown setting %v", s)
  1599  		}
  1600  	}
  1601  	return nil
  1602  }
  1603  
  1604  func (sc *serverConn) processSettingInitialWindowSize(val uint32) error {
  1605  	sc.serveG.check()
  1606  	// Note: val already validated to be within range by
  1607  	// processSetting's Valid call.
  1608  
  1609  	// "A SETTINGS frame can alter the initial flow control window
  1610  	// size for all current streams. When the value of
  1611  	// SETTINGS_INITIAL_WINDOW_SIZE changes, a receiver MUST
  1612  	// adjust the size of all stream flow control windows that it
  1613  	// maintains by the difference between the new value and the
  1614  	// old value."
  1615  	old := sc.initialStreamSendWindowSize
  1616  	sc.initialStreamSendWindowSize = int32(val)
  1617  	growth := int32(val) - old // may be negative
  1618  	for _, st := range sc.streams {
  1619  		if !st.flow.add(growth) {
  1620  			// 6.9.2 Initial Flow Control Window Size
  1621  			// "An endpoint MUST treat a change to
  1622  			// SETTINGS_INITIAL_WINDOW_SIZE that causes any flow
  1623  			// control window to exceed the maximum size as a
  1624  			// connection error (Section 5.4.1) of type
  1625  			// FLOW_CONTROL_ERROR."
  1626  			return ConnectionError(ErrCodeFlowControl)
  1627  		}
  1628  	}
  1629  	return nil
  1630  }
  1631  
  1632  func (sc *serverConn) processData(f *DataFrame) error {
  1633  	sc.serveG.check()
  1634  	if sc.inGoAway && sc.goAwayCode != ErrCodeNo {
  1635  		return nil
  1636  	}
  1637  	data := f.Data()
  1638  
  1639  	// "If a DATA frame is received whose stream is not in "open"
  1640  	// or "half closed (local)" state, the recipient MUST respond
  1641  	// with a stream error (Section 5.4.2) of type STREAM_CLOSED."
  1642  	id := f.Header().StreamID
  1643  	state, st := sc.state(id)
  1644  	if id == 0 || state == stateIdle {
  1645  		// Section 5.1: "Receiving any frame other than HEADERS
  1646  		// or PRIORITY on a stream in this state MUST be
  1647  		// treated as a connection error (Section 5.4.1) of
  1648  		// type PROTOCOL_ERROR."
  1649  		return ConnectionError(ErrCodeProtocol)
  1650  	}
  1651  	if st == nil || state != stateOpen || st.gotTrailerHeader || st.resetQueued {
  1652  		// This includes sending a RST_STREAM if the stream is
  1653  		// in stateHalfClosedLocal (which currently means that
  1654  		// the http.Handler returned, so it's done reading &
  1655  		// done writing). Try to stop the client from sending
  1656  		// more DATA.
  1657  
  1658  		// But still enforce their connection-level flow control,
  1659  		// and return any flow control bytes since we're not going
  1660  		// to consume them.
  1661  		if sc.inflow.available() < int32(f.Length) {
  1662  			return streamError(id, ErrCodeFlowControl)
  1663  		}
  1664  		// Deduct the flow control from inflow, since we're
  1665  		// going to immediately add it back in
  1666  		// sendWindowUpdate, which also schedules sending the
  1667  		// frames.
  1668  		sc.inflow.take(int32(f.Length))
  1669  		sc.sendWindowUpdate(nil, int(f.Length)) // conn-level
  1670  
  1671  		if st != nil && st.resetQueued {
  1672  			// Already have a stream error in flight. Don't send another.
  1673  			return nil
  1674  		}
  1675  		return streamError(id, ErrCodeStreamClosed)
  1676  	}
  1677  	if st.body == nil {
  1678  		panic("internal error: should have a body in this state")
  1679  	}
  1680  
  1681  	// Sender sending more than they'd declared?
  1682  	if st.declBodyBytes != -1 && st.bodyBytes+int64(len(data)) > st.declBodyBytes {
  1683  		st.body.CloseWithError(fmt.Errorf("sender tried to send more than declared Content-Length of %d bytes", st.declBodyBytes))
  1684  		// RFC 7540, sec 8.1.2.6: A request or response is also malformed if the
  1685  		// value of a content-length header field does not equal the sum of the
  1686  		// DATA frame payload lengths that form the body.
  1687  		return streamError(id, ErrCodeProtocol)
  1688  	}
  1689  	if f.Length > 0 {
  1690  		// Check whether the client has flow control quota.
  1691  		if st.inflow.available() < int32(f.Length) {
  1692  			return streamError(id, ErrCodeFlowControl)
  1693  		}
  1694  		st.inflow.take(int32(f.Length))
  1695  
  1696  		if len(data) > 0 {
  1697  			wrote, err := st.body.Write(data)
  1698  			if err != nil {
  1699  				return streamError(id, ErrCodeStreamClosed)
  1700  			}
  1701  			if wrote != len(data) {
  1702  				panic("internal error: bad Writer")
  1703  			}
  1704  			st.bodyBytes += int64(len(data))
  1705  		}
  1706  
  1707  		// Return any padded flow control now, since we won't
  1708  		// refund it later on body reads.
  1709  		if pad := int32(f.Length) - int32(len(data)); pad > 0 {
  1710  			sc.sendWindowUpdate32(nil, pad)
  1711  			sc.sendWindowUpdate32(st, pad)
  1712  		}
  1713  	}
  1714  	if f.StreamEnded() {
  1715  		st.endStream()
  1716  	}
  1717  	return nil
  1718  }
  1719  
  1720  func (sc *serverConn) processGoAway(f *GoAwayFrame) error {
  1721  	sc.serveG.check()
  1722  	if f.ErrCode != ErrCodeNo {
  1723  		sc.logf("http2: received GOAWAY %+v, starting graceful shutdown", f)
  1724  	} else {
  1725  		sc.vlogf("http2: received GOAWAY %+v, starting graceful shutdown", f)
  1726  	}
  1727  	sc.startGracefulShutdownInternal()
  1728  	// http://tools.ietf.org/html/rfc7540#section-6.8
  1729  	// We should not create any new streams, which means we should disable push.
  1730  	sc.pushEnabled = false
  1731  	return nil
  1732  }
  1733  
  1734  // isPushed reports whether the stream is server-initiated.
  1735  func (st *stream) isPushed() bool {
  1736  	return st.id%2 == 0
  1737  }
  1738  
  1739  // endStream closes a Request.Body's pipe. It is called when a DATA
  1740  // frame says a request body is over (or after trailers).
  1741  func (st *stream) endStream() {
  1742  	sc := st.sc
  1743  	sc.serveG.check()
  1744  
  1745  	if st.declBodyBytes != -1 && st.declBodyBytes != st.bodyBytes {
  1746  		st.body.CloseWithError(fmt.Errorf("request declared a Content-Length of %d but only wrote %d bytes",
  1747  			st.declBodyBytes, st.bodyBytes))
  1748  	} else {
  1749  		st.body.closeWithErrorAndCode(io.EOF, st.copyTrailersToHandlerRequest)
  1750  		st.body.CloseWithError(io.EOF)
  1751  	}
  1752  	st.state = stateHalfClosedRemote
  1753  }
  1754  
  1755  // copyTrailersToHandlerRequest is run in the Handler's goroutine in
  1756  // its Request.Body.Read just before it gets io.EOF.
  1757  func (st *stream) copyTrailersToHandlerRequest() {
  1758  	for k, vv := range st.trailer {
  1759  		if _, ok := st.reqTrailer[k]; ok {
  1760  			// Only copy it over it was pre-declared.
  1761  			st.reqTrailer[k] = vv
  1762  		}
  1763  	}
  1764  }
  1765  
  1766  // onWriteTimeout is run on its own goroutine (from time.AfterFunc)
  1767  // when the stream's WriteTimeout has fired.
  1768  func (st *stream) onWriteTimeout() {
  1769  	st.sc.writeFrameFromHandler(FrameWriteRequest{write: streamError(st.id, ErrCodeInternal)})
  1770  }
  1771  
  1772  func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error {
  1773  	sc.serveG.check()
  1774  	id := f.StreamID
  1775  	if sc.inGoAway {
  1776  		// Ignore.
  1777  		return nil
  1778  	}
  1779  	// http://tools.ietf.org/html/rfc7540#section-5.1.1
  1780  	// Streams initiated by a client MUST use odd-numbered stream
  1781  	// identifiers. [...] An endpoint that receives an unexpected
  1782  	// stream identifier MUST respond with a connection error
  1783  	// (Section 5.4.1) of type PROTOCOL_ERROR.
  1784  	if id%2 != 1 {
  1785  		return ConnectionError(ErrCodeProtocol)
  1786  	}
  1787  	// A HEADERS frame can be used to create a new stream or
  1788  	// send a trailer for an open one. If we already have a stream
  1789  	// open, let it process its own HEADERS frame (trailers at this
  1790  	// point, if it's valid).
  1791  	if st := sc.streams[f.StreamID]; st != nil {
  1792  		if st.resetQueued {
  1793  			// We're sending RST_STREAM to close the stream, so don't bother
  1794  			// processing this frame.
  1795  			return nil
  1796  		}
  1797  		// RFC 7540, sec 5.1: If an endpoint receives additional frames, other than
  1798  		// WINDOW_UPDATE, PRIORITY, or RST_STREAM, for a stream that is in
  1799  		// this state, it MUST respond with a stream error (Section 5.4.2) of
  1800  		// type STREAM_CLOSED.
  1801  		if st.state == stateHalfClosedRemote {
  1802  			return streamError(id, ErrCodeStreamClosed)
  1803  		}
  1804  		return st.processTrailerHeaders(f)
  1805  	}
  1806  
  1807  	// [...] The identifier of a newly established stream MUST be
  1808  	// numerically greater than all streams that the initiating
  1809  	// endpoint has opened or reserved. [...]  An endpoint that
  1810  	// receives an unexpected stream identifier MUST respond with
  1811  	// a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
  1812  	if id <= sc.maxClientStreamID {
  1813  		return ConnectionError(ErrCodeProtocol)
  1814  	}
  1815  	sc.maxClientStreamID = id
  1816  
  1817  	if sc.idleTimer != nil {
  1818  		sc.idleTimer.Stop()
  1819  	}
  1820  
  1821  	// http://tools.ietf.org/html/rfc7540#section-5.1.2
  1822  	// [...] Endpoints MUST NOT exceed the limit set by their peer. An
  1823  	// endpoint that receives a HEADERS frame that causes their
  1824  	// advertised concurrent stream limit to be exceeded MUST treat
  1825  	// this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR
  1826  	// or REFUSED_STREAM.
  1827  	if sc.curClientStreams+1 > sc.advMaxStreams {
  1828  		if sc.unackedSettings == 0 {
  1829  			// They should know better.
  1830  			return streamError(id, ErrCodeProtocol)
  1831  		}
  1832  		// Assume it's a network race, where they just haven't
  1833  		// received our last SETTINGS update. But actually
  1834  		// this can't happen yet, because we don't yet provide
  1835  		// a way for users to adjust server parameters at
  1836  		// runtime.
  1837  		return streamError(id, ErrCodeRefusedStream)
  1838  	}
  1839  
  1840  	initialState := stateOpen
  1841  	if f.StreamEnded() {
  1842  		initialState = stateHalfClosedRemote
  1843  	}
  1844  	st := sc.newStream(id, 0, initialState)
  1845  
  1846  	if f.HasPriority() {
  1847  		if err := checkPriority(f.StreamID, f.Priority); err != nil {
  1848  			return err
  1849  		}
  1850  		sc.writeSched.AdjustStream(st.id, f.Priority)
  1851  	}
  1852  
  1853  	rw, req, err := sc.newWriterAndRequest(st, f)
  1854  	if err != nil {
  1855  		return err
  1856  	}
  1857  	st.reqTrailer = req.Trailer
  1858  	if st.reqTrailer != nil {
  1859  		st.trailer = make(http.Header)
  1860  	}
  1861  	st.body = req.Body.(*requestBody).pipe // may be nil
  1862  	st.declBodyBytes = req.ContentLength
  1863  
  1864  	handler := sc.handler.ServeHTTP
  1865  	if f.Truncated {
  1866  		// Their header list was too long. Send a 431 error.
  1867  		handler = handleHeaderListTooLong
  1868  	} else if err := checkValidHTTP2RequestHeaders(req.Header); err != nil {
  1869  		handler = new400Handler(err)
  1870  	}
  1871  
  1872  	// The net/http package sets the read deadline from the
  1873  	// http.Server.ReadTimeout during the TLS handshake, but then
  1874  	// passes the connection off to us with the deadline already
  1875  	// set. Disarm it here after the request headers are read,
  1876  	// similar to how the http1 server works. Here it's
  1877  	// technically more like the http1 Server's ReadHeaderTimeout
  1878  	// (in Go 1.8), though. That's a more sane option anyway.
  1879  	if sc.hs.ReadTimeout != 0 {
  1880  		sc.conn.SetReadDeadline(time.Time{})
  1881  	}
  1882  
  1883  	go sc.runHandler(rw, req, handler)
  1884  	return nil
  1885  }
  1886  
  1887  func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error {
  1888  	sc := st.sc
  1889  	sc.serveG.check()
  1890  	if st.gotTrailerHeader {
  1891  		return ConnectionError(ErrCodeProtocol)
  1892  	}
  1893  	st.gotTrailerHeader = true
  1894  	if !f.StreamEnded() {
  1895  		return streamError(st.id, ErrCodeProtocol)
  1896  	}
  1897  
  1898  	if len(f.PseudoFields()) > 0 {
  1899  		return streamError(st.id, ErrCodeProtocol)
  1900  	}
  1901  	if st.trailer != nil {
  1902  		for _, hf := range f.RegularFields() {
  1903  			key := sc.canonicalHeader(hf.Name)
  1904  			if !httpguts.ValidTrailerHeader(key) {
  1905  				// TODO: send more details to the peer somehow. But http2 has
  1906  				// no way to send debug data at a stream level. Discuss with
  1907  				// HTTP folk.
  1908  				return streamError(st.id, ErrCodeProtocol)
  1909  			}
  1910  			st.trailer[key] = append(st.trailer[key], hf.Value)
  1911  		}
  1912  	}
  1913  	st.endStream()
  1914  	return nil
  1915  }
  1916  
  1917  func checkPriority(streamID uint32, p PriorityParam) error {
  1918  	if streamID == p.StreamDep {
  1919  		// Section 5.3.1: "A stream cannot depend on itself. An endpoint MUST treat
  1920  		// this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR."
  1921  		// Section 5.3.3 says that a stream can depend on one of its dependencies,
  1922  		// so it's only self-dependencies that are forbidden.
  1923  		return streamError(streamID, ErrCodeProtocol)
  1924  	}
  1925  	return nil
  1926  }
  1927  
  1928  func (sc *serverConn) processPriority(f *PriorityFrame) error {
  1929  	if sc.inGoAway {
  1930  		return nil
  1931  	}
  1932  	if err := checkPriority(f.StreamID, f.PriorityParam); err != nil {
  1933  		return err
  1934  	}
  1935  	sc.writeSched.AdjustStream(f.StreamID, f.PriorityParam)
  1936  	return nil
  1937  }
  1938  
  1939  func (sc *serverConn) newStream(id, pusherID uint32, state streamState) *stream {
  1940  	sc.serveG.check()
  1941  	if id == 0 {
  1942  		panic("internal error: cannot create stream with id 0")
  1943  	}
  1944  
  1945  	ctx, cancelCtx := context.WithCancel(sc.baseCtx)
  1946  	st := &stream{
  1947  		sc:        sc,
  1948  		id:        id,
  1949  		state:     state,
  1950  		ctx:       ctx,
  1951  		cancelCtx: cancelCtx,
  1952  	}
  1953  	st.cw.Init()
  1954  	st.flow.conn = &sc.flow // link to conn-level counter
  1955  	st.flow.add(sc.initialStreamSendWindowSize)
  1956  	st.inflow.conn = &sc.inflow // link to conn-level counter
  1957  	st.inflow.add(sc.srv.initialStreamRecvWindowSize())
  1958  	if sc.hs.WriteTimeout != 0 {
  1959  		st.writeDeadline = time.AfterFunc(sc.hs.WriteTimeout, st.onWriteTimeout)
  1960  	}
  1961  
  1962  	sc.streams[id] = st
  1963  	sc.writeSched.OpenStream(st.id, OpenStreamOptions{PusherID: pusherID})
  1964  	if st.isPushed() {
  1965  		sc.curPushedStreams++
  1966  	} else {
  1967  		sc.curClientStreams++
  1968  	}
  1969  	if sc.curOpenStreams() == 1 {
  1970  		sc.setConnState(http.StateActive)
  1971  	}
  1972  
  1973  	return st
  1974  }
  1975  
  1976  func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*responseWriter, *http.Request, error) {
  1977  	sc.serveG.check()
  1978  
  1979  	rp := requestParam{
  1980  		method:    f.PseudoValue("method"),
  1981  		scheme:    f.PseudoValue("scheme"),
  1982  		authority: f.PseudoValue("authority"),
  1983  		path:      f.PseudoValue("path"),
  1984  	}
  1985  
  1986  	isConnect := rp.method == "CONNECT"
  1987  	if isConnect {
  1988  		if rp.path != "" || rp.scheme != "" || rp.authority == "" {
  1989  			return nil, nil, streamError(f.StreamID, ErrCodeProtocol)
  1990  		}
  1991  	} else if rp.method == "" || rp.path == "" || (rp.scheme != "https" && rp.scheme != "http") {
  1992  		// See 8.1.2.6 Malformed Requests and Responses:
  1993  		//
  1994  		// Malformed requests or responses that are detected
  1995  		// MUST be treated as a stream error (Section 5.4.2)
  1996  		// of type PROTOCOL_ERROR."
  1997  		//
  1998  		// 8.1.2.3 Request Pseudo-Header Fields
  1999  		// "All HTTP/2 requests MUST include exactly one valid
  2000  		// value for the :method, :scheme, and :path
  2001  		// pseudo-header fields"
  2002  		return nil, nil, streamError(f.StreamID, ErrCodeProtocol)
  2003  	}
  2004  
  2005  	bodyOpen := !f.StreamEnded()
  2006  	if rp.method == "HEAD" && bodyOpen {
  2007  		// HEAD requests can't have bodies
  2008  		return nil, nil, streamError(f.StreamID, ErrCodeProtocol)
  2009  	}
  2010  
  2011  	rp.header = make(http.Header)
  2012  	for _, hf := range f.RegularFields() {
  2013  		rp.header.Add(sc.canonicalHeader(hf.Name), hf.Value)
  2014  	}
  2015  	if rp.authority == "" {
  2016  		rp.authority = rp.header.Get("Host")
  2017  	}
  2018  
  2019  	rw, req, err := sc.newWriterAndRequestNoBody(st, rp)
  2020  	if err != nil {
  2021  		return nil, nil, err
  2022  	}
  2023  	if bodyOpen {
  2024  		if vv, ok := rp.header["Content-Length"]; ok {
  2025  			req.ContentLength, _ = strconv.ParseInt(vv[0], 10, 64)
  2026  		} else {
  2027  			req.ContentLength = -1
  2028  		}
  2029  		req.Body.(*requestBody).pipe = &pipe{
  2030  			b: &dataBuffer{expected: req.ContentLength},
  2031  		}
  2032  	}
  2033  	return rw, req, nil
  2034  }
  2035  
  2036  type requestParam struct {
  2037  	method                  string
  2038  	scheme, authority, path string
  2039  	header                  http.Header
  2040  }
  2041  
  2042  func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*responseWriter, *http.Request, error) {
  2043  	sc.serveG.check()
  2044  
  2045  	var tlsState *tls.ConnectionState // nil if not scheme https
  2046  	if rp.scheme == "https" {
  2047  		tlsState = sc.tlsState
  2048  	}
  2049  
  2050  	needsContinue := rp.header.Get("Expect") == "100-continue"
  2051  	if needsContinue {
  2052  		rp.header.Del("Expect")
  2053  	}
  2054  	// Merge Cookie headers into one "; "-delimited value.
  2055  	if cookies := rp.header["Cookie"]; len(cookies) > 1 {
  2056  		rp.header.Set("Cookie", strings.Join(cookies, "; "))
  2057  	}
  2058  
  2059  	// Setup Trailers
  2060  	var trailer http.Header
  2061  	for _, v := range rp.header["Trailer"] {
  2062  		for _, key := range strings.Split(v, ",") {
  2063  			key = http.CanonicalHeaderKey(strings.TrimSpace(key))
  2064  			switch key {
  2065  			case "Transfer-Encoding", "Trailer", "Content-Length":
  2066  				// Bogus. (copy of http1 rules)
  2067  				// Ignore.
  2068  			default:
  2069  				if trailer == nil {
  2070  					trailer = make(http.Header)
  2071  				}
  2072  				trailer[key] = nil
  2073  			}
  2074  		}
  2075  	}
  2076  	delete(rp.header, "Trailer")
  2077  
  2078  	var url_ *url.URL
  2079  	var requestURI string
  2080  	if rp.method == "CONNECT" {
  2081  		url_ = &url.URL{Host: rp.authority}
  2082  		requestURI = rp.authority // mimic HTTP/1 server behavior
  2083  	} else {
  2084  		var err error
  2085  		url_, err = url.ParseRequestURI(rp.path)
  2086  		if err != nil {
  2087  			return nil, nil, streamError(st.id, ErrCodeProtocol)
  2088  		}
  2089  		requestURI = rp.path
  2090  	}
  2091  
  2092  	body := &requestBody{
  2093  		conn:          sc,
  2094  		stream:        st,
  2095  		needsContinue: needsContinue,
  2096  	}
  2097  	req := &http.Request{
  2098  		Method:     rp.method,
  2099  		URL:        url_,
  2100  		RemoteAddr: sc.remoteAddrStr,
  2101  		Header:     rp.header,
  2102  		RequestURI: requestURI,
  2103  		Proto:      "HTTP/2.0",
  2104  		ProtoMajor: 2,
  2105  		ProtoMinor: 0,
  2106  		TLS:        tlsState,
  2107  		Host:       rp.authority,
  2108  		Body:       body,
  2109  		Trailer:    trailer,
  2110  	}
  2111  	req = req.WithContext(st.ctx)
  2112  
  2113  	rws := responseWriterStatePool.Get().(*responseWriterState)
  2114  	bwSave := rws.bw
  2115  	*rws = responseWriterState{} // zero all the fields
  2116  	rws.conn = sc
  2117  	rws.bw = bwSave
  2118  	rws.bw.Reset(chunkWriter{rws})
  2119  	rws.stream = st
  2120  	rws.req = req
  2121  	rws.body = body
  2122  
  2123  	rw := &responseWriter{rws: rws}
  2124  	return rw, req, nil
  2125  }
  2126  
  2127  // Run on its own goroutine.
  2128  func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) {
  2129  	didPanic := true
  2130  	defer func() {
  2131  		rw.rws.stream.cancelCtx()
  2132  		if didPanic {
  2133  			e := recover()
  2134  			sc.writeFrameFromHandler(FrameWriteRequest{
  2135  				write:  handlerPanicRST{rw.rws.stream.id},
  2136  				stream: rw.rws.stream,
  2137  			})
  2138  			// Same as net/http:
  2139  			if e != nil && e != http.ErrAbortHandler {
  2140  				const size = 64 << 10
  2141  				buf := make([]byte, size)
  2142  				buf = buf[:runtime.Stack(buf, false)]
  2143  				sc.logf("http2: panic serving %v: %v\n%s", sc.conn.RemoteAddr(), e, buf)
  2144  			}
  2145  			return
  2146  		}
  2147  		rw.handlerDone()
  2148  	}()
  2149  	handler(rw, req)
  2150  	didPanic = false
  2151  }
  2152  
  2153  func handleHeaderListTooLong(w http.ResponseWriter, r *http.Request) {
  2154  	// 10.5.1 Limits on Header Block Size:
  2155  	// .. "A server that receives a larger header block than it is
  2156  	// willing to handle can send an HTTP 431 (Request Header Fields Too
  2157  	// Large) status code"
  2158  	const statusRequestHeaderFieldsTooLarge = 431 // only in Go 1.6+
  2159  	w.WriteHeader(statusRequestHeaderFieldsTooLarge)
  2160  	io.WriteString(w, "<h1>HTTP Error 431</h1><p>Request Header Field(s) Too Large</p>")
  2161  }
  2162  
  2163  // called from handler goroutines.
  2164  // h may be nil.
  2165  func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) error {
  2166  	sc.serveG.checkNotOn() // NOT on
  2167  	var errc chan error
  2168  	if headerData.h != nil {
  2169  		// If there's a header map (which we don't own), so we have to block on
  2170  		// waiting for this frame to be written, so an http.Flush mid-handler
  2171  		// writes out the correct value of keys, before a handler later potentially
  2172  		// mutates it.
  2173  		errc = errChanPool.Get().(chan error)
  2174  	}
  2175  	if err := sc.writeFrameFromHandler(FrameWriteRequest{
  2176  		write:  headerData,
  2177  		stream: st,
  2178  		done:   errc,
  2179  	}); err != nil {
  2180  		return err
  2181  	}
  2182  	if errc != nil {
  2183  		select {
  2184  		case err := <-errc:
  2185  			errChanPool.Put(errc)
  2186  			return err
  2187  		case <-sc.doneServing:
  2188  			return errClientDisconnected
  2189  		case <-st.cw:
  2190  			return errStreamClosed
  2191  		}
  2192  	}
  2193  	return nil
  2194  }
  2195  
  2196  // called from handler goroutines.
  2197  func (sc *serverConn) write100ContinueHeaders(st *stream) {
  2198  	sc.writeFrameFromHandler(FrameWriteRequest{
  2199  		write:  write100ContinueHeadersFrame{st.id},
  2200  		stream: st,
  2201  	})
  2202  }
  2203  
  2204  // A bodyReadMsg tells the server loop that the http.Handler read n
  2205  // bytes of the DATA from the client on the given stream.
  2206  type bodyReadMsg struct {
  2207  	st *stream
  2208  	n  int
  2209  }
  2210  
  2211  // called from handler goroutines.
  2212  // Notes that the handler for the given stream ID read n bytes of its body
  2213  // and schedules flow control tokens to be sent.
  2214  func (sc *serverConn) noteBodyReadFromHandler(st *stream, n int, err error) {
  2215  	sc.serveG.checkNotOn() // NOT on
  2216  	if n > 0 {
  2217  		select {
  2218  		case sc.bodyReadCh <- bodyReadMsg{st, n}:
  2219  		case <-sc.doneServing:
  2220  		}
  2221  	}
  2222  }
  2223  
  2224  func (sc *serverConn) noteBodyRead(st *stream, n int) {
  2225  	sc.serveG.check()
  2226  	sc.sendWindowUpdate(nil, n) // conn-level
  2227  	if st.state != stateHalfClosedRemote && st.state != stateClosed {
  2228  		// Don't send this WINDOW_UPDATE if the stream is closed
  2229  		// remotely.
  2230  		sc.sendWindowUpdate(st, n)
  2231  	}
  2232  }
  2233  
  2234  // st may be nil for conn-level
  2235  func (sc *serverConn) sendWindowUpdate(st *stream, n int) {
  2236  	sc.serveG.check()
  2237  	// "The legal range for the increment to the flow control
  2238  	// window is 1 to 2^31-1 (2,147,483,647) octets."
  2239  	// A Go Read call on 64-bit machines could in theory read
  2240  	// a larger Read than this. Very unlikely, but we handle it here
  2241  	// rather than elsewhere for now.
  2242  	const maxUint31 = 1<<31 - 1
  2243  	for n >= maxUint31 {
  2244  		sc.sendWindowUpdate32(st, maxUint31)
  2245  		n -= maxUint31
  2246  	}
  2247  	sc.sendWindowUpdate32(st, int32(n))
  2248  }
  2249  
  2250  // st may be nil for conn-level
  2251  func (sc *serverConn) sendWindowUpdate32(st *stream, n int32) {
  2252  	sc.serveG.check()
  2253  	if n == 0 {
  2254  		return
  2255  	}
  2256  	if n < 0 {
  2257  		panic("negative update")
  2258  	}
  2259  	var streamID uint32
  2260  	if st != nil {
  2261  		streamID = st.id
  2262  	}
  2263  	sc.writeFrame(FrameWriteRequest{
  2264  		write:  writeWindowUpdate{streamID: streamID, n: uint32(n)},
  2265  		stream: st,
  2266  	})
  2267  	var ok bool
  2268  	if st == nil {
  2269  		ok = sc.inflow.add(n)
  2270  	} else {
  2271  		ok = st.inflow.add(n)
  2272  	}
  2273  	if !ok {
  2274  		panic("internal error; sent too many window updates without decrements?")
  2275  	}
  2276  }
  2277  
  2278  // requestBody is the Handler's Request.Body type.
  2279  // Read and Close may be called concurrently.
  2280  type requestBody struct {
  2281  	stream        *stream
  2282  	conn          *serverConn
  2283  	closed        bool  // for use by Close only
  2284  	sawEOF        bool  // for use by Read only
  2285  	pipe          *pipe // non-nil if we have a HTTP entity message body
  2286  	needsContinue bool  // need to send a 100-continue
  2287  }
  2288  
  2289  func (b *requestBody) Close() error {
  2290  	if b.pipe != nil && !b.closed {
  2291  		b.pipe.BreakWithError(errClosedBody)
  2292  	}
  2293  	b.closed = true
  2294  	return nil
  2295  }
  2296  
  2297  func (b *requestBody) Read(p []byte) (n int, err error) {
  2298  	if b.needsContinue {
  2299  		b.needsContinue = false
  2300  		b.conn.write100ContinueHeaders(b.stream)
  2301  	}
  2302  	if b.pipe == nil || b.sawEOF {
  2303  		return 0, io.EOF
  2304  	}
  2305  	n, err = b.pipe.Read(p)
  2306  	if err == io.EOF {
  2307  		b.sawEOF = true
  2308  	}
  2309  	if b.conn == nil && inTests {
  2310  		return
  2311  	}
  2312  	b.conn.noteBodyReadFromHandler(b.stream, n, err)
  2313  	return
  2314  }
  2315  
  2316  // responseWriter is the http.ResponseWriter implementation. It's
  2317  // intentionally small (1 pointer wide) to minimize garbage. The
  2318  // responseWriterState pointer inside is zeroed at the end of a
  2319  // request (in handlerDone) and calls on the responseWriter thereafter
  2320  // simply crash (caller's mistake), but the much larger responseWriterState
  2321  // and buffers are reused between multiple requests.
  2322  type responseWriter struct {
  2323  	rws *responseWriterState
  2324  }
  2325  
  2326  // Optional http.ResponseWriter interfaces implemented.
  2327  var (
  2328  	_ http.CloseNotifier = (*responseWriter)(nil)
  2329  	_ http.Flusher       = (*responseWriter)(nil)
  2330  	_ stringWriter       = (*responseWriter)(nil)
  2331  )
  2332  
  2333  type responseWriterState struct {
  2334  	// immutable within a request:
  2335  	stream *stream
  2336  	req    *http.Request
  2337  	body   *requestBody // to close at end of request, if DATA frames didn't
  2338  	conn   *serverConn
  2339  
  2340  	// TODO: adjust buffer writing sizes based on server config, frame size updates from peer, etc
  2341  	bw *bufio.Writer // writing to a chunkWriter{this *responseWriterState}
  2342  
  2343  	// mutated by http.Handler goroutine:
  2344  	handlerHeader http.Header // nil until called
  2345  	snapHeader    http.Header // snapshot of handlerHeader at WriteHeader time
  2346  	trailers      []string    // set in writeChunk
  2347  	status        int         // status code passed to WriteHeader
  2348  	wroteHeader   bool        // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet.
  2349  	sentHeader    bool        // have we sent the header frame?
  2350  	handlerDone   bool        // handler has finished
  2351  	dirty         bool        // a Write failed; don't reuse this responseWriterState
  2352  
  2353  	sentContentLen int64 // non-zero if handler set a Content-Length header
  2354  	wroteBytes     int64
  2355  
  2356  	closeNotifierMu sync.Mutex // guards closeNotifierCh
  2357  	closeNotifierCh chan bool  // nil until first used
  2358  }
  2359  
  2360  type chunkWriter struct{ rws *responseWriterState }
  2361  
  2362  func (cw chunkWriter) Write(p []byte) (n int, err error) { return cw.rws.writeChunk(p) }
  2363  
  2364  func (rws *responseWriterState) hasTrailers() bool { return len(rws.trailers) > 0 }
  2365  
  2366  func (rws *responseWriterState) hasNonemptyTrailers() bool {
  2367  	for _, trailer := range rws.trailers {
  2368  		if _, ok := rws.handlerHeader[trailer]; ok {
  2369  			return true
  2370  		}
  2371  	}
  2372  	return false
  2373  }
  2374  
  2375  // declareTrailer is called for each Trailer header when the
  2376  // response header is written. It notes that a header will need to be
  2377  // written in the trailers at the end of the response.
  2378  func (rws *responseWriterState) declareTrailer(k string) {
  2379  	k = http.CanonicalHeaderKey(k)
  2380  	if !httpguts.ValidTrailerHeader(k) {
  2381  		// Forbidden by RFC 7230, section 4.1.2.
  2382  		rws.conn.logf("ignoring invalid trailer %q", k)
  2383  		return
  2384  	}
  2385  	if !strSliceContains(rws.trailers, k) {
  2386  		rws.trailers = append(rws.trailers, k)
  2387  	}
  2388  }
  2389  
  2390  // writeChunk writes chunks from the bufio.Writer. But because
  2391  // bufio.Writer may bypass its chunking, sometimes p may be
  2392  // arbitrarily large.
  2393  //
  2394  // writeChunk is also responsible (on the first chunk) for sending the
  2395  // HEADER response.
  2396  func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) {
  2397  	if !rws.wroteHeader {
  2398  		rws.writeHeader(200)
  2399  	}
  2400  
  2401  	isHeadResp := rws.req.Method == "HEAD"
  2402  	if !rws.sentHeader {
  2403  		rws.sentHeader = true
  2404  		var ctype, clen string
  2405  		if clen = rws.snapHeader.Get("Content-Length"); clen != "" {
  2406  			rws.snapHeader.Del("Content-Length")
  2407  			clen64, err := strconv.ParseInt(clen, 10, 64)
  2408  			if err == nil && clen64 >= 0 {
  2409  				rws.sentContentLen = clen64
  2410  			} else {
  2411  				clen = ""
  2412  			}
  2413  		}
  2414  		if clen == "" && rws.handlerDone && bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) {
  2415  			clen = strconv.Itoa(len(p))
  2416  		}
  2417  		_, hasContentType := rws.snapHeader["Content-Type"]
  2418  		if !hasContentType && bodyAllowedForStatus(rws.status) && len(p) > 0 {
  2419  			ctype = http.DetectContentType(p)
  2420  		}
  2421  		var date string
  2422  		if _, ok := rws.snapHeader["Date"]; !ok {
  2423  			// TODO(bradfitz): be faster here, like net/http? measure.
  2424  			date = time.Now().UTC().Format(http.TimeFormat)
  2425  		}
  2426  
  2427  		for _, v := range rws.snapHeader["Trailer"] {
  2428  			foreachHeaderElement(v, rws.declareTrailer)
  2429  		}
  2430  
  2431  		// "Connection" headers aren't allowed in HTTP/2 (RFC 7540, 8.1.2.2),
  2432  		// but respect "Connection" == "close" to mean sending a GOAWAY and tearing
  2433  		// down the TCP connection when idle, like we do for HTTP/1.
  2434  		// TODO: remove more Connection-specific header fields here, in addition
  2435  		// to "Connection".
  2436  		if _, ok := rws.snapHeader["Connection"]; ok {
  2437  			v := rws.snapHeader.Get("Connection")
  2438  			delete(rws.snapHeader, "Connection")
  2439  			if v == "close" {
  2440  				rws.conn.startGracefulShutdown()
  2441  			}
  2442  		}
  2443  
  2444  		endStream := (rws.handlerDone && !rws.hasTrailers() && len(p) == 0) || isHeadResp
  2445  		err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{
  2446  			streamID:      rws.stream.id,
  2447  			httpResCode:   rws.status,
  2448  			h:             rws.snapHeader,
  2449  			endStream:     endStream,
  2450  			contentType:   ctype,
  2451  			contentLength: clen,
  2452  			date:          date,
  2453  		})
  2454  		if err != nil {
  2455  			rws.dirty = true
  2456  			return 0, err
  2457  		}
  2458  		if endStream {
  2459  			return 0, nil
  2460  		}
  2461  	}
  2462  	if isHeadResp {
  2463  		return len(p), nil
  2464  	}
  2465  	if len(p) == 0 && !rws.handlerDone {
  2466  		return 0, nil
  2467  	}
  2468  
  2469  	if rws.handlerDone {
  2470  		rws.promoteUndeclaredTrailers()
  2471  	}
  2472  
  2473  	// only send trailers if they have actually been defined by the
  2474  	// server handler.
  2475  	hasNonemptyTrailers := rws.hasNonemptyTrailers()
  2476  	endStream := rws.handlerDone && !hasNonemptyTrailers
  2477  	if len(p) > 0 || endStream {
  2478  		// only send a 0 byte DATA frame if we're ending the stream.
  2479  		if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil {
  2480  			rws.dirty = true
  2481  			return 0, err
  2482  		}
  2483  	}
  2484  
  2485  	if rws.handlerDone && hasNonemptyTrailers {
  2486  		err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{
  2487  			streamID:  rws.stream.id,
  2488  			h:         rws.handlerHeader,
  2489  			trailers:  rws.trailers,
  2490  			endStream: true,
  2491  		})
  2492  		if err != nil {
  2493  			rws.dirty = true
  2494  		}
  2495  		return len(p), err
  2496  	}
  2497  	return len(p), nil
  2498  }
  2499  
  2500  // TrailerPrefix is a magic prefix for ResponseWriter.Header map keys
  2501  // that, if present, signals that the map entry is actually for
  2502  // the response trailers, and not the response headers. The prefix
  2503  // is stripped after the ServeHTTP call finishes and the values are
  2504  // sent in the trailers.
  2505  //
  2506  // This mechanism is intended only for trailers that are not known
  2507  // prior to the headers being written. If the set of trailers is fixed
  2508  // or known before the header is written, the normal Go trailers mechanism
  2509  // is preferred:
  2510  //    https://golang.org/pkg/net/http/#ResponseWriter
  2511  //    https://golang.org/pkg/net/http/#example_ResponseWriter_trailers
  2512  const TrailerPrefix = "Trailer:"
  2513  
  2514  // promoteUndeclaredTrailers permits http.Handlers to set trailers
  2515  // after the header has already been flushed. Because the Go
  2516  // ResponseWriter interface has no way to set Trailers (only the
  2517  // Header), and because we didn't want to expand the ResponseWriter
  2518  // interface, and because nobody used trailers, and because RFC 7230
  2519  // says you SHOULD (but not must) predeclare any trailers in the
  2520  // header, the official ResponseWriter rules said trailers in Go must
  2521  // be predeclared, and then we reuse the same ResponseWriter.Header()
  2522  // map to mean both Headers and Trailers. When it's time to write the
  2523  // Trailers, we pick out the fields of Headers that were declared as
  2524  // trailers. That worked for a while, until we found the first major
  2525  // user of Trailers in the wild: gRPC (using them only over http2),
  2526  // and gRPC libraries permit setting trailers mid-stream without
  2527  // predeclarnig them. So: change of plans. We still permit the old
  2528  // way, but we also permit this hack: if a Header() key begins with
  2529  // "Trailer:", the suffix of that key is a Trailer. Because ':' is an
  2530  // invalid token byte anyway, there is no ambiguity. (And it's already
  2531  // filtered out) It's mildly hacky, but not terrible.
  2532  //
  2533  // This method runs after the Handler is done and promotes any Header
  2534  // fields to be trailers.
  2535  func (rws *responseWriterState) promoteUndeclaredTrailers() {
  2536  	for k, vv := range rws.handlerHeader {
  2537  		if !strings.HasPrefix(k, TrailerPrefix) {
  2538  			continue
  2539  		}
  2540  		trailerKey := strings.TrimPrefix(k, TrailerPrefix)
  2541  		rws.declareTrailer(trailerKey)
  2542  		rws.handlerHeader[http.CanonicalHeaderKey(trailerKey)] = vv
  2543  	}
  2544  
  2545  	if len(rws.trailers) > 1 {
  2546  		sorter := sorterPool.Get().(*sorter)
  2547  		sorter.SortStrings(rws.trailers)
  2548  		sorterPool.Put(sorter)
  2549  	}
  2550  }
  2551  
  2552  func (w *responseWriter) Flush() {
  2553  	rws := w.rws
  2554  	if rws == nil {
  2555  		panic("Header called after Handler finished")
  2556  	}
  2557  	if rws.bw.Buffered() > 0 {
  2558  		if err := rws.bw.Flush(); err != nil {
  2559  			// Ignore the error. The frame writer already knows.
  2560  			return
  2561  		}
  2562  	} else {
  2563  		// The bufio.Writer won't call chunkWriter.Write
  2564  		// (writeChunk with zero bytes, so we have to do it
  2565  		// ourselves to force the HTTP response header and/or
  2566  		// final DATA frame (with END_STREAM) to be sent.
  2567  		rws.writeChunk(nil)
  2568  	}
  2569  }
  2570  
  2571  func (w *responseWriter) CloseNotify() <-chan bool {
  2572  	rws := w.rws
  2573  	if rws == nil {
  2574  		panic("CloseNotify called after Handler finished")
  2575  	}
  2576  	rws.closeNotifierMu.Lock()
  2577  	ch := rws.closeNotifierCh
  2578  	if ch == nil {
  2579  		ch = make(chan bool, 1)
  2580  		rws.closeNotifierCh = ch
  2581  		cw := rws.stream.cw
  2582  		go func() {
  2583  			cw.Wait() // wait for close
  2584  			ch <- true
  2585  		}()
  2586  	}
  2587  	rws.closeNotifierMu.Unlock()
  2588  	return ch
  2589  }
  2590  
  2591  func (w *responseWriter) Header() http.Header {
  2592  	rws := w.rws
  2593  	if rws == nil {
  2594  		panic("Header called after Handler finished")
  2595  	}
  2596  	if rws.handlerHeader == nil {
  2597  		rws.handlerHeader = make(http.Header)
  2598  	}
  2599  	return rws.handlerHeader
  2600  }
  2601  
  2602  // checkWriteHeaderCode is a copy of net/http's checkWriteHeaderCode.
  2603  func checkWriteHeaderCode(code int) {
  2604  	// Issue 22880: require valid WriteHeader status codes.
  2605  	// For now we only enforce that it's three digits.
  2606  	// In the future we might block things over 599 (600 and above aren't defined
  2607  	// at http://httpwg.org/specs/rfc7231.html#status.codes)
  2608  	// and we might block under 200 (once we have more mature 1xx support).
  2609  	// But for now any three digits.
  2610  	//
  2611  	// We used to send "HTTP/1.1 000 0" on the wire in responses but there's
  2612  	// no equivalent bogus thing we can realistically send in HTTP/2,
  2613  	// so we'll consistently panic instead and help people find their bugs
  2614  	// early. (We can't return an error from WriteHeader even if we wanted to.)
  2615  	if code < 100 || code > 999 {
  2616  		panic(fmt.Sprintf("invalid WriteHeader code %v", code))
  2617  	}
  2618  }
  2619  
  2620  func (w *responseWriter) WriteHeader(code int) {
  2621  	rws := w.rws
  2622  	if rws == nil {
  2623  		panic("WriteHeader called after Handler finished")
  2624  	}
  2625  	rws.writeHeader(code)
  2626  }
  2627  
  2628  func (rws *responseWriterState) writeHeader(code int) {
  2629  	if !rws.wroteHeader {
  2630  		checkWriteHeaderCode(code)
  2631  		rws.wroteHeader = true
  2632  		rws.status = code
  2633  		if len(rws.handlerHeader) > 0 {
  2634  			rws.snapHeader = cloneHeader(rws.handlerHeader)
  2635  		}
  2636  	}
  2637  }
  2638  
  2639  func cloneHeader(h http.Header) http.Header {
  2640  	h2 := make(http.Header, len(h))
  2641  	for k, vv := range h {
  2642  		vv2 := make([]string, len(vv))
  2643  		copy(vv2, vv)
  2644  		h2[k] = vv2
  2645  	}
  2646  	return h2
  2647  }
  2648  
  2649  // The Life Of A Write is like this:
  2650  //
  2651  // * Handler calls w.Write or w.WriteString ->
  2652  // * -> rws.bw (*bufio.Writer) ->
  2653  // * (Handler might call Flush)
  2654  // * -> chunkWriter{rws}
  2655  // * -> responseWriterState.writeChunk(p []byte)
  2656  // * -> responseWriterState.writeChunk (most of the magic; see comment there)
  2657  func (w *responseWriter) Write(p []byte) (n int, err error) {
  2658  	return w.write(len(p), p, "")
  2659  }
  2660  
  2661  func (w *responseWriter) WriteString(s string) (n int, err error) {
  2662  	return w.write(len(s), nil, s)
  2663  }
  2664  
  2665  // either dataB or dataS is non-zero.
  2666  func (w *responseWriter) write(lenData int, dataB []byte, dataS string) (n int, err error) {
  2667  	rws := w.rws
  2668  	if rws == nil {
  2669  		panic("Write called after Handler finished")
  2670  	}
  2671  	if !rws.wroteHeader {
  2672  		w.WriteHeader(200)
  2673  	}
  2674  	if !bodyAllowedForStatus(rws.status) {
  2675  		return 0, http.ErrBodyNotAllowed
  2676  	}
  2677  	rws.wroteBytes += int64(len(dataB)) + int64(len(dataS)) // only one can be set
  2678  	if rws.sentContentLen != 0 && rws.wroteBytes > rws.sentContentLen {
  2679  		// TODO: send a RST_STREAM
  2680  		return 0, errors.New("http2: handler wrote more than declared Content-Length")
  2681  	}
  2682  
  2683  	if dataB != nil {
  2684  		return rws.bw.Write(dataB)
  2685  	} else {
  2686  		return rws.bw.WriteString(dataS)
  2687  	}
  2688  }
  2689  
  2690  func (w *responseWriter) handlerDone() {
  2691  	rws := w.rws
  2692  	dirty := rws.dirty
  2693  	rws.handlerDone = true
  2694  	w.Flush()
  2695  	w.rws = nil
  2696  	if !dirty {
  2697  		// Only recycle the pool if all prior Write calls to
  2698  		// the serverConn goroutine completed successfully. If
  2699  		// they returned earlier due to resets from the peer
  2700  		// there might still be write goroutines outstanding
  2701  		// from the serverConn referencing the rws memory. See
  2702  		// issue 20704.
  2703  		responseWriterStatePool.Put(rws)
  2704  	}
  2705  }
  2706  
  2707  // Push errors.
  2708  var (
  2709  	ErrRecursivePush    = errors.New("http2: recursive push not allowed")
  2710  	ErrPushLimitReached = errors.New("http2: push would exceed peer's SETTINGS_MAX_CONCURRENT_STREAMS")
  2711  )
  2712  
  2713  var _ http.Pusher = (*responseWriter)(nil)
  2714  
  2715  func (w *responseWriter) Push(target string, opts *http.PushOptions) error {
  2716  	st := w.rws.stream
  2717  	sc := st.sc
  2718  	sc.serveG.checkNotOn()
  2719  
  2720  	// No recursive pushes: "PUSH_PROMISE frames MUST only be sent on a peer-initiated stream."
  2721  	// http://tools.ietf.org/html/rfc7540#section-6.6
  2722  	if st.isPushed() {
  2723  		return ErrRecursivePush
  2724  	}
  2725  
  2726  	if opts == nil {
  2727  		opts = new(http.PushOptions)
  2728  	}
  2729  
  2730  	// Default options.
  2731  	if opts.Method == "" {
  2732  		opts.Method = "GET"
  2733  	}
  2734  	if opts.Header == nil {
  2735  		opts.Header = http.Header{}
  2736  	}
  2737  	wantScheme := "http"
  2738  	if w.rws.req.TLS != nil {
  2739  		wantScheme = "https"
  2740  	}
  2741  
  2742  	// Validate the request.
  2743  	u, err := url.Parse(target)
  2744  	if err != nil {
  2745  		return err
  2746  	}
  2747  	if u.Scheme == "" {
  2748  		if !strings.HasPrefix(target, "/") {
  2749  			return fmt.Errorf("target must be an absolute URL or an absolute path: %q", target)
  2750  		}
  2751  		u.Scheme = wantScheme
  2752  		u.Host = w.rws.req.Host
  2753  	} else {
  2754  		if u.Scheme != wantScheme {
  2755  			return fmt.Errorf("cannot push URL with scheme %q from request with scheme %q", u.Scheme, wantScheme)
  2756  		}
  2757  		if u.Host == "" {
  2758  			return errors.New("URL must have a host")
  2759  		}
  2760  	}
  2761  	for k := range opts.Header {
  2762  		if strings.HasPrefix(k, ":") {
  2763  			return fmt.Errorf("promised request headers cannot include pseudo header %q", k)
  2764  		}
  2765  		// These headers are meaningful only if the request has a body,
  2766  		// but PUSH_PROMISE requests cannot have a body.
  2767  		// http://tools.ietf.org/html/rfc7540#section-8.2
  2768  		// Also disallow Host, since the promised URL must be absolute.
  2769  		switch strings.ToLower(k) {
  2770  		case "content-length", "content-encoding", "trailer", "te", "expect", "host":
  2771  			return fmt.Errorf("promised request headers cannot include %q", k)
  2772  		}
  2773  	}
  2774  	if err := checkValidHTTP2RequestHeaders(opts.Header); err != nil {
  2775  		return err
  2776  	}
  2777  
  2778  	// The RFC effectively limits promised requests to GET and HEAD:
  2779  	// "Promised requests MUST be cacheable [GET, HEAD, or POST], and MUST be safe [GET or HEAD]"
  2780  	// http://tools.ietf.org/html/rfc7540#section-8.2
  2781  	if opts.Method != "GET" && opts.Method != "HEAD" {
  2782  		return fmt.Errorf("method %q must be GET or HEAD", opts.Method)
  2783  	}
  2784  
  2785  	msg := &startPushRequest{
  2786  		parent: st,
  2787  		method: opts.Method,
  2788  		url:    u,
  2789  		header: cloneHeader(opts.Header),
  2790  		done:   errChanPool.Get().(chan error),
  2791  	}
  2792  
  2793  	select {
  2794  	case <-sc.doneServing:
  2795  		return errClientDisconnected
  2796  	case <-st.cw:
  2797  		return errStreamClosed
  2798  	case sc.serveMsgCh <- msg:
  2799  	}
  2800  
  2801  	select {
  2802  	case <-sc.doneServing:
  2803  		return errClientDisconnected
  2804  	case <-st.cw:
  2805  		return errStreamClosed
  2806  	case err := <-msg.done:
  2807  		errChanPool.Put(msg.done)
  2808  		return err
  2809  	}
  2810  }
  2811  
  2812  type startPushRequest struct {
  2813  	parent *stream
  2814  	method string
  2815  	url    *url.URL
  2816  	header http.Header
  2817  	done   chan error
  2818  }
  2819  
  2820  func (sc *serverConn) startPush(msg *startPushRequest) {
  2821  	sc.serveG.check()
  2822  
  2823  	// http://tools.ietf.org/html/rfc7540#section-6.6.
  2824  	// PUSH_PROMISE frames MUST only be sent on a peer-initiated stream that
  2825  	// is in either the "open" or "half-closed (remote)" state.
  2826  	if msg.parent.state != stateOpen && msg.parent.state != stateHalfClosedRemote {
  2827  		// responseWriter.Push checks that the stream is peer-initiaed.
  2828  		msg.done <- errStreamClosed
  2829  		return
  2830  	}
  2831  
  2832  	// http://tools.ietf.org/html/rfc7540#section-6.6.
  2833  	if !sc.pushEnabled {
  2834  		msg.done <- http.ErrNotSupported
  2835  		return
  2836  	}
  2837  
  2838  	// PUSH_PROMISE frames must be sent in increasing order by stream ID, so
  2839  	// we allocate an ID for the promised stream lazily, when the PUSH_PROMISE
  2840  	// is written. Once the ID is allocated, we start the request handler.
  2841  	allocatePromisedID := func() (uint32, error) {
  2842  		sc.serveG.check()
  2843  
  2844  		// Check this again, just in case. Technically, we might have received
  2845  		// an updated SETTINGS by the time we got around to writing this frame.
  2846  		if !sc.pushEnabled {
  2847  			return 0, http.ErrNotSupported
  2848  		}
  2849  		// http://tools.ietf.org/html/rfc7540#section-6.5.2.
  2850  		if sc.curPushedStreams+1 > sc.clientMaxStreams {
  2851  			return 0, ErrPushLimitReached
  2852  		}
  2853  
  2854  		// http://tools.ietf.org/html/rfc7540#section-5.1.1.
  2855  		// Streams initiated by the server MUST use even-numbered identifiers.
  2856  		// A server that is unable to establish a new stream identifier can send a GOAWAY
  2857  		// frame so that the client is forced to open a new connection for new streams.
  2858  		if sc.maxPushPromiseID+2 >= 1<<31 {
  2859  			sc.startGracefulShutdownInternal()
  2860  			return 0, ErrPushLimitReached
  2861  		}
  2862  		sc.maxPushPromiseID += 2
  2863  		promisedID := sc.maxPushPromiseID
  2864  
  2865  		// http://tools.ietf.org/html/rfc7540#section-8.2.
  2866  		// Strictly speaking, the new stream should start in "reserved (local)", then
  2867  		// transition to "half closed (remote)" after sending the initial HEADERS, but
  2868  		// we start in "half closed (remote)" for simplicity.
  2869  		// See further comments at the definition of stateHalfClosedRemote.
  2870  		promised := sc.newStream(promisedID, msg.parent.id, stateHalfClosedRemote)
  2871  		rw, req, err := sc.newWriterAndRequestNoBody(promised, requestParam{
  2872  			method:    msg.method,
  2873  			scheme:    msg.url.Scheme,
  2874  			authority: msg.url.Host,
  2875  			path:      msg.url.RequestURI(),
  2876  			header:    cloneHeader(msg.header), // clone since handler runs concurrently with writing the PUSH_PROMISE
  2877  		})
  2878  		if err != nil {
  2879  			// Should not happen, since we've already validated msg.url.
  2880  			panic(fmt.Sprintf("newWriterAndRequestNoBody(%+v): %v", msg.url, err))
  2881  		}
  2882  
  2883  		go sc.runHandler(rw, req, sc.handler.ServeHTTP)
  2884  		return promisedID, nil
  2885  	}
  2886  
  2887  	sc.writeFrame(FrameWriteRequest{
  2888  		write: &writePushPromise{
  2889  			streamID:           msg.parent.id,
  2890  			method:             msg.method,
  2891  			url:                msg.url,
  2892  			h:                  msg.header,
  2893  			allocatePromisedID: allocatePromisedID,
  2894  		},
  2895  		stream: msg.parent,
  2896  		done:   msg.done,
  2897  	})
  2898  }
  2899  
  2900  // foreachHeaderElement splits v according to the "#rule" construction
  2901  // in RFC 7230 section 7 and calls fn for each non-empty element.
  2902  func foreachHeaderElement(v string, fn func(string)) {
  2903  	v = textproto.TrimString(v)
  2904  	if v == "" {
  2905  		return
  2906  	}
  2907  	if !strings.Contains(v, ",") {
  2908  		fn(v)
  2909  		return
  2910  	}
  2911  	for _, f := range strings.Split(v, ",") {
  2912  		if f = textproto.TrimString(f); f != "" {
  2913  			fn(f)
  2914  		}
  2915  	}
  2916  }
  2917  
  2918  // From http://httpwg.org/specs/rfc7540.html#rfc.section.8.1.2.2
  2919  var connHeaders = []string{
  2920  	"Connection",
  2921  	"Keep-Alive",
  2922  	"Proxy-Connection",
  2923  	"Transfer-Encoding",
  2924  	"Upgrade",
  2925  }
  2926  
  2927  // checkValidHTTP2RequestHeaders checks whether h is a valid HTTP/2 request,
  2928  // per RFC 7540 Section 8.1.2.2.
  2929  // The returned error is reported to users.
  2930  func checkValidHTTP2RequestHeaders(h http.Header) error {
  2931  	for _, k := range connHeaders {
  2932  		if _, ok := h[k]; ok {
  2933  			return fmt.Errorf("request header %q is not valid in HTTP/2", k)
  2934  		}
  2935  	}
  2936  	te := h["Te"]
  2937  	if len(te) > 0 && (len(te) > 1 || (te[0] != "trailers" && te[0] != "")) {
  2938  		return errors.New(`request header "TE" may only be "trailers" in HTTP/2`)
  2939  	}
  2940  	return nil
  2941  }
  2942  
  2943  func new400Handler(err error) http.HandlerFunc {
  2944  	return func(w http.ResponseWriter, r *http.Request) {
  2945  		http.Error(w, err.Error(), http.StatusBadRequest)
  2946  	}
  2947  }
  2948  
  2949  // h1ServerKeepAlivesDisabled reports whether hs has its keep-alives
  2950  // disabled. See comments on h1ServerShutdownChan above for why
  2951  // the code is written this way.
  2952  func h1ServerKeepAlivesDisabled(hs *http.Server) bool {
  2953  	var x interface{} = hs
  2954  	type I interface {
  2955  		doKeepAlives() bool
  2956  	}
  2957  	if hs, ok := x.(I); ok {
  2958  		return !hs.doKeepAlives()
  2959  	}
  2960  	return false
  2961  }