github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/net/http2/server_test.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  package http2
     6  
     7  import (
     8  	"bytes"
     9  	"crypto/tls"
    10  	"errors"
    11  	"flag"
    12  	"fmt"
    13  	"io"
    14  	"io/ioutil"
    15  	"log"
    16  	"net"
    17  	"net/http"
    18  	"net/http/httptest"
    19  	"os"
    20  	"os/exec"
    21  	"reflect"
    22  	"runtime"
    23  	"strconv"
    24  	"strings"
    25  	"sync"
    26  	"sync/atomic"
    27  	"testing"
    28  	"time"
    29  
    30  	"golang.org/x/net/http2/hpack"
    31  )
    32  
    33  var stderrVerbose = flag.Bool("stderr_verbose", false, "Mirror verbosity to stderr, unbuffered")
    34  
    35  func stderrv() io.Writer {
    36  	if *stderrVerbose {
    37  		return os.Stderr
    38  	}
    39  
    40  	return ioutil.Discard
    41  }
    42  
    43  type serverTester struct {
    44  	cc             net.Conn // client conn
    45  	t              testing.TB
    46  	ts             *httptest.Server
    47  	fr             *Framer
    48  	logBuf         *bytes.Buffer
    49  	logFilter      []string   // substrings to filter out
    50  	scMu           sync.Mutex // guards sc
    51  	sc             *serverConn
    52  	hpackDec       *hpack.Decoder
    53  	decodedHeaders [][2]string
    54  
    55  	// writing headers:
    56  	headerBuf bytes.Buffer
    57  	hpackEnc  *hpack.Encoder
    58  
    59  	// reading frames:
    60  	frc       chan Frame
    61  	frErrc    chan error
    62  	readTimer *time.Timer
    63  }
    64  
    65  func init() {
    66  	testHookOnPanicMu = new(sync.Mutex)
    67  }
    68  
    69  func resetHooks() {
    70  	testHookOnPanicMu.Lock()
    71  	testHookOnPanic = nil
    72  	testHookOnPanicMu.Unlock()
    73  }
    74  
    75  type serverTesterOpt string
    76  
    77  var optOnlyServer = serverTesterOpt("only_server")
    78  
    79  func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{}) *serverTester {
    80  	resetHooks()
    81  
    82  	logBuf := new(bytes.Buffer)
    83  	ts := httptest.NewUnstartedServer(handler)
    84  
    85  	tlsConfig := &tls.Config{
    86  		InsecureSkipVerify: true,
    87  		// The h2-14 is temporary, until curl is updated. (as used by unit tests
    88  		// in Docker)
    89  		NextProtos: []string{NextProtoTLS, "h2-14"},
    90  	}
    91  
    92  	onlyServer := false
    93  	for _, opt := range opts {
    94  		switch v := opt.(type) {
    95  		case func(*tls.Config):
    96  			v(tlsConfig)
    97  		case func(*httptest.Server):
    98  			v(ts)
    99  		case serverTesterOpt:
   100  			onlyServer = (v == optOnlyServer)
   101  		default:
   102  			t.Fatalf("unknown newServerTester option type %T", v)
   103  		}
   104  	}
   105  
   106  	ConfigureServer(ts.Config, &Server{})
   107  
   108  	st := &serverTester{
   109  		t:      t,
   110  		ts:     ts,
   111  		logBuf: logBuf,
   112  		frc:    make(chan Frame, 1),
   113  		frErrc: make(chan error, 1),
   114  	}
   115  	st.hpackEnc = hpack.NewEncoder(&st.headerBuf)
   116  	st.hpackDec = hpack.NewDecoder(initialHeaderTableSize, st.onHeaderField)
   117  
   118  	ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config
   119  	ts.Config.ErrorLog = log.New(io.MultiWriter(stderrv(), twriter{t: t, st: st}, logBuf), "", log.LstdFlags)
   120  	ts.StartTLS()
   121  
   122  	if VerboseLogs {
   123  		t.Logf("Running test server at: %s", ts.URL)
   124  	}
   125  	testHookGetServerConn = func(v *serverConn) {
   126  		st.scMu.Lock()
   127  		defer st.scMu.Unlock()
   128  		st.sc = v
   129  		st.sc.testHookCh = make(chan func(int))
   130  	}
   131  	log.SetOutput(io.MultiWriter(stderrv(), twriter{t: t, st: st}))
   132  	if !onlyServer {
   133  		cc, err := tls.Dial("tcp", ts.Listener.Addr().String(), tlsConfig)
   134  		if err != nil {
   135  			t.Fatal(err)
   136  		}
   137  		st.cc = cc
   138  		st.fr = NewFramer(cc, cc)
   139  	}
   140  	return st
   141  }
   142  
   143  func (st *serverTester) closeConn() {
   144  	st.scMu.Lock()
   145  	defer st.scMu.Unlock()
   146  	st.sc.conn.Close()
   147  }
   148  
   149  func (st *serverTester) addLogFilter(phrase string) {
   150  	st.logFilter = append(st.logFilter, phrase)
   151  }
   152  
   153  func (st *serverTester) stream(id uint32) *stream {
   154  	ch := make(chan *stream, 1)
   155  	st.sc.testHookCh <- func(int) {
   156  		ch <- st.sc.streams[id]
   157  	}
   158  	return <-ch
   159  }
   160  
   161  func (st *serverTester) streamState(id uint32) streamState {
   162  	ch := make(chan streamState, 1)
   163  	st.sc.testHookCh <- func(int) {
   164  		state, _ := st.sc.state(id)
   165  		ch <- state
   166  	}
   167  	return <-ch
   168  }
   169  
   170  // loopNum reports how many times this conn's select loop has gone around.
   171  func (st *serverTester) loopNum() int {
   172  	lastc := make(chan int, 1)
   173  	st.sc.testHookCh <- func(loopNum int) {
   174  		lastc <- loopNum
   175  	}
   176  	return <-lastc
   177  }
   178  
   179  // awaitIdle heuristically awaits for the server conn's select loop to be idle.
   180  // The heuristic is that the server connection's serve loop must schedule
   181  // 50 times in a row without any channel sends or receives occuring.
   182  func (st *serverTester) awaitIdle() {
   183  	remain := 50
   184  	last := st.loopNum()
   185  	for remain > 0 {
   186  		n := st.loopNum()
   187  		if n == last+1 {
   188  			remain--
   189  		} else {
   190  			remain = 50
   191  		}
   192  		last = n
   193  	}
   194  }
   195  
   196  func (st *serverTester) Close() {
   197  	st.ts.Close()
   198  	if st.cc != nil {
   199  		st.cc.Close()
   200  	}
   201  	log.SetOutput(os.Stderr)
   202  }
   203  
   204  // greet initiates the client's HTTP/2 connection into a state where
   205  // frames may be sent.
   206  func (st *serverTester) greet() {
   207  	st.writePreface()
   208  	st.writeInitialSettings()
   209  	st.wantSettings()
   210  	st.writeSettingsAck()
   211  	st.wantSettingsAck()
   212  }
   213  
   214  func (st *serverTester) writePreface() {
   215  	n, err := st.cc.Write(clientPreface)
   216  	if err != nil {
   217  		st.t.Fatalf("Error writing client preface: %v", err)
   218  	}
   219  	if n != len(clientPreface) {
   220  		st.t.Fatalf("Writing client preface, wrote %d bytes; want %d", n, len(clientPreface))
   221  	}
   222  }
   223  
   224  func (st *serverTester) writeInitialSettings() {
   225  	if err := st.fr.WriteSettings(); err != nil {
   226  		st.t.Fatalf("Error writing initial SETTINGS frame from client to server: %v", err)
   227  	}
   228  }
   229  
   230  func (st *serverTester) writeSettingsAck() {
   231  	if err := st.fr.WriteSettingsAck(); err != nil {
   232  		st.t.Fatalf("Error writing ACK of server's SETTINGS: %v", err)
   233  	}
   234  }
   235  
   236  func (st *serverTester) writeHeaders(p HeadersFrameParam) {
   237  	if err := st.fr.WriteHeaders(p); err != nil {
   238  		st.t.Fatalf("Error writing HEADERS: %v", err)
   239  	}
   240  }
   241  
   242  func (st *serverTester) encodeHeaderField(k, v string) {
   243  	err := st.hpackEnc.WriteField(hpack.HeaderField{Name: k, Value: v})
   244  	if err != nil {
   245  		st.t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err)
   246  	}
   247  }
   248  
   249  // encodeHeaderRaw is the magic-free version of encodeHeader.
   250  // It takes 0 or more (k, v) pairs and encodes them.
   251  func (st *serverTester) encodeHeaderRaw(headers ...string) []byte {
   252  	if len(headers)%2 == 1 {
   253  		panic("odd number of kv args")
   254  	}
   255  	st.headerBuf.Reset()
   256  	for len(headers) > 0 {
   257  		k, v := headers[0], headers[1]
   258  		st.encodeHeaderField(k, v)
   259  		headers = headers[2:]
   260  	}
   261  	return st.headerBuf.Bytes()
   262  }
   263  
   264  // encodeHeader encodes headers and returns their HPACK bytes. headers
   265  // must contain an even number of key/value pairs.  There may be
   266  // multiple pairs for keys (e.g. "cookie").  The :method, :path, and
   267  // :scheme headers default to GET, / and https.
   268  func (st *serverTester) encodeHeader(headers ...string) []byte {
   269  	if len(headers)%2 == 1 {
   270  		panic("odd number of kv args")
   271  	}
   272  
   273  	st.headerBuf.Reset()
   274  
   275  	if len(headers) == 0 {
   276  		// Fast path, mostly for benchmarks, so test code doesn't pollute
   277  		// profiles when we're looking to improve server allocations.
   278  		st.encodeHeaderField(":method", "GET")
   279  		st.encodeHeaderField(":path", "/")
   280  		st.encodeHeaderField(":scheme", "https")
   281  		return st.headerBuf.Bytes()
   282  	}
   283  
   284  	if len(headers) == 2 && headers[0] == ":method" {
   285  		// Another fast path for benchmarks.
   286  		st.encodeHeaderField(":method", headers[1])
   287  		st.encodeHeaderField(":path", "/")
   288  		st.encodeHeaderField(":scheme", "https")
   289  		return st.headerBuf.Bytes()
   290  	}
   291  
   292  	pseudoCount := map[string]int{}
   293  	keys := []string{":method", ":path", ":scheme"}
   294  	vals := map[string][]string{
   295  		":method": {"GET"},
   296  		":path":   {"/"},
   297  		":scheme": {"https"},
   298  	}
   299  	for len(headers) > 0 {
   300  		k, v := headers[0], headers[1]
   301  		headers = headers[2:]
   302  		if _, ok := vals[k]; !ok {
   303  			keys = append(keys, k)
   304  		}
   305  		if strings.HasPrefix(k, ":") {
   306  			pseudoCount[k]++
   307  			if pseudoCount[k] == 1 {
   308  				vals[k] = []string{v}
   309  			} else {
   310  				// Allows testing of invalid headers w/ dup pseudo fields.
   311  				vals[k] = append(vals[k], v)
   312  			}
   313  		} else {
   314  			vals[k] = append(vals[k], v)
   315  		}
   316  	}
   317  	for _, k := range keys {
   318  		for _, v := range vals[k] {
   319  			st.encodeHeaderField(k, v)
   320  		}
   321  	}
   322  	return st.headerBuf.Bytes()
   323  }
   324  
   325  // bodylessReq1 writes a HEADERS frames with StreamID 1 and EndStream and EndHeaders set.
   326  func (st *serverTester) bodylessReq1(headers ...string) {
   327  	st.writeHeaders(HeadersFrameParam{
   328  		StreamID:      1, // clients send odd numbers
   329  		BlockFragment: st.encodeHeader(headers...),
   330  		EndStream:     true,
   331  		EndHeaders:    true,
   332  	})
   333  }
   334  
   335  func (st *serverTester) writeData(streamID uint32, endStream bool, data []byte) {
   336  	if err := st.fr.WriteData(streamID, endStream, data); err != nil {
   337  		st.t.Fatalf("Error writing DATA: %v", err)
   338  	}
   339  }
   340  
   341  func (st *serverTester) readFrame() (Frame, error) {
   342  	go func() {
   343  		fr, err := st.fr.ReadFrame()
   344  		if err != nil {
   345  			st.frErrc <- err
   346  		} else {
   347  			st.frc <- fr
   348  		}
   349  	}()
   350  	t := st.readTimer
   351  	if t == nil {
   352  		t = time.NewTimer(2 * time.Second)
   353  		st.readTimer = t
   354  	}
   355  	t.Reset(2 * time.Second)
   356  	defer t.Stop()
   357  	select {
   358  	case f := <-st.frc:
   359  		return f, nil
   360  	case err := <-st.frErrc:
   361  		return nil, err
   362  	case <-t.C:
   363  		return nil, errors.New("timeout waiting for frame")
   364  	}
   365  }
   366  
   367  func (st *serverTester) wantHeaders() *HeadersFrame {
   368  	f, err := st.readFrame()
   369  	if err != nil {
   370  		st.t.Fatalf("Error while expecting a HEADERS frame: %v", err)
   371  	}
   372  	hf, ok := f.(*HeadersFrame)
   373  	if !ok {
   374  		st.t.Fatalf("got a %T; want *HeadersFrame", f)
   375  	}
   376  	return hf
   377  }
   378  
   379  func (st *serverTester) wantContinuation() *ContinuationFrame {
   380  	f, err := st.readFrame()
   381  	if err != nil {
   382  		st.t.Fatalf("Error while expecting a CONTINUATION frame: %v", err)
   383  	}
   384  	cf, ok := f.(*ContinuationFrame)
   385  	if !ok {
   386  		st.t.Fatalf("got a %T; want *ContinuationFrame", f)
   387  	}
   388  	return cf
   389  }
   390  
   391  func (st *serverTester) wantData() *DataFrame {
   392  	f, err := st.readFrame()
   393  	if err != nil {
   394  		st.t.Fatalf("Error while expecting a DATA frame: %v", err)
   395  	}
   396  	df, ok := f.(*DataFrame)
   397  	if !ok {
   398  		st.t.Fatalf("got a %T; want *DataFrame", f)
   399  	}
   400  	return df
   401  }
   402  
   403  func (st *serverTester) wantSettings() *SettingsFrame {
   404  	f, err := st.readFrame()
   405  	if err != nil {
   406  		st.t.Fatalf("Error while expecting a SETTINGS frame: %v", err)
   407  	}
   408  	sf, ok := f.(*SettingsFrame)
   409  	if !ok {
   410  		st.t.Fatalf("got a %T; want *SettingsFrame", f)
   411  	}
   412  	return sf
   413  }
   414  
   415  func (st *serverTester) wantPing() *PingFrame {
   416  	f, err := st.readFrame()
   417  	if err != nil {
   418  		st.t.Fatalf("Error while expecting a PING frame: %v", err)
   419  	}
   420  	pf, ok := f.(*PingFrame)
   421  	if !ok {
   422  		st.t.Fatalf("got a %T; want *PingFrame", f)
   423  	}
   424  	return pf
   425  }
   426  
   427  func (st *serverTester) wantGoAway() *GoAwayFrame {
   428  	f, err := st.readFrame()
   429  	if err != nil {
   430  		st.t.Fatalf("Error while expecting a GOAWAY frame: %v", err)
   431  	}
   432  	gf, ok := f.(*GoAwayFrame)
   433  	if !ok {
   434  		st.t.Fatalf("got a %T; want *GoAwayFrame", f)
   435  	}
   436  	return gf
   437  }
   438  
   439  func (st *serverTester) wantRSTStream(streamID uint32, errCode ErrCode) {
   440  	f, err := st.readFrame()
   441  	if err != nil {
   442  		st.t.Fatalf("Error while expecting an RSTStream frame: %v", err)
   443  	}
   444  	rs, ok := f.(*RSTStreamFrame)
   445  	if !ok {
   446  		st.t.Fatalf("got a %T; want *RSTStreamFrame", f)
   447  	}
   448  	if rs.FrameHeader.StreamID != streamID {
   449  		st.t.Fatalf("RSTStream StreamID = %d; want %d", rs.FrameHeader.StreamID, streamID)
   450  	}
   451  	if rs.ErrCode != errCode {
   452  		st.t.Fatalf("RSTStream ErrCode = %d (%s); want %d (%s)", rs.ErrCode, rs.ErrCode, errCode, errCode)
   453  	}
   454  }
   455  
   456  func (st *serverTester) wantWindowUpdate(streamID, incr uint32) {
   457  	f, err := st.readFrame()
   458  	if err != nil {
   459  		st.t.Fatalf("Error while expecting a WINDOW_UPDATE frame: %v", err)
   460  	}
   461  	wu, ok := f.(*WindowUpdateFrame)
   462  	if !ok {
   463  		st.t.Fatalf("got a %T; want *WindowUpdateFrame", f)
   464  	}
   465  	if wu.FrameHeader.StreamID != streamID {
   466  		st.t.Fatalf("WindowUpdate StreamID = %d; want %d", wu.FrameHeader.StreamID, streamID)
   467  	}
   468  	if wu.Increment != incr {
   469  		st.t.Fatalf("WindowUpdate increment = %d; want %d", wu.Increment, incr)
   470  	}
   471  }
   472  
   473  func (st *serverTester) wantSettingsAck() {
   474  	f, err := st.readFrame()
   475  	if err != nil {
   476  		st.t.Fatal(err)
   477  	}
   478  	sf, ok := f.(*SettingsFrame)
   479  	if !ok {
   480  		st.t.Fatalf("Wanting a settings ACK, received a %T", f)
   481  	}
   482  	if !sf.Header().Flags.Has(FlagSettingsAck) {
   483  		st.t.Fatal("Settings Frame didn't have ACK set")
   484  	}
   485  
   486  }
   487  
   488  func TestServer(t *testing.T) {
   489  	gotReq := make(chan bool, 1)
   490  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
   491  		w.Header().Set("Foo", "Bar")
   492  		gotReq <- true
   493  	})
   494  	defer st.Close()
   495  
   496  	covers("3.5", `
   497  		The server connection preface consists of a potentially empty
   498  		SETTINGS frame ([SETTINGS]) that MUST be the first frame the
   499  		server sends in the HTTP/2 connection.
   500  	`)
   501  
   502  	st.writePreface()
   503  	st.writeInitialSettings()
   504  	st.wantSettings()
   505  	st.writeSettingsAck()
   506  	st.wantSettingsAck()
   507  
   508  	st.writeHeaders(HeadersFrameParam{
   509  		StreamID:      1, // clients send odd numbers
   510  		BlockFragment: st.encodeHeader(),
   511  		EndStream:     true, // no DATA frames
   512  		EndHeaders:    true,
   513  	})
   514  
   515  	select {
   516  	case <-gotReq:
   517  	case <-time.After(2 * time.Second):
   518  		t.Error("timeout waiting for request")
   519  	}
   520  }
   521  
   522  func TestServer_Request_Get(t *testing.T) {
   523  	testServerRequest(t, func(st *serverTester) {
   524  		st.writeHeaders(HeadersFrameParam{
   525  			StreamID:      1, // clients send odd numbers
   526  			BlockFragment: st.encodeHeader("foo-bar", "some-value"),
   527  			EndStream:     true, // no DATA frames
   528  			EndHeaders:    true,
   529  		})
   530  	}, func(r *http.Request) {
   531  		if r.Method != "GET" {
   532  			t.Errorf("Method = %q; want GET", r.Method)
   533  		}
   534  		if r.URL.Path != "/" {
   535  			t.Errorf("URL.Path = %q; want /", r.URL.Path)
   536  		}
   537  		if r.ContentLength != 0 {
   538  			t.Errorf("ContentLength = %v; want 0", r.ContentLength)
   539  		}
   540  		if r.Close {
   541  			t.Error("Close = true; want false")
   542  		}
   543  		if !strings.Contains(r.RemoteAddr, ":") {
   544  			t.Errorf("RemoteAddr = %q; want something with a colon", r.RemoteAddr)
   545  		}
   546  		if r.Proto != "HTTP/2.0" || r.ProtoMajor != 2 || r.ProtoMinor != 0 {
   547  			t.Errorf("Proto = %q Major=%v,Minor=%v; want HTTP/2.0", r.Proto, r.ProtoMajor, r.ProtoMinor)
   548  		}
   549  		wantHeader := http.Header{
   550  			"Foo-Bar": []string{"some-value"},
   551  		}
   552  		if !reflect.DeepEqual(r.Header, wantHeader) {
   553  			t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
   554  		}
   555  		if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 {
   556  			t.Errorf("Read = %d, %v; want 0, EOF", n, err)
   557  		}
   558  	})
   559  }
   560  
   561  func TestServer_Request_Get_PathSlashes(t *testing.T) {
   562  	testServerRequest(t, func(st *serverTester) {
   563  		st.writeHeaders(HeadersFrameParam{
   564  			StreamID:      1, // clients send odd numbers
   565  			BlockFragment: st.encodeHeader(":path", "/%2f/"),
   566  			EndStream:     true, // no DATA frames
   567  			EndHeaders:    true,
   568  		})
   569  	}, func(r *http.Request) {
   570  		if r.RequestURI != "/%2f/" {
   571  			t.Errorf("RequestURI = %q; want /%%2f/", r.RequestURI)
   572  		}
   573  		if r.URL.Path != "///" {
   574  			t.Errorf("URL.Path = %q; want ///", r.URL.Path)
   575  		}
   576  	})
   577  }
   578  
   579  // TODO: add a test with EndStream=true on the HEADERS but setting a
   580  // Content-Length anyway.  Should we just omit it and force it to
   581  // zero?
   582  
   583  func TestServer_Request_Post_NoContentLength_EndStream(t *testing.T) {
   584  	testServerRequest(t, func(st *serverTester) {
   585  		st.writeHeaders(HeadersFrameParam{
   586  			StreamID:      1, // clients send odd numbers
   587  			BlockFragment: st.encodeHeader(":method", "POST"),
   588  			EndStream:     true,
   589  			EndHeaders:    true,
   590  		})
   591  	}, func(r *http.Request) {
   592  		if r.Method != "POST" {
   593  			t.Errorf("Method = %q; want POST", r.Method)
   594  		}
   595  		if r.ContentLength != 0 {
   596  			t.Errorf("ContentLength = %v; want 0", r.ContentLength)
   597  		}
   598  		if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 {
   599  			t.Errorf("Read = %d, %v; want 0, EOF", n, err)
   600  		}
   601  	})
   602  }
   603  
   604  func TestServer_Request_Post_Body_ImmediateEOF(t *testing.T) {
   605  	testBodyContents(t, -1, "", func(st *serverTester) {
   606  		st.writeHeaders(HeadersFrameParam{
   607  			StreamID:      1, // clients send odd numbers
   608  			BlockFragment: st.encodeHeader(":method", "POST"),
   609  			EndStream:     false, // to say DATA frames are coming
   610  			EndHeaders:    true,
   611  		})
   612  		st.writeData(1, true, nil) // just kidding. empty body.
   613  	})
   614  }
   615  
   616  func TestServer_Request_Post_Body_OneData(t *testing.T) {
   617  	const content = "Some content"
   618  	testBodyContents(t, -1, content, func(st *serverTester) {
   619  		st.writeHeaders(HeadersFrameParam{
   620  			StreamID:      1, // clients send odd numbers
   621  			BlockFragment: st.encodeHeader(":method", "POST"),
   622  			EndStream:     false, // to say DATA frames are coming
   623  			EndHeaders:    true,
   624  		})
   625  		st.writeData(1, true, []byte(content))
   626  	})
   627  }
   628  
   629  func TestServer_Request_Post_Body_TwoData(t *testing.T) {
   630  	const content = "Some content"
   631  	testBodyContents(t, -1, content, func(st *serverTester) {
   632  		st.writeHeaders(HeadersFrameParam{
   633  			StreamID:      1, // clients send odd numbers
   634  			BlockFragment: st.encodeHeader(":method", "POST"),
   635  			EndStream:     false, // to say DATA frames are coming
   636  			EndHeaders:    true,
   637  		})
   638  		st.writeData(1, false, []byte(content[:5]))
   639  		st.writeData(1, true, []byte(content[5:]))
   640  	})
   641  }
   642  
   643  func TestServer_Request_Post_Body_ContentLength_Correct(t *testing.T) {
   644  	const content = "Some content"
   645  	testBodyContents(t, int64(len(content)), content, func(st *serverTester) {
   646  		st.writeHeaders(HeadersFrameParam{
   647  			StreamID: 1, // clients send odd numbers
   648  			BlockFragment: st.encodeHeader(
   649  				":method", "POST",
   650  				"content-length", strconv.Itoa(len(content)),
   651  			),
   652  			EndStream:  false, // to say DATA frames are coming
   653  			EndHeaders: true,
   654  		})
   655  		st.writeData(1, true, []byte(content))
   656  	})
   657  }
   658  
   659  func TestServer_Request_Post_Body_ContentLength_TooLarge(t *testing.T) {
   660  	testBodyContentsFail(t, 3, "request declared a Content-Length of 3 but only wrote 2 bytes",
   661  		func(st *serverTester) {
   662  			st.writeHeaders(HeadersFrameParam{
   663  				StreamID: 1, // clients send odd numbers
   664  				BlockFragment: st.encodeHeader(
   665  					":method", "POST",
   666  					"content-length", "3",
   667  				),
   668  				EndStream:  false, // to say DATA frames are coming
   669  				EndHeaders: true,
   670  			})
   671  			st.writeData(1, true, []byte("12"))
   672  		})
   673  }
   674  
   675  func TestServer_Request_Post_Body_ContentLength_TooSmall(t *testing.T) {
   676  	testBodyContentsFail(t, 4, "sender tried to send more than declared Content-Length of 4 bytes",
   677  		func(st *serverTester) {
   678  			st.writeHeaders(HeadersFrameParam{
   679  				StreamID: 1, // clients send odd numbers
   680  				BlockFragment: st.encodeHeader(
   681  					":method", "POST",
   682  					"content-length", "4",
   683  				),
   684  				EndStream:  false, // to say DATA frames are coming
   685  				EndHeaders: true,
   686  			})
   687  			st.writeData(1, true, []byte("12345"))
   688  		})
   689  }
   690  
   691  func testBodyContents(t *testing.T, wantContentLength int64, wantBody string, write func(st *serverTester)) {
   692  	testServerRequest(t, write, func(r *http.Request) {
   693  		if r.Method != "POST" {
   694  			t.Errorf("Method = %q; want POST", r.Method)
   695  		}
   696  		if r.ContentLength != wantContentLength {
   697  			t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength)
   698  		}
   699  		all, err := ioutil.ReadAll(r.Body)
   700  		if err != nil {
   701  			t.Fatal(err)
   702  		}
   703  		if string(all) != wantBody {
   704  			t.Errorf("Read = %q; want %q", all, wantBody)
   705  		}
   706  		if err := r.Body.Close(); err != nil {
   707  			t.Fatalf("Close: %v", err)
   708  		}
   709  	})
   710  }
   711  
   712  func testBodyContentsFail(t *testing.T, wantContentLength int64, wantReadError string, write func(st *serverTester)) {
   713  	testServerRequest(t, write, func(r *http.Request) {
   714  		if r.Method != "POST" {
   715  			t.Errorf("Method = %q; want POST", r.Method)
   716  		}
   717  		if r.ContentLength != wantContentLength {
   718  			t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength)
   719  		}
   720  		all, err := ioutil.ReadAll(r.Body)
   721  		if err == nil {
   722  			t.Fatalf("expected an error (%q) reading from the body. Successfully read %q instead.",
   723  				wantReadError, all)
   724  		}
   725  		if !strings.Contains(err.Error(), wantReadError) {
   726  			t.Fatalf("Body.Read = %v; want substring %q", err, wantReadError)
   727  		}
   728  		if err := r.Body.Close(); err != nil {
   729  			t.Fatalf("Close: %v", err)
   730  		}
   731  	})
   732  }
   733  
   734  // Using a Host header, instead of :authority
   735  func TestServer_Request_Get_Host(t *testing.T) {
   736  	const host = "example.com"
   737  	testServerRequest(t, func(st *serverTester) {
   738  		st.writeHeaders(HeadersFrameParam{
   739  			StreamID:      1, // clients send odd numbers
   740  			BlockFragment: st.encodeHeader("host", host),
   741  			EndStream:     true,
   742  			EndHeaders:    true,
   743  		})
   744  	}, func(r *http.Request) {
   745  		if r.Host != host {
   746  			t.Errorf("Host = %q; want %q", r.Host, host)
   747  		}
   748  	})
   749  }
   750  
   751  // Using an :authority pseudo-header, instead of Host
   752  func TestServer_Request_Get_Authority(t *testing.T) {
   753  	const host = "example.com"
   754  	testServerRequest(t, func(st *serverTester) {
   755  		st.writeHeaders(HeadersFrameParam{
   756  			StreamID:      1, // clients send odd numbers
   757  			BlockFragment: st.encodeHeader(":authority", host),
   758  			EndStream:     true,
   759  			EndHeaders:    true,
   760  		})
   761  	}, func(r *http.Request) {
   762  		if r.Host != host {
   763  			t.Errorf("Host = %q; want %q", r.Host, host)
   764  		}
   765  	})
   766  }
   767  
   768  func TestServer_Request_WithContinuation(t *testing.T) {
   769  	wantHeader := http.Header{
   770  		"Foo-One":   []string{"value-one"},
   771  		"Foo-Two":   []string{"value-two"},
   772  		"Foo-Three": []string{"value-three"},
   773  	}
   774  	testServerRequest(t, func(st *serverTester) {
   775  		fullHeaders := st.encodeHeader(
   776  			"foo-one", "value-one",
   777  			"foo-two", "value-two",
   778  			"foo-three", "value-three",
   779  		)
   780  		remain := fullHeaders
   781  		chunks := 0
   782  		for len(remain) > 0 {
   783  			const maxChunkSize = 5
   784  			chunk := remain
   785  			if len(chunk) > maxChunkSize {
   786  				chunk = chunk[:maxChunkSize]
   787  			}
   788  			remain = remain[len(chunk):]
   789  
   790  			if chunks == 0 {
   791  				st.writeHeaders(HeadersFrameParam{
   792  					StreamID:      1, // clients send odd numbers
   793  					BlockFragment: chunk,
   794  					EndStream:     true,  // no DATA frames
   795  					EndHeaders:    false, // we'll have continuation frames
   796  				})
   797  			} else {
   798  				err := st.fr.WriteContinuation(1, len(remain) == 0, chunk)
   799  				if err != nil {
   800  					t.Fatal(err)
   801  				}
   802  			}
   803  			chunks++
   804  		}
   805  		if chunks < 2 {
   806  			t.Fatal("too few chunks")
   807  		}
   808  	}, func(r *http.Request) {
   809  		if !reflect.DeepEqual(r.Header, wantHeader) {
   810  			t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
   811  		}
   812  	})
   813  }
   814  
   815  // Concatenated cookie headers. ("8.1.2.5 Compressing the Cookie Header Field")
   816  func TestServer_Request_CookieConcat(t *testing.T) {
   817  	const host = "example.com"
   818  	testServerRequest(t, func(st *serverTester) {
   819  		st.bodylessReq1(
   820  			":authority", host,
   821  			"cookie", "a=b",
   822  			"cookie", "c=d",
   823  			"cookie", "e=f",
   824  		)
   825  	}, func(r *http.Request) {
   826  		const want = "a=b; c=d; e=f"
   827  		if got := r.Header.Get("Cookie"); got != want {
   828  			t.Errorf("Cookie = %q; want %q", got, want)
   829  		}
   830  	})
   831  }
   832  
   833  func TestServer_Request_Reject_CapitalHeader(t *testing.T) {
   834  	testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("UPPER", "v") })
   835  }
   836  
   837  func TestServer_Request_Reject_Pseudo_Missing_method(t *testing.T) {
   838  	testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "") })
   839  }
   840  
   841  func TestServer_Request_Reject_Pseudo_ExactlyOne(t *testing.T) {
   842  	// 8.1.2.3 Request Pseudo-Header Fields
   843  	// "All HTTP/2 requests MUST include exactly one valid value" ...
   844  	testRejectRequest(t, func(st *serverTester) {
   845  		st.addLogFilter("duplicate pseudo-header")
   846  		st.bodylessReq1(":method", "GET", ":method", "POST")
   847  	})
   848  }
   849  
   850  func TestServer_Request_Reject_Pseudo_AfterRegular(t *testing.T) {
   851  	// 8.1.2.3 Request Pseudo-Header Fields
   852  	// "All pseudo-header fields MUST appear in the header block
   853  	// before regular header fields. Any request or response that
   854  	// contains a pseudo-header field that appears in a header
   855  	// block after a regular header field MUST be treated as
   856  	// malformed (Section 8.1.2.6)."
   857  	testRejectRequest(t, func(st *serverTester) {
   858  		st.addLogFilter("pseudo-header after regular header")
   859  		var buf bytes.Buffer
   860  		enc := hpack.NewEncoder(&buf)
   861  		enc.WriteField(hpack.HeaderField{Name: ":method", Value: "GET"})
   862  		enc.WriteField(hpack.HeaderField{Name: "regular", Value: "foobar"})
   863  		enc.WriteField(hpack.HeaderField{Name: ":path", Value: "/"})
   864  		enc.WriteField(hpack.HeaderField{Name: ":scheme", Value: "https"})
   865  		st.writeHeaders(HeadersFrameParam{
   866  			StreamID:      1, // clients send odd numbers
   867  			BlockFragment: buf.Bytes(),
   868  			EndStream:     true,
   869  			EndHeaders:    true,
   870  		})
   871  	})
   872  }
   873  
   874  func TestServer_Request_Reject_Pseudo_Missing_path(t *testing.T) {
   875  	testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":path", "") })
   876  }
   877  
   878  func TestServer_Request_Reject_Pseudo_Missing_scheme(t *testing.T) {
   879  	testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "") })
   880  }
   881  
   882  func TestServer_Request_Reject_Pseudo_scheme_invalid(t *testing.T) {
   883  	testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "bogus") })
   884  }
   885  
   886  func TestServer_Request_Reject_Pseudo_Unknown(t *testing.T) {
   887  	testRejectRequest(t, func(st *serverTester) {
   888  		st.addLogFilter(`invalid pseudo-header ":unknown_thing"`)
   889  		st.bodylessReq1(":unknown_thing", "")
   890  	})
   891  }
   892  
   893  func testRejectRequest(t *testing.T, send func(*serverTester)) {
   894  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
   895  		t.Fatal("server request made it to handler; should've been rejected")
   896  	})
   897  	defer st.Close()
   898  
   899  	st.greet()
   900  	send(st)
   901  	st.wantRSTStream(1, ErrCodeProtocol)
   902  }
   903  
   904  func TestServer_Request_Connect(t *testing.T) {
   905  	testServerRequest(t, func(st *serverTester) {
   906  		st.writeHeaders(HeadersFrameParam{
   907  			StreamID: 1,
   908  			BlockFragment: st.encodeHeaderRaw(
   909  				":method", "CONNECT",
   910  				":authority", "example.com:123",
   911  			),
   912  			EndStream:  true,
   913  			EndHeaders: true,
   914  		})
   915  	}, func(r *http.Request) {
   916  		if g, w := r.Method, "CONNECT"; g != w {
   917  			t.Errorf("Method = %q; want %q", g, w)
   918  		}
   919  		if g, w := r.RequestURI, "example.com:123"; g != w {
   920  			t.Errorf("RequestURI = %q; want %q", g, w)
   921  		}
   922  		if g, w := r.URL.Host, "example.com:123"; g != w {
   923  			t.Errorf("URL.Host = %q; want %q", g, w)
   924  		}
   925  	})
   926  }
   927  
   928  func TestServer_Request_Connect_InvalidPath(t *testing.T) {
   929  	testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) {
   930  		st.writeHeaders(HeadersFrameParam{
   931  			StreamID: 1,
   932  			BlockFragment: st.encodeHeaderRaw(
   933  				":method", "CONNECT",
   934  				":authority", "example.com:123",
   935  				":path", "/bogus",
   936  			),
   937  			EndStream:  true,
   938  			EndHeaders: true,
   939  		})
   940  	})
   941  }
   942  
   943  func TestServer_Request_Connect_InvalidScheme(t *testing.T) {
   944  	testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) {
   945  		st.writeHeaders(HeadersFrameParam{
   946  			StreamID: 1,
   947  			BlockFragment: st.encodeHeaderRaw(
   948  				":method", "CONNECT",
   949  				":authority", "example.com:123",
   950  				":scheme", "https",
   951  			),
   952  			EndStream:  true,
   953  			EndHeaders: true,
   954  		})
   955  	})
   956  }
   957  
   958  func TestServer_Ping(t *testing.T) {
   959  	st := newServerTester(t, nil)
   960  	defer st.Close()
   961  	st.greet()
   962  
   963  	// Server should ignore this one, since it has ACK set.
   964  	ackPingData := [8]byte{1, 2, 4, 8, 16, 32, 64, 128}
   965  	if err := st.fr.WritePing(true, ackPingData); err != nil {
   966  		t.Fatal(err)
   967  	}
   968  
   969  	// But the server should reply to this one, since ACK is false.
   970  	pingData := [8]byte{1, 2, 3, 4, 5, 6, 7, 8}
   971  	if err := st.fr.WritePing(false, pingData); err != nil {
   972  		t.Fatal(err)
   973  	}
   974  
   975  	pf := st.wantPing()
   976  	if !pf.Flags.Has(FlagPingAck) {
   977  		t.Error("response ping doesn't have ACK set")
   978  	}
   979  	if pf.Data != pingData {
   980  		t.Errorf("response ping has data %q; want %q", pf.Data, pingData)
   981  	}
   982  }
   983  
   984  func TestServer_RejectsLargeFrames(t *testing.T) {
   985  	st := newServerTester(t, nil)
   986  	defer st.Close()
   987  	st.greet()
   988  
   989  	// Write too large of a frame (too large by one byte)
   990  	// We ignore the return value because it's expected that the server
   991  	// will only read the first 9 bytes (the headre) and then disconnect.
   992  	st.fr.WriteRawFrame(0xff, 0, 0, make([]byte, defaultMaxReadFrameSize+1))
   993  
   994  	gf := st.wantGoAway()
   995  	if gf.ErrCode != ErrCodeFrameSize {
   996  		t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFrameSize)
   997  	}
   998  	if st.logBuf.Len() != 0 {
   999  		// Previously we spun here for a bit until the GOAWAY disconnect
  1000  		// timer fired, logging while we fired.
  1001  		t.Errorf("unexpected server output: %.500s\n", st.logBuf.Bytes())
  1002  	}
  1003  }
  1004  
  1005  func TestServer_Handler_Sends_WindowUpdate(t *testing.T) {
  1006  	puppet := newHandlerPuppet()
  1007  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1008  		puppet.act(w, r)
  1009  	})
  1010  	defer st.Close()
  1011  	defer puppet.done()
  1012  
  1013  	st.greet()
  1014  
  1015  	st.writeHeaders(HeadersFrameParam{
  1016  		StreamID:      1, // clients send odd numbers
  1017  		BlockFragment: st.encodeHeader(":method", "POST"),
  1018  		EndStream:     false, // data coming
  1019  		EndHeaders:    true,
  1020  	})
  1021  	st.writeData(1, false, []byte("abcdef"))
  1022  	puppet.do(readBodyHandler(t, "abc"))
  1023  	st.wantWindowUpdate(0, 3)
  1024  	st.wantWindowUpdate(1, 3)
  1025  
  1026  	puppet.do(readBodyHandler(t, "def"))
  1027  	st.wantWindowUpdate(0, 3)
  1028  	st.wantWindowUpdate(1, 3)
  1029  
  1030  	st.writeData(1, true, []byte("ghijkl")) // END_STREAM here
  1031  	puppet.do(readBodyHandler(t, "ghi"))
  1032  	puppet.do(readBodyHandler(t, "jkl"))
  1033  	st.wantWindowUpdate(0, 3)
  1034  	st.wantWindowUpdate(0, 3) // no more stream-level, since END_STREAM
  1035  }
  1036  
  1037  func TestServer_Send_GoAway_After_Bogus_WindowUpdate(t *testing.T) {
  1038  	st := newServerTester(t, nil)
  1039  	defer st.Close()
  1040  	st.greet()
  1041  	if err := st.fr.WriteWindowUpdate(0, 1<<31-1); err != nil {
  1042  		t.Fatal(err)
  1043  	}
  1044  	gf := st.wantGoAway()
  1045  	if gf.ErrCode != ErrCodeFlowControl {
  1046  		t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFlowControl)
  1047  	}
  1048  	if gf.LastStreamID != 0 {
  1049  		t.Errorf("GOAWAY last stream ID = %v; want %v", gf.LastStreamID, 0)
  1050  	}
  1051  }
  1052  
  1053  func TestServer_Send_RstStream_After_Bogus_WindowUpdate(t *testing.T) {
  1054  	inHandler := make(chan bool)
  1055  	blockHandler := make(chan bool)
  1056  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1057  		inHandler <- true
  1058  		<-blockHandler
  1059  	})
  1060  	defer st.Close()
  1061  	defer close(blockHandler)
  1062  	st.greet()
  1063  	st.writeHeaders(HeadersFrameParam{
  1064  		StreamID:      1,
  1065  		BlockFragment: st.encodeHeader(":method", "POST"),
  1066  		EndStream:     false, // keep it open
  1067  		EndHeaders:    true,
  1068  	})
  1069  	<-inHandler
  1070  	// Send a bogus window update:
  1071  	if err := st.fr.WriteWindowUpdate(1, 1<<31-1); err != nil {
  1072  		t.Fatal(err)
  1073  	}
  1074  	st.wantRSTStream(1, ErrCodeFlowControl)
  1075  }
  1076  
  1077  // testServerPostUnblock sends a hanging POST with unsent data to handler,
  1078  // then runs fn once in the handler, and verifies that the error returned from
  1079  // handler is acceptable. It fails if takes over 5 seconds for handler to exit.
  1080  func testServerPostUnblock(t *testing.T,
  1081  	handler func(http.ResponseWriter, *http.Request) error,
  1082  	fn func(*serverTester),
  1083  	checkErr func(error),
  1084  	otherHeaders ...string) {
  1085  	inHandler := make(chan bool)
  1086  	errc := make(chan error, 1)
  1087  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1088  		inHandler <- true
  1089  		errc <- handler(w, r)
  1090  	})
  1091  	st.greet()
  1092  	st.writeHeaders(HeadersFrameParam{
  1093  		StreamID:      1,
  1094  		BlockFragment: st.encodeHeader(append([]string{":method", "POST"}, otherHeaders...)...),
  1095  		EndStream:     false, // keep it open
  1096  		EndHeaders:    true,
  1097  	})
  1098  	<-inHandler
  1099  	fn(st)
  1100  	select {
  1101  	case err := <-errc:
  1102  		if checkErr != nil {
  1103  			checkErr(err)
  1104  		}
  1105  	case <-time.After(5 * time.Second):
  1106  		t.Fatal("timeout waiting for Handler to return")
  1107  	}
  1108  	st.Close()
  1109  }
  1110  
  1111  func TestServer_RSTStream_Unblocks_Read(t *testing.T) {
  1112  	testServerPostUnblock(t,
  1113  		func(w http.ResponseWriter, r *http.Request) (err error) {
  1114  			_, err = r.Body.Read(make([]byte, 1))
  1115  			return
  1116  		},
  1117  		func(st *serverTester) {
  1118  			if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  1119  				t.Fatal(err)
  1120  			}
  1121  		},
  1122  		func(err error) {
  1123  			if err == nil {
  1124  				t.Error("unexpected nil error from Request.Body.Read")
  1125  			}
  1126  		},
  1127  	)
  1128  }
  1129  
  1130  func TestServer_RSTStream_Unblocks_Header_Write(t *testing.T) {
  1131  	// Run this test a bunch, because it doesn't always
  1132  	// deadlock. But with a bunch, it did.
  1133  	n := 50
  1134  	if testing.Short() {
  1135  		n = 5
  1136  	}
  1137  	for i := 0; i < n; i++ {
  1138  		testServer_RSTStream_Unblocks_Header_Write(t)
  1139  	}
  1140  }
  1141  
  1142  func testServer_RSTStream_Unblocks_Header_Write(t *testing.T) {
  1143  	inHandler := make(chan bool, 1)
  1144  	unblockHandler := make(chan bool, 1)
  1145  	headerWritten := make(chan bool, 1)
  1146  	wroteRST := make(chan bool, 1)
  1147  
  1148  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1149  		inHandler <- true
  1150  		<-wroteRST
  1151  		w.Header().Set("foo", "bar")
  1152  		w.WriteHeader(200)
  1153  		w.(http.Flusher).Flush()
  1154  		headerWritten <- true
  1155  		<-unblockHandler
  1156  	})
  1157  	defer st.Close()
  1158  
  1159  	st.greet()
  1160  	st.writeHeaders(HeadersFrameParam{
  1161  		StreamID:      1,
  1162  		BlockFragment: st.encodeHeader(":method", "POST"),
  1163  		EndStream:     false, // keep it open
  1164  		EndHeaders:    true,
  1165  	})
  1166  	<-inHandler
  1167  	if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  1168  		t.Fatal(err)
  1169  	}
  1170  	wroteRST <- true
  1171  	st.awaitIdle()
  1172  	select {
  1173  	case <-headerWritten:
  1174  	case <-time.After(2 * time.Second):
  1175  		t.Error("timeout waiting for header write")
  1176  	}
  1177  	unblockHandler <- true
  1178  }
  1179  
  1180  func TestServer_DeadConn_Unblocks_Read(t *testing.T) {
  1181  	testServerPostUnblock(t,
  1182  		func(w http.ResponseWriter, r *http.Request) (err error) {
  1183  			_, err = r.Body.Read(make([]byte, 1))
  1184  			return
  1185  		},
  1186  		func(st *serverTester) { st.cc.Close() },
  1187  		func(err error) {
  1188  			if err == nil {
  1189  				t.Error("unexpected nil error from Request.Body.Read")
  1190  			}
  1191  		},
  1192  	)
  1193  }
  1194  
  1195  var blockUntilClosed = func(w http.ResponseWriter, r *http.Request) error {
  1196  	<-w.(http.CloseNotifier).CloseNotify()
  1197  	return nil
  1198  }
  1199  
  1200  func TestServer_CloseNotify_After_RSTStream(t *testing.T) {
  1201  	testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) {
  1202  		if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  1203  			t.Fatal(err)
  1204  		}
  1205  	}, nil)
  1206  }
  1207  
  1208  func TestServer_CloseNotify_After_ConnClose(t *testing.T) {
  1209  	testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { st.cc.Close() }, nil)
  1210  }
  1211  
  1212  // that CloseNotify unblocks after a stream error due to the client's
  1213  // problem that's unrelated to them explicitly canceling it (which is
  1214  // TestServer_CloseNotify_After_RSTStream above)
  1215  func TestServer_CloseNotify_After_StreamError(t *testing.T) {
  1216  	testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) {
  1217  		// data longer than declared Content-Length => stream error
  1218  		st.writeData(1, true, []byte("1234"))
  1219  	}, nil, "content-length", "3")
  1220  }
  1221  
  1222  func TestServer_StateTransitions(t *testing.T) {
  1223  	var st *serverTester
  1224  	inHandler := make(chan bool)
  1225  	writeData := make(chan bool)
  1226  	leaveHandler := make(chan bool)
  1227  	st = newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1228  		inHandler <- true
  1229  		if st.stream(1) == nil {
  1230  			t.Errorf("nil stream 1 in handler")
  1231  		}
  1232  		if got, want := st.streamState(1), stateOpen; got != want {
  1233  			t.Errorf("in handler, state is %v; want %v", got, want)
  1234  		}
  1235  		writeData <- true
  1236  		if n, err := r.Body.Read(make([]byte, 1)); n != 0 || err != io.EOF {
  1237  			t.Errorf("body read = %d, %v; want 0, EOF", n, err)
  1238  		}
  1239  		if got, want := st.streamState(1), stateHalfClosedRemote; got != want {
  1240  			t.Errorf("in handler, state is %v; want %v", got, want)
  1241  		}
  1242  
  1243  		<-leaveHandler
  1244  	})
  1245  	st.greet()
  1246  	if st.stream(1) != nil {
  1247  		t.Fatal("stream 1 should be empty")
  1248  	}
  1249  	if got := st.streamState(1); got != stateIdle {
  1250  		t.Fatalf("stream 1 should be idle; got %v", got)
  1251  	}
  1252  
  1253  	st.writeHeaders(HeadersFrameParam{
  1254  		StreamID:      1,
  1255  		BlockFragment: st.encodeHeader(":method", "POST"),
  1256  		EndStream:     false, // keep it open
  1257  		EndHeaders:    true,
  1258  	})
  1259  	<-inHandler
  1260  	<-writeData
  1261  	st.writeData(1, true, nil)
  1262  
  1263  	leaveHandler <- true
  1264  	hf := st.wantHeaders()
  1265  	if !hf.StreamEnded() {
  1266  		t.Fatal("expected END_STREAM flag")
  1267  	}
  1268  
  1269  	if got, want := st.streamState(1), stateClosed; got != want {
  1270  		t.Errorf("at end, state is %v; want %v", got, want)
  1271  	}
  1272  	if st.stream(1) != nil {
  1273  		t.Fatal("at end, stream 1 should be gone")
  1274  	}
  1275  }
  1276  
  1277  // test HEADERS w/o EndHeaders + another HEADERS (should get rejected)
  1278  func TestServer_Rejects_HeadersNoEnd_Then_Headers(t *testing.T) {
  1279  	testServerRejectsConn(t, func(st *serverTester) {
  1280  		st.writeHeaders(HeadersFrameParam{
  1281  			StreamID:      1,
  1282  			BlockFragment: st.encodeHeader(),
  1283  			EndStream:     true,
  1284  			EndHeaders:    false,
  1285  		})
  1286  		st.writeHeaders(HeadersFrameParam{ // Not a continuation.
  1287  			StreamID:      3, // different stream.
  1288  			BlockFragment: st.encodeHeader(),
  1289  			EndStream:     true,
  1290  			EndHeaders:    true,
  1291  		})
  1292  	})
  1293  }
  1294  
  1295  // test HEADERS w/o EndHeaders + PING (should get rejected)
  1296  func TestServer_Rejects_HeadersNoEnd_Then_Ping(t *testing.T) {
  1297  	testServerRejectsConn(t, func(st *serverTester) {
  1298  		st.writeHeaders(HeadersFrameParam{
  1299  			StreamID:      1,
  1300  			BlockFragment: st.encodeHeader(),
  1301  			EndStream:     true,
  1302  			EndHeaders:    false,
  1303  		})
  1304  		if err := st.fr.WritePing(false, [8]byte{}); err != nil {
  1305  			t.Fatal(err)
  1306  		}
  1307  	})
  1308  }
  1309  
  1310  // test HEADERS w/ EndHeaders + a continuation HEADERS (should get rejected)
  1311  func TestServer_Rejects_HeadersEnd_Then_Continuation(t *testing.T) {
  1312  	testServerRejectsConn(t, func(st *serverTester) {
  1313  		st.writeHeaders(HeadersFrameParam{
  1314  			StreamID:      1,
  1315  			BlockFragment: st.encodeHeader(),
  1316  			EndStream:     true,
  1317  			EndHeaders:    true,
  1318  		})
  1319  		st.wantHeaders()
  1320  		if err := st.fr.WriteContinuation(1, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil {
  1321  			t.Fatal(err)
  1322  		}
  1323  	})
  1324  }
  1325  
  1326  // test HEADERS w/o EndHeaders + a continuation HEADERS on wrong stream ID
  1327  func TestServer_Rejects_HeadersNoEnd_Then_ContinuationWrongStream(t *testing.T) {
  1328  	testServerRejectsConn(t, func(st *serverTester) {
  1329  		st.writeHeaders(HeadersFrameParam{
  1330  			StreamID:      1,
  1331  			BlockFragment: st.encodeHeader(),
  1332  			EndStream:     true,
  1333  			EndHeaders:    false,
  1334  		})
  1335  		if err := st.fr.WriteContinuation(3, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil {
  1336  			t.Fatal(err)
  1337  		}
  1338  	})
  1339  }
  1340  
  1341  // No HEADERS on stream 0.
  1342  func TestServer_Rejects_Headers0(t *testing.T) {
  1343  	testServerRejectsConn(t, func(st *serverTester) {
  1344  		st.fr.AllowIllegalWrites = true
  1345  		st.writeHeaders(HeadersFrameParam{
  1346  			StreamID:      0,
  1347  			BlockFragment: st.encodeHeader(),
  1348  			EndStream:     true,
  1349  			EndHeaders:    true,
  1350  		})
  1351  	})
  1352  }
  1353  
  1354  // No CONTINUATION on stream 0.
  1355  func TestServer_Rejects_Continuation0(t *testing.T) {
  1356  	testServerRejectsConn(t, func(st *serverTester) {
  1357  		st.fr.AllowIllegalWrites = true
  1358  		if err := st.fr.WriteContinuation(0, true, st.encodeHeader()); err != nil {
  1359  			t.Fatal(err)
  1360  		}
  1361  	})
  1362  }
  1363  
  1364  func TestServer_Rejects_PushPromise(t *testing.T) {
  1365  	testServerRejectsConn(t, func(st *serverTester) {
  1366  		pp := PushPromiseParam{
  1367  			StreamID:  1,
  1368  			PromiseID: 3,
  1369  		}
  1370  		if err := st.fr.WritePushPromise(pp); err != nil {
  1371  			t.Fatal(err)
  1372  		}
  1373  	})
  1374  }
  1375  
  1376  // testServerRejectsConn tests that the server hangs up with a GOAWAY
  1377  // frame and a server close after the client does something
  1378  // deserving a CONNECTION_ERROR.
  1379  func testServerRejectsConn(t *testing.T, writeReq func(*serverTester)) {
  1380  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {})
  1381  	st.addLogFilter("connection error: PROTOCOL_ERROR")
  1382  	defer st.Close()
  1383  	st.greet()
  1384  	writeReq(st)
  1385  
  1386  	st.wantGoAway()
  1387  	errc := make(chan error, 1)
  1388  	go func() {
  1389  		fr, err := st.fr.ReadFrame()
  1390  		if err == nil {
  1391  			err = fmt.Errorf("got frame of type %T", fr)
  1392  		}
  1393  		errc <- err
  1394  	}()
  1395  	select {
  1396  	case err := <-errc:
  1397  		if err != io.EOF {
  1398  			t.Errorf("ReadFrame = %v; want io.EOF", err)
  1399  		}
  1400  	case <-time.After(2 * time.Second):
  1401  		t.Error("timeout waiting for disconnect")
  1402  	}
  1403  }
  1404  
  1405  // testServerRejectsStream tests that the server sends a RST_STREAM with the provided
  1406  // error code after a client sends a bogus request.
  1407  func testServerRejectsStream(t *testing.T, code ErrCode, writeReq func(*serverTester)) {
  1408  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {})
  1409  	defer st.Close()
  1410  	st.greet()
  1411  	writeReq(st)
  1412  	st.wantRSTStream(1, code)
  1413  }
  1414  
  1415  // testServerRequest sets up an idle HTTP/2 connection and lets you
  1416  // write a single request with writeReq, and then verify that the
  1417  // *http.Request is built correctly in checkReq.
  1418  func testServerRequest(t *testing.T, writeReq func(*serverTester), checkReq func(*http.Request)) {
  1419  	gotReq := make(chan bool, 1)
  1420  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1421  		if r.Body == nil {
  1422  			t.Fatal("nil Body")
  1423  		}
  1424  		checkReq(r)
  1425  		gotReq <- true
  1426  	})
  1427  	defer st.Close()
  1428  
  1429  	st.greet()
  1430  	writeReq(st)
  1431  
  1432  	select {
  1433  	case <-gotReq:
  1434  	case <-time.After(2 * time.Second):
  1435  		t.Error("timeout waiting for request")
  1436  	}
  1437  }
  1438  
  1439  func getSlash(st *serverTester) { st.bodylessReq1() }
  1440  
  1441  func TestServer_Response_NoData(t *testing.T) {
  1442  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1443  		// Nothing.
  1444  		return nil
  1445  	}, func(st *serverTester) {
  1446  		getSlash(st)
  1447  		hf := st.wantHeaders()
  1448  		if !hf.StreamEnded() {
  1449  			t.Fatal("want END_STREAM flag")
  1450  		}
  1451  		if !hf.HeadersEnded() {
  1452  			t.Fatal("want END_HEADERS flag")
  1453  		}
  1454  	})
  1455  }
  1456  
  1457  func TestServer_Response_NoData_Header_FooBar(t *testing.T) {
  1458  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1459  		w.Header().Set("Foo-Bar", "some-value")
  1460  		return nil
  1461  	}, func(st *serverTester) {
  1462  		getSlash(st)
  1463  		hf := st.wantHeaders()
  1464  		if !hf.StreamEnded() {
  1465  			t.Fatal("want END_STREAM flag")
  1466  		}
  1467  		if !hf.HeadersEnded() {
  1468  			t.Fatal("want END_HEADERS flag")
  1469  		}
  1470  		goth := st.decodeHeader(hf.HeaderBlockFragment())
  1471  		wanth := [][2]string{
  1472  			{":status", "200"},
  1473  			{"foo-bar", "some-value"},
  1474  			{"content-type", "text/plain; charset=utf-8"},
  1475  			{"content-length", "0"},
  1476  		}
  1477  		if !reflect.DeepEqual(goth, wanth) {
  1478  			t.Errorf("Got headers %v; want %v", goth, wanth)
  1479  		}
  1480  	})
  1481  }
  1482  
  1483  func TestServer_Response_Data_Sniff_DoesntOverride(t *testing.T) {
  1484  	const msg = "<html>this is HTML."
  1485  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1486  		w.Header().Set("Content-Type", "foo/bar")
  1487  		io.WriteString(w, msg)
  1488  		return nil
  1489  	}, func(st *serverTester) {
  1490  		getSlash(st)
  1491  		hf := st.wantHeaders()
  1492  		if hf.StreamEnded() {
  1493  			t.Fatal("don't want END_STREAM, expecting data")
  1494  		}
  1495  		if !hf.HeadersEnded() {
  1496  			t.Fatal("want END_HEADERS flag")
  1497  		}
  1498  		goth := st.decodeHeader(hf.HeaderBlockFragment())
  1499  		wanth := [][2]string{
  1500  			{":status", "200"},
  1501  			{"content-type", "foo/bar"},
  1502  			{"content-length", strconv.Itoa(len(msg))},
  1503  		}
  1504  		if !reflect.DeepEqual(goth, wanth) {
  1505  			t.Errorf("Got headers %v; want %v", goth, wanth)
  1506  		}
  1507  		df := st.wantData()
  1508  		if !df.StreamEnded() {
  1509  			t.Error("expected DATA to have END_STREAM flag")
  1510  		}
  1511  		if got := string(df.Data()); got != msg {
  1512  			t.Errorf("got DATA %q; want %q", got, msg)
  1513  		}
  1514  	})
  1515  }
  1516  
  1517  func TestServer_Response_TransferEncoding_chunked(t *testing.T) {
  1518  	const msg = "hi"
  1519  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1520  		w.Header().Set("Transfer-Encoding", "chunked") // should be stripped
  1521  		io.WriteString(w, msg)
  1522  		return nil
  1523  	}, func(st *serverTester) {
  1524  		getSlash(st)
  1525  		hf := st.wantHeaders()
  1526  		goth := st.decodeHeader(hf.HeaderBlockFragment())
  1527  		wanth := [][2]string{
  1528  			{":status", "200"},
  1529  			{"content-type", "text/plain; charset=utf-8"},
  1530  			{"content-length", strconv.Itoa(len(msg))},
  1531  		}
  1532  		if !reflect.DeepEqual(goth, wanth) {
  1533  			t.Errorf("Got headers %v; want %v", goth, wanth)
  1534  		}
  1535  	})
  1536  }
  1537  
  1538  // Header accessed only after the initial write.
  1539  func TestServer_Response_Data_IgnoreHeaderAfterWrite_After(t *testing.T) {
  1540  	const msg = "<html>this is HTML."
  1541  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1542  		io.WriteString(w, msg)
  1543  		w.Header().Set("foo", "should be ignored")
  1544  		return nil
  1545  	}, func(st *serverTester) {
  1546  		getSlash(st)
  1547  		hf := st.wantHeaders()
  1548  		if hf.StreamEnded() {
  1549  			t.Fatal("unexpected END_STREAM")
  1550  		}
  1551  		if !hf.HeadersEnded() {
  1552  			t.Fatal("want END_HEADERS flag")
  1553  		}
  1554  		goth := st.decodeHeader(hf.HeaderBlockFragment())
  1555  		wanth := [][2]string{
  1556  			{":status", "200"},
  1557  			{"content-type", "text/html; charset=utf-8"},
  1558  			{"content-length", strconv.Itoa(len(msg))},
  1559  		}
  1560  		if !reflect.DeepEqual(goth, wanth) {
  1561  			t.Errorf("Got headers %v; want %v", goth, wanth)
  1562  		}
  1563  	})
  1564  }
  1565  
  1566  // Header accessed before the initial write and later mutated.
  1567  func TestServer_Response_Data_IgnoreHeaderAfterWrite_Overwrite(t *testing.T) {
  1568  	const msg = "<html>this is HTML."
  1569  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1570  		w.Header().Set("foo", "proper value")
  1571  		io.WriteString(w, msg)
  1572  		w.Header().Set("foo", "should be ignored")
  1573  		return nil
  1574  	}, func(st *serverTester) {
  1575  		getSlash(st)
  1576  		hf := st.wantHeaders()
  1577  		if hf.StreamEnded() {
  1578  			t.Fatal("unexpected END_STREAM")
  1579  		}
  1580  		if !hf.HeadersEnded() {
  1581  			t.Fatal("want END_HEADERS flag")
  1582  		}
  1583  		goth := st.decodeHeader(hf.HeaderBlockFragment())
  1584  		wanth := [][2]string{
  1585  			{":status", "200"},
  1586  			{"foo", "proper value"},
  1587  			{"content-type", "text/html; charset=utf-8"},
  1588  			{"content-length", strconv.Itoa(len(msg))},
  1589  		}
  1590  		if !reflect.DeepEqual(goth, wanth) {
  1591  			t.Errorf("Got headers %v; want %v", goth, wanth)
  1592  		}
  1593  	})
  1594  }
  1595  
  1596  func TestServer_Response_Data_SniffLenType(t *testing.T) {
  1597  	const msg = "<html>this is HTML."
  1598  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1599  		io.WriteString(w, msg)
  1600  		return nil
  1601  	}, func(st *serverTester) {
  1602  		getSlash(st)
  1603  		hf := st.wantHeaders()
  1604  		if hf.StreamEnded() {
  1605  			t.Fatal("don't want END_STREAM, expecting data")
  1606  		}
  1607  		if !hf.HeadersEnded() {
  1608  			t.Fatal("want END_HEADERS flag")
  1609  		}
  1610  		goth := st.decodeHeader(hf.HeaderBlockFragment())
  1611  		wanth := [][2]string{
  1612  			{":status", "200"},
  1613  			{"content-type", "text/html; charset=utf-8"},
  1614  			{"content-length", strconv.Itoa(len(msg))},
  1615  		}
  1616  		if !reflect.DeepEqual(goth, wanth) {
  1617  			t.Errorf("Got headers %v; want %v", goth, wanth)
  1618  		}
  1619  		df := st.wantData()
  1620  		if !df.StreamEnded() {
  1621  			t.Error("expected DATA to have END_STREAM flag")
  1622  		}
  1623  		if got := string(df.Data()); got != msg {
  1624  			t.Errorf("got DATA %q; want %q", got, msg)
  1625  		}
  1626  	})
  1627  }
  1628  
  1629  func TestServer_Response_Header_Flush_MidWrite(t *testing.T) {
  1630  	const msg = "<html>this is HTML"
  1631  	const msg2 = ", and this is the next chunk"
  1632  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1633  		io.WriteString(w, msg)
  1634  		w.(http.Flusher).Flush()
  1635  		io.WriteString(w, msg2)
  1636  		return nil
  1637  	}, func(st *serverTester) {
  1638  		getSlash(st)
  1639  		hf := st.wantHeaders()
  1640  		if hf.StreamEnded() {
  1641  			t.Fatal("unexpected END_STREAM flag")
  1642  		}
  1643  		if !hf.HeadersEnded() {
  1644  			t.Fatal("want END_HEADERS flag")
  1645  		}
  1646  		goth := st.decodeHeader(hf.HeaderBlockFragment())
  1647  		wanth := [][2]string{
  1648  			{":status", "200"},
  1649  			{"content-type", "text/html; charset=utf-8"}, // sniffed
  1650  			// and no content-length
  1651  		}
  1652  		if !reflect.DeepEqual(goth, wanth) {
  1653  			t.Errorf("Got headers %v; want %v", goth, wanth)
  1654  		}
  1655  		{
  1656  			df := st.wantData()
  1657  			if df.StreamEnded() {
  1658  				t.Error("unexpected END_STREAM flag")
  1659  			}
  1660  			if got := string(df.Data()); got != msg {
  1661  				t.Errorf("got DATA %q; want %q", got, msg)
  1662  			}
  1663  		}
  1664  		{
  1665  			df := st.wantData()
  1666  			if !df.StreamEnded() {
  1667  				t.Error("wanted END_STREAM flag on last data chunk")
  1668  			}
  1669  			if got := string(df.Data()); got != msg2 {
  1670  				t.Errorf("got DATA %q; want %q", got, msg2)
  1671  			}
  1672  		}
  1673  	})
  1674  }
  1675  
  1676  func TestServer_Response_LargeWrite(t *testing.T) {
  1677  	const size = 1 << 20
  1678  	const maxFrameSize = 16 << 10
  1679  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1680  		n, err := w.Write(bytes.Repeat([]byte("a"), size))
  1681  		if err != nil {
  1682  			return fmt.Errorf("Write error: %v", err)
  1683  		}
  1684  		if n != size {
  1685  			return fmt.Errorf("wrong size %d from Write", n)
  1686  		}
  1687  		return nil
  1688  	}, func(st *serverTester) {
  1689  		if err := st.fr.WriteSettings(
  1690  			Setting{SettingInitialWindowSize, 0},
  1691  			Setting{SettingMaxFrameSize, maxFrameSize},
  1692  		); err != nil {
  1693  			t.Fatal(err)
  1694  		}
  1695  		st.wantSettingsAck()
  1696  
  1697  		getSlash(st) // make the single request
  1698  
  1699  		// Give the handler quota to write:
  1700  		if err := st.fr.WriteWindowUpdate(1, size); err != nil {
  1701  			t.Fatal(err)
  1702  		}
  1703  		// Give the handler quota to write to connection-level
  1704  		// window as well
  1705  		if err := st.fr.WriteWindowUpdate(0, size); err != nil {
  1706  			t.Fatal(err)
  1707  		}
  1708  		hf := st.wantHeaders()
  1709  		if hf.StreamEnded() {
  1710  			t.Fatal("unexpected END_STREAM flag")
  1711  		}
  1712  		if !hf.HeadersEnded() {
  1713  			t.Fatal("want END_HEADERS flag")
  1714  		}
  1715  		goth := st.decodeHeader(hf.HeaderBlockFragment())
  1716  		wanth := [][2]string{
  1717  			{":status", "200"},
  1718  			{"content-type", "text/plain; charset=utf-8"}, // sniffed
  1719  			// and no content-length
  1720  		}
  1721  		if !reflect.DeepEqual(goth, wanth) {
  1722  			t.Errorf("Got headers %v; want %v", goth, wanth)
  1723  		}
  1724  		var bytes, frames int
  1725  		for {
  1726  			df := st.wantData()
  1727  			bytes += len(df.Data())
  1728  			frames++
  1729  			for _, b := range df.Data() {
  1730  				if b != 'a' {
  1731  					t.Fatal("non-'a' byte seen in DATA")
  1732  				}
  1733  			}
  1734  			if df.StreamEnded() {
  1735  				break
  1736  			}
  1737  		}
  1738  		if bytes != size {
  1739  			t.Errorf("Got %d bytes; want %d", bytes, size)
  1740  		}
  1741  		if want := int(size / maxFrameSize); frames < want || frames > want*2 {
  1742  			t.Errorf("Got %d frames; want %d", frames, size)
  1743  		}
  1744  	})
  1745  }
  1746  
  1747  // Test that the handler can't write more than the client allows
  1748  func TestServer_Response_LargeWrite_FlowControlled(t *testing.T) {
  1749  	const size = 1 << 20
  1750  	const maxFrameSize = 16 << 10
  1751  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1752  		w.(http.Flusher).Flush()
  1753  		n, err := w.Write(bytes.Repeat([]byte("a"), size))
  1754  		if err != nil {
  1755  			return fmt.Errorf("Write error: %v", err)
  1756  		}
  1757  		if n != size {
  1758  			return fmt.Errorf("wrong size %d from Write", n)
  1759  		}
  1760  		return nil
  1761  	}, func(st *serverTester) {
  1762  		// Set the window size to something explicit for this test.
  1763  		// It's also how much initial data we expect.
  1764  		const initWindowSize = 123
  1765  		if err := st.fr.WriteSettings(
  1766  			Setting{SettingInitialWindowSize, initWindowSize},
  1767  			Setting{SettingMaxFrameSize, maxFrameSize},
  1768  		); err != nil {
  1769  			t.Fatal(err)
  1770  		}
  1771  		st.wantSettingsAck()
  1772  
  1773  		getSlash(st) // make the single request
  1774  		defer func() { st.fr.WriteRSTStream(1, ErrCodeCancel) }()
  1775  
  1776  		hf := st.wantHeaders()
  1777  		if hf.StreamEnded() {
  1778  			t.Fatal("unexpected END_STREAM flag")
  1779  		}
  1780  		if !hf.HeadersEnded() {
  1781  			t.Fatal("want END_HEADERS flag")
  1782  		}
  1783  
  1784  		df := st.wantData()
  1785  		if got := len(df.Data()); got != initWindowSize {
  1786  			t.Fatalf("Initial window size = %d but got DATA with %d bytes", initWindowSize, got)
  1787  		}
  1788  
  1789  		for _, quota := range []int{1, 13, 127} {
  1790  			if err := st.fr.WriteWindowUpdate(1, uint32(quota)); err != nil {
  1791  				t.Fatal(err)
  1792  			}
  1793  			df := st.wantData()
  1794  			if int(quota) != len(df.Data()) {
  1795  				t.Fatalf("read %d bytes after giving %d quota", len(df.Data()), quota)
  1796  			}
  1797  		}
  1798  
  1799  		if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  1800  			t.Fatal(err)
  1801  		}
  1802  	})
  1803  }
  1804  
  1805  // Test that the handler blocked in a Write is unblocked if the server sends a RST_STREAM.
  1806  func TestServer_Response_RST_Unblocks_LargeWrite(t *testing.T) {
  1807  	const size = 1 << 20
  1808  	const maxFrameSize = 16 << 10
  1809  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1810  		w.(http.Flusher).Flush()
  1811  		errc := make(chan error, 1)
  1812  		go func() {
  1813  			_, err := w.Write(bytes.Repeat([]byte("a"), size))
  1814  			errc <- err
  1815  		}()
  1816  		select {
  1817  		case err := <-errc:
  1818  			if err == nil {
  1819  				return errors.New("unexpected nil error from Write in handler")
  1820  			}
  1821  			return nil
  1822  		case <-time.After(2 * time.Second):
  1823  			return errors.New("timeout waiting for Write in handler")
  1824  		}
  1825  	}, func(st *serverTester) {
  1826  		if err := st.fr.WriteSettings(
  1827  			Setting{SettingInitialWindowSize, 0},
  1828  			Setting{SettingMaxFrameSize, maxFrameSize},
  1829  		); err != nil {
  1830  			t.Fatal(err)
  1831  		}
  1832  		st.wantSettingsAck()
  1833  
  1834  		getSlash(st) // make the single request
  1835  
  1836  		hf := st.wantHeaders()
  1837  		if hf.StreamEnded() {
  1838  			t.Fatal("unexpected END_STREAM flag")
  1839  		}
  1840  		if !hf.HeadersEnded() {
  1841  			t.Fatal("want END_HEADERS flag")
  1842  		}
  1843  
  1844  		if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  1845  			t.Fatal(err)
  1846  		}
  1847  	})
  1848  }
  1849  
  1850  func TestServer_Response_Empty_Data_Not_FlowControlled(t *testing.T) {
  1851  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1852  		w.(http.Flusher).Flush()
  1853  		// Nothing; send empty DATA
  1854  		return nil
  1855  	}, func(st *serverTester) {
  1856  		// Handler gets no data quota:
  1857  		if err := st.fr.WriteSettings(Setting{SettingInitialWindowSize, 0}); err != nil {
  1858  			t.Fatal(err)
  1859  		}
  1860  		st.wantSettingsAck()
  1861  
  1862  		getSlash(st) // make the single request
  1863  
  1864  		hf := st.wantHeaders()
  1865  		if hf.StreamEnded() {
  1866  			t.Fatal("unexpected END_STREAM flag")
  1867  		}
  1868  		if !hf.HeadersEnded() {
  1869  			t.Fatal("want END_HEADERS flag")
  1870  		}
  1871  
  1872  		df := st.wantData()
  1873  		if got := len(df.Data()); got != 0 {
  1874  			t.Fatalf("unexpected %d DATA bytes; want 0", got)
  1875  		}
  1876  		if !df.StreamEnded() {
  1877  			t.Fatal("DATA didn't have END_STREAM")
  1878  		}
  1879  	})
  1880  }
  1881  
  1882  func TestServer_Response_Automatic100Continue(t *testing.T) {
  1883  	const msg = "foo"
  1884  	const reply = "bar"
  1885  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1886  		if v := r.Header.Get("Expect"); v != "" {
  1887  			t.Errorf("Expect header = %q; want empty", v)
  1888  		}
  1889  		buf := make([]byte, len(msg))
  1890  		// This read should trigger the 100-continue being sent.
  1891  		if n, err := io.ReadFull(r.Body, buf); err != nil || n != len(msg) || string(buf) != msg {
  1892  			return fmt.Errorf("ReadFull = %q, %v; want %q, nil", buf[:n], err, msg)
  1893  		}
  1894  		_, err := io.WriteString(w, reply)
  1895  		return err
  1896  	}, func(st *serverTester) {
  1897  		st.writeHeaders(HeadersFrameParam{
  1898  			StreamID:      1, // clients send odd numbers
  1899  			BlockFragment: st.encodeHeader(":method", "POST", "expect", "100-continue"),
  1900  			EndStream:     false,
  1901  			EndHeaders:    true,
  1902  		})
  1903  		hf := st.wantHeaders()
  1904  		if hf.StreamEnded() {
  1905  			t.Fatal("unexpected END_STREAM flag")
  1906  		}
  1907  		if !hf.HeadersEnded() {
  1908  			t.Fatal("want END_HEADERS flag")
  1909  		}
  1910  		goth := st.decodeHeader(hf.HeaderBlockFragment())
  1911  		wanth := [][2]string{
  1912  			{":status", "100"},
  1913  		}
  1914  		if !reflect.DeepEqual(goth, wanth) {
  1915  			t.Fatalf("Got headers %v; want %v", goth, wanth)
  1916  		}
  1917  
  1918  		// Okay, they sent status 100, so we can send our
  1919  		// gigantic and/or sensitive "foo" payload now.
  1920  		st.writeData(1, true, []byte(msg))
  1921  
  1922  		st.wantWindowUpdate(0, uint32(len(msg)))
  1923  
  1924  		hf = st.wantHeaders()
  1925  		if hf.StreamEnded() {
  1926  			t.Fatal("expected data to follow")
  1927  		}
  1928  		if !hf.HeadersEnded() {
  1929  			t.Fatal("want END_HEADERS flag")
  1930  		}
  1931  		goth = st.decodeHeader(hf.HeaderBlockFragment())
  1932  		wanth = [][2]string{
  1933  			{":status", "200"},
  1934  			{"content-type", "text/plain; charset=utf-8"},
  1935  			{"content-length", strconv.Itoa(len(reply))},
  1936  		}
  1937  		if !reflect.DeepEqual(goth, wanth) {
  1938  			t.Errorf("Got headers %v; want %v", goth, wanth)
  1939  		}
  1940  
  1941  		df := st.wantData()
  1942  		if string(df.Data()) != reply {
  1943  			t.Errorf("Client read %q; want %q", df.Data(), reply)
  1944  		}
  1945  		if !df.StreamEnded() {
  1946  			t.Errorf("expect data stream end")
  1947  		}
  1948  	})
  1949  }
  1950  
  1951  func TestServer_HandlerWriteErrorOnDisconnect(t *testing.T) {
  1952  	errc := make(chan error, 1)
  1953  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1954  		p := []byte("some data.\n")
  1955  		for {
  1956  			_, err := w.Write(p)
  1957  			if err != nil {
  1958  				errc <- err
  1959  				return nil
  1960  			}
  1961  		}
  1962  	}, func(st *serverTester) {
  1963  		st.writeHeaders(HeadersFrameParam{
  1964  			StreamID:      1,
  1965  			BlockFragment: st.encodeHeader(),
  1966  			EndStream:     false,
  1967  			EndHeaders:    true,
  1968  		})
  1969  		hf := st.wantHeaders()
  1970  		if hf.StreamEnded() {
  1971  			t.Fatal("unexpected END_STREAM flag")
  1972  		}
  1973  		if !hf.HeadersEnded() {
  1974  			t.Fatal("want END_HEADERS flag")
  1975  		}
  1976  		// Close the connection and wait for the handler to (hopefully) notice.
  1977  		st.cc.Close()
  1978  		select {
  1979  		case <-errc:
  1980  		case <-time.After(5 * time.Second):
  1981  			t.Error("timeout")
  1982  		}
  1983  	})
  1984  }
  1985  
  1986  func TestServer_Rejects_Too_Many_Streams(t *testing.T) {
  1987  	const testPath = "/some/path"
  1988  
  1989  	inHandler := make(chan uint32)
  1990  	leaveHandler := make(chan bool)
  1991  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1992  		id := w.(*responseWriter).rws.stream.id
  1993  		inHandler <- id
  1994  		if id == 1+(defaultMaxStreams+1)*2 && r.URL.Path != testPath {
  1995  			t.Errorf("decoded final path as %q; want %q", r.URL.Path, testPath)
  1996  		}
  1997  		<-leaveHandler
  1998  	})
  1999  	defer st.Close()
  2000  	st.greet()
  2001  	nextStreamID := uint32(1)
  2002  	streamID := func() uint32 {
  2003  		defer func() { nextStreamID += 2 }()
  2004  		return nextStreamID
  2005  	}
  2006  	sendReq := func(id uint32, headers ...string) {
  2007  		st.writeHeaders(HeadersFrameParam{
  2008  			StreamID:      id,
  2009  			BlockFragment: st.encodeHeader(headers...),
  2010  			EndStream:     true,
  2011  			EndHeaders:    true,
  2012  		})
  2013  	}
  2014  	for i := 0; i < defaultMaxStreams; i++ {
  2015  		sendReq(streamID())
  2016  		<-inHandler
  2017  	}
  2018  	defer func() {
  2019  		for i := 0; i < defaultMaxStreams; i++ {
  2020  			leaveHandler <- true
  2021  		}
  2022  	}()
  2023  
  2024  	// And this one should cross the limit:
  2025  	// (It's also sent as a CONTINUATION, to verify we still track the decoder context,
  2026  	// even if we're rejecting it)
  2027  	rejectID := streamID()
  2028  	headerBlock := st.encodeHeader(":path", testPath)
  2029  	frag1, frag2 := headerBlock[:3], headerBlock[3:]
  2030  	st.writeHeaders(HeadersFrameParam{
  2031  		StreamID:      rejectID,
  2032  		BlockFragment: frag1,
  2033  		EndStream:     true,
  2034  		EndHeaders:    false, // CONTINUATION coming
  2035  	})
  2036  	if err := st.fr.WriteContinuation(rejectID, true, frag2); err != nil {
  2037  		t.Fatal(err)
  2038  	}
  2039  	st.wantRSTStream(rejectID, ErrCodeProtocol)
  2040  
  2041  	// But let a handler finish:
  2042  	leaveHandler <- true
  2043  	st.wantHeaders()
  2044  
  2045  	// And now another stream should be able to start:
  2046  	goodID := streamID()
  2047  	sendReq(goodID, ":path", testPath)
  2048  	select {
  2049  	case got := <-inHandler:
  2050  		if got != goodID {
  2051  			t.Errorf("Got stream %d; want %d", got, goodID)
  2052  		}
  2053  	case <-time.After(3 * time.Second):
  2054  		t.Error("timeout waiting for handler")
  2055  	}
  2056  }
  2057  
  2058  // So many response headers that the server needs to use CONTINUATION frames:
  2059  func TestServer_Response_ManyHeaders_With_Continuation(t *testing.T) {
  2060  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  2061  		h := w.Header()
  2062  		for i := 0; i < 5000; i++ {
  2063  			h.Set(fmt.Sprintf("x-header-%d", i), fmt.Sprintf("x-value-%d", i))
  2064  		}
  2065  		return nil
  2066  	}, func(st *serverTester) {
  2067  		getSlash(st)
  2068  		hf := st.wantHeaders()
  2069  		if hf.HeadersEnded() {
  2070  			t.Fatal("got unwanted END_HEADERS flag")
  2071  		}
  2072  		n := 0
  2073  		for {
  2074  			n++
  2075  			cf := st.wantContinuation()
  2076  			if cf.HeadersEnded() {
  2077  				break
  2078  			}
  2079  		}
  2080  		if n < 5 {
  2081  			t.Errorf("Only got %d CONTINUATION frames; expected 5+ (currently 6)", n)
  2082  		}
  2083  	})
  2084  }
  2085  
  2086  // This previously crashed (reported by Mathieu Lonjaret as observed
  2087  // while using Camlistore) because we got a DATA frame from the client
  2088  // after the handler exited and our logic at the time was wrong,
  2089  // keeping a stream in the map in stateClosed, which tickled an
  2090  // invariant check later when we tried to remove that stream (via
  2091  // defer sc.closeAllStreamsOnConnClose) when the serverConn serve loop
  2092  // ended.
  2093  func TestServer_NoCrash_HandlerClose_Then_ClientClose(t *testing.T) {
  2094  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  2095  		// nothing
  2096  		return nil
  2097  	}, func(st *serverTester) {
  2098  		st.writeHeaders(HeadersFrameParam{
  2099  			StreamID:      1,
  2100  			BlockFragment: st.encodeHeader(),
  2101  			EndStream:     false, // DATA is coming
  2102  			EndHeaders:    true,
  2103  		})
  2104  		hf := st.wantHeaders()
  2105  		if !hf.HeadersEnded() || !hf.StreamEnded() {
  2106  			t.Fatalf("want END_HEADERS+END_STREAM, got %v", hf)
  2107  		}
  2108  
  2109  		// Sent when the a Handler closes while a client has
  2110  		// indicated it's still sending DATA:
  2111  		st.wantRSTStream(1, ErrCodeCancel)
  2112  
  2113  		// Now the handler has ended, so it's ended its
  2114  		// stream, but the client hasn't closed its side
  2115  		// (stateClosedLocal).  So send more data and verify
  2116  		// it doesn't crash with an internal invariant panic, like
  2117  		// it did before.
  2118  		st.writeData(1, true, []byte("foo"))
  2119  
  2120  		// Sent after a peer sends data anyway (admittedly the
  2121  		// previous RST_STREAM might've still been in-flight),
  2122  		// but they'll get the more friendly 'cancel' code
  2123  		// first.
  2124  		st.wantRSTStream(1, ErrCodeStreamClosed)
  2125  
  2126  		// Set up a bunch of machinery to record the panic we saw
  2127  		// previously.
  2128  		var (
  2129  			panMu    sync.Mutex
  2130  			panicVal interface{}
  2131  		)
  2132  
  2133  		testHookOnPanicMu.Lock()
  2134  		testHookOnPanic = func(sc *serverConn, pv interface{}) bool {
  2135  			panMu.Lock()
  2136  			panicVal = pv
  2137  			panMu.Unlock()
  2138  			return true
  2139  		}
  2140  		testHookOnPanicMu.Unlock()
  2141  
  2142  		// Now force the serve loop to end, via closing the connection.
  2143  		st.cc.Close()
  2144  		select {
  2145  		case <-st.sc.doneServing:
  2146  			// Loop has exited.
  2147  			panMu.Lock()
  2148  			got := panicVal
  2149  			panMu.Unlock()
  2150  			if got != nil {
  2151  				t.Errorf("Got panic: %v", got)
  2152  			}
  2153  		case <-time.After(5 * time.Second):
  2154  			t.Error("timeout")
  2155  		}
  2156  	})
  2157  }
  2158  
  2159  func TestServer_Rejects_TLS10(t *testing.T) { testRejectTLS(t, tls.VersionTLS10) }
  2160  func TestServer_Rejects_TLS11(t *testing.T) { testRejectTLS(t, tls.VersionTLS11) }
  2161  
  2162  func testRejectTLS(t *testing.T, max uint16) {
  2163  	st := newServerTester(t, nil, func(c *tls.Config) {
  2164  		c.MaxVersion = max
  2165  	})
  2166  	defer st.Close()
  2167  	gf := st.wantGoAway()
  2168  	if got, want := gf.ErrCode, ErrCodeInadequateSecurity; got != want {
  2169  		t.Errorf("Got error code %v; want %v", got, want)
  2170  	}
  2171  }
  2172  
  2173  func TestServer_Rejects_TLSBadCipher(t *testing.T) {
  2174  	st := newServerTester(t, nil, func(c *tls.Config) {
  2175  		// Only list bad ones:
  2176  		c.CipherSuites = []uint16{
  2177  			tls.TLS_RSA_WITH_RC4_128_SHA,
  2178  			tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  2179  			tls.TLS_RSA_WITH_AES_128_CBC_SHA,
  2180  			tls.TLS_RSA_WITH_AES_256_CBC_SHA,
  2181  			tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
  2182  			tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  2183  			tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  2184  			tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA,
  2185  			tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
  2186  			tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  2187  			tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  2188  		}
  2189  	})
  2190  	defer st.Close()
  2191  	gf := st.wantGoAway()
  2192  	if got, want := gf.ErrCode, ErrCodeInadequateSecurity; got != want {
  2193  		t.Errorf("Got error code %v; want %v", got, want)
  2194  	}
  2195  }
  2196  
  2197  func TestServer_Advertises_Common_Cipher(t *testing.T) {
  2198  	const requiredSuite = tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  2199  	st := newServerTester(t, nil, func(c *tls.Config) {
  2200  		// Have the client only support the one required by the spec.
  2201  		c.CipherSuites = []uint16{requiredSuite}
  2202  	}, func(ts *httptest.Server) {
  2203  		var srv *http.Server = ts.Config
  2204  		// Have the server configured with no specific cipher suites.
  2205  		// This tests that Go's defaults include the required one.
  2206  		srv.TLSConfig = nil
  2207  	})
  2208  	defer st.Close()
  2209  	st.greet()
  2210  }
  2211  
  2212  func (st *serverTester) onHeaderField(f hpack.HeaderField) {
  2213  	if f.Name == "date" {
  2214  		return
  2215  	}
  2216  	st.decodedHeaders = append(st.decodedHeaders, [2]string{f.Name, f.Value})
  2217  }
  2218  
  2219  func (st *serverTester) decodeHeader(headerBlock []byte) (pairs [][2]string) {
  2220  	st.decodedHeaders = nil
  2221  	if _, err := st.hpackDec.Write(headerBlock); err != nil {
  2222  		st.t.Fatalf("hpack decoding error: %v", err)
  2223  	}
  2224  	if err := st.hpackDec.Close(); err != nil {
  2225  		st.t.Fatalf("hpack decoding error: %v", err)
  2226  	}
  2227  	return st.decodedHeaders
  2228  }
  2229  
  2230  // testServerResponse sets up an idle HTTP/2 connection and lets you
  2231  // write a single request with writeReq, and then reply to it in some way with the provided handler,
  2232  // and then verify the output with the serverTester again (assuming the handler returns nil)
  2233  func testServerResponse(t testing.TB,
  2234  	handler func(http.ResponseWriter, *http.Request) error,
  2235  	client func(*serverTester),
  2236  ) {
  2237  	errc := make(chan error, 1)
  2238  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  2239  		if r.Body == nil {
  2240  			t.Fatal("nil Body")
  2241  		}
  2242  		errc <- handler(w, r)
  2243  	})
  2244  	defer st.Close()
  2245  
  2246  	donec := make(chan bool)
  2247  	go func() {
  2248  		defer close(donec)
  2249  		st.greet()
  2250  		client(st)
  2251  	}()
  2252  
  2253  	select {
  2254  	case <-donec:
  2255  		return
  2256  	case <-time.After(5 * time.Second):
  2257  		t.Fatal("timeout")
  2258  	}
  2259  
  2260  	select {
  2261  	case err := <-errc:
  2262  		if err != nil {
  2263  			t.Fatalf("Error in handler: %v", err)
  2264  		}
  2265  	case <-time.After(2 * time.Second):
  2266  		t.Error("timeout waiting for handler to finish")
  2267  	}
  2268  }
  2269  
  2270  // readBodyHandler returns an http Handler func that reads len(want)
  2271  // bytes from r.Body and fails t if the contents read were not
  2272  // the value of want.
  2273  func readBodyHandler(t *testing.T, want string) func(w http.ResponseWriter, r *http.Request) {
  2274  	return func(w http.ResponseWriter, r *http.Request) {
  2275  		buf := make([]byte, len(want))
  2276  		_, err := io.ReadFull(r.Body, buf)
  2277  		if err != nil {
  2278  			t.Error(err)
  2279  			return
  2280  		}
  2281  		if string(buf) != want {
  2282  			t.Errorf("read %q; want %q", buf, want)
  2283  		}
  2284  	}
  2285  }
  2286  
  2287  // TestServerWithCurl currently fails, hence the LenientCipherSuites test. See:
  2288  //   https://github.com/tatsuhiro-t/nghttp2/issues/140 &
  2289  //   http://sourceforge.net/p/curl/bugs/1472/
  2290  func TestServerWithCurl(t *testing.T)                     { testServerWithCurl(t, false) }
  2291  func TestServerWithCurl_LenientCipherSuites(t *testing.T) { testServerWithCurl(t, true) }
  2292  
  2293  func testServerWithCurl(t *testing.T, permitProhibitedCipherSuites bool) {
  2294  	if runtime.GOOS != "linux" {
  2295  		t.Skip("skipping Docker test when not on Linux; requires --net which won't work with boot2docker anyway")
  2296  	}
  2297  	if testing.Short() {
  2298  		t.Skip("skipping curl test in short mode")
  2299  	}
  2300  	requireCurl(t)
  2301  	var gotConn int32
  2302  	testHookOnConn = func() { atomic.StoreInt32(&gotConn, 1) }
  2303  
  2304  	const msg = "Hello from curl!\n"
  2305  	ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  2306  		w.Header().Set("Foo", "Bar")
  2307  		w.Header().Set("Client-Proto", r.Proto)
  2308  		io.WriteString(w, msg)
  2309  	}))
  2310  	ConfigureServer(ts.Config, &Server{
  2311  		PermitProhibitedCipherSuites: permitProhibitedCipherSuites,
  2312  	})
  2313  	ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config
  2314  	ts.StartTLS()
  2315  	defer ts.Close()
  2316  
  2317  	t.Logf("Running test server for curl to hit at: %s", ts.URL)
  2318  	container := curl(t, "--silent", "--http2", "--insecure", "-v", ts.URL)
  2319  	defer kill(container)
  2320  	resc := make(chan interface{}, 1)
  2321  	go func() {
  2322  		res, err := dockerLogs(container)
  2323  		if err != nil {
  2324  			resc <- err
  2325  		} else {
  2326  			resc <- res
  2327  		}
  2328  	}()
  2329  	select {
  2330  	case res := <-resc:
  2331  		if err, ok := res.(error); ok {
  2332  			t.Fatal(err)
  2333  		}
  2334  		body := string(res.([]byte))
  2335  		// Search for both "key: value" and "key:value", since curl changed their format
  2336  		// Our Dockerfile contains the latest version (no space), but just in case people
  2337  		// didn't rebuild, check both.
  2338  		if !strings.Contains(body, "foo: Bar") && !strings.Contains(body, "foo:Bar") {
  2339  			t.Errorf("didn't see foo: Bar header")
  2340  			t.Logf("Got: %s", body)
  2341  		}
  2342  		if !strings.Contains(body, "client-proto: HTTP/2") && !strings.Contains(body, "client-proto:HTTP/2") {
  2343  			t.Errorf("didn't see client-proto: HTTP/2 header")
  2344  			t.Logf("Got: %s", res)
  2345  		}
  2346  		if !strings.Contains(string(res.([]byte)), msg) {
  2347  			t.Errorf("didn't see %q content", msg)
  2348  			t.Logf("Got: %s", res)
  2349  		}
  2350  	case <-time.After(3 * time.Second):
  2351  		t.Errorf("timeout waiting for curl")
  2352  	}
  2353  
  2354  	if atomic.LoadInt32(&gotConn) == 0 {
  2355  		t.Error("never saw an http2 connection")
  2356  	}
  2357  }
  2358  
  2359  var doh2load = flag.Bool("h2load", false, "Run h2load test")
  2360  
  2361  func TestServerWithH2Load(t *testing.T) {
  2362  	if !*doh2load {
  2363  		t.Skip("Skipping without --h2load flag.")
  2364  	}
  2365  	if runtime.GOOS != "linux" {
  2366  		t.Skip("skipping Docker test when not on Linux; requires --net which won't work with boot2docker anyway")
  2367  	}
  2368  	requireH2load(t)
  2369  
  2370  	msg := strings.Repeat("Hello, h2load!\n", 5000)
  2371  	ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  2372  		io.WriteString(w, msg)
  2373  		w.(http.Flusher).Flush()
  2374  		io.WriteString(w, msg)
  2375  	}))
  2376  	ts.StartTLS()
  2377  	defer ts.Close()
  2378  
  2379  	cmd := exec.Command("docker", "run", "--net=host", "--entrypoint=/usr/local/bin/h2load", "gohttp2/curl",
  2380  		"-n100000", "-c100", "-m100", ts.URL)
  2381  	cmd.Stdout = os.Stdout
  2382  	cmd.Stderr = os.Stderr
  2383  	if err := cmd.Run(); err != nil {
  2384  		t.Fatal(err)
  2385  	}
  2386  }
  2387  
  2388  // Issue 12843
  2389  func TestServerDoS_MaxHeaderListSize(t *testing.T) {
  2390  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {})
  2391  	defer st.Close()
  2392  
  2393  	// shake hands
  2394  	st.writePreface()
  2395  	st.writeInitialSettings()
  2396  	frameSize := defaultMaxReadFrameSize
  2397  	var advHeaderListSize *uint32
  2398  	st.wantSettings().ForeachSetting(func(s Setting) error {
  2399  		switch s.ID {
  2400  		case SettingMaxFrameSize:
  2401  			if s.Val < minMaxFrameSize {
  2402  				frameSize = minMaxFrameSize
  2403  			} else if s.Val > maxFrameSize {
  2404  				frameSize = maxFrameSize
  2405  			} else {
  2406  				frameSize = int(s.Val)
  2407  			}
  2408  		case SettingMaxHeaderListSize:
  2409  			advHeaderListSize = &s.Val
  2410  		}
  2411  		return nil
  2412  	})
  2413  	st.writeSettingsAck()
  2414  	st.wantSettingsAck()
  2415  
  2416  	if advHeaderListSize == nil {
  2417  		t.Errorf("server didn't advertise a max header list size")
  2418  	} else if *advHeaderListSize == 0 {
  2419  		t.Errorf("server advertised a max header list size of 0")
  2420  	}
  2421  
  2422  	st.encodeHeaderField(":method", "GET")
  2423  	st.encodeHeaderField(":path", "/")
  2424  	st.encodeHeaderField(":scheme", "https")
  2425  	cookie := strings.Repeat("*", 4058)
  2426  	st.encodeHeaderField("cookie", cookie)
  2427  	st.writeHeaders(HeadersFrameParam{
  2428  		StreamID:      1,
  2429  		BlockFragment: st.headerBuf.Bytes(),
  2430  		EndStream:     true,
  2431  		EndHeaders:    false,
  2432  	})
  2433  
  2434  	// Capture the short encoding of a duplicate ~4K cookie, now
  2435  	// that we've already sent it once.
  2436  	st.headerBuf.Reset()
  2437  	st.encodeHeaderField("cookie", cookie)
  2438  
  2439  	// Now send 1MB of it.
  2440  	const size = 1 << 20
  2441  	b := bytes.Repeat(st.headerBuf.Bytes(), size/st.headerBuf.Len())
  2442  	for len(b) > 0 {
  2443  		chunk := b
  2444  		if len(chunk) > frameSize {
  2445  			chunk = chunk[:frameSize]
  2446  		}
  2447  		b = b[len(chunk):]
  2448  		st.fr.WriteContinuation(1, len(b) == 0, chunk)
  2449  	}
  2450  
  2451  	h := st.wantHeaders()
  2452  	if !h.HeadersEnded() {
  2453  		t.Fatalf("Got HEADERS without END_HEADERS set: %v", h)
  2454  	}
  2455  	headers := st.decodeHeader(h.HeaderBlockFragment())
  2456  	want := [][2]string{
  2457  		{":status", "431"},
  2458  		{"content-type", "text/html; charset=utf-8"},
  2459  		{"content-length", "63"},
  2460  	}
  2461  	if !reflect.DeepEqual(headers, want) {
  2462  		t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want)
  2463  	}
  2464  }
  2465  
  2466  func TestCompressionErrorOnWrite(t *testing.T) {
  2467  	const maxStrLen = 8 << 10
  2468  	var serverConfig *http.Server
  2469  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  2470  		// No response body.
  2471  	}, func(ts *httptest.Server) {
  2472  		serverConfig = ts.Config
  2473  		serverConfig.MaxHeaderBytes = maxStrLen
  2474  	})
  2475  	defer st.Close()
  2476  	st.greet()
  2477  
  2478  	maxAllowed := st.sc.maxHeaderStringLen()
  2479  
  2480  	// Crank this up, now that we have a conn connected with the
  2481  	// hpack.Decoder's max string length set has been initialized
  2482  	// from the earlier low ~8K value. We want this higher so don't
  2483  	// hit the max header list size. We only want to test hitting
  2484  	// the max string size.
  2485  	serverConfig.MaxHeaderBytes = 1 << 20
  2486  
  2487  	// First a request with a header that's exactly the max allowed size.
  2488  	hbf := st.encodeHeader("foo", strings.Repeat("a", maxAllowed))
  2489  	st.writeHeaders(HeadersFrameParam{
  2490  		StreamID:      1,
  2491  		BlockFragment: hbf,
  2492  		EndStream:     true,
  2493  		EndHeaders:    true,
  2494  	})
  2495  	h := st.wantHeaders()
  2496  	if !h.HeadersEnded() || !h.StreamEnded() {
  2497  		t.Errorf("Unexpected HEADER frame %v", h)
  2498  	}
  2499  
  2500  	// And now send one that's just one byte too big.
  2501  	hbf = st.encodeHeader("bar", strings.Repeat("b", maxAllowed+1))
  2502  	st.writeHeaders(HeadersFrameParam{
  2503  		StreamID:      3,
  2504  		BlockFragment: hbf,
  2505  		EndStream:     true,
  2506  		EndHeaders:    true,
  2507  	})
  2508  	ga := st.wantGoAway()
  2509  	if ga.ErrCode != ErrCodeCompression {
  2510  		t.Errorf("GOAWAY err = %v; want ErrCodeCompression", ga.ErrCode)
  2511  	}
  2512  }
  2513  
  2514  func TestCompressionErrorOnClose(t *testing.T) {
  2515  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  2516  		// No response body.
  2517  	})
  2518  	defer st.Close()
  2519  	st.greet()
  2520  
  2521  	hbf := st.encodeHeader("foo", "bar")
  2522  	hbf = hbf[:len(hbf)-1] // truncate one byte from the end, so hpack.Decoder.Close fails.
  2523  	st.writeHeaders(HeadersFrameParam{
  2524  		StreamID:      1,
  2525  		BlockFragment: hbf,
  2526  		EndStream:     true,
  2527  		EndHeaders:    true,
  2528  	})
  2529  	ga := st.wantGoAway()
  2530  	if ga.ErrCode != ErrCodeCompression {
  2531  		t.Errorf("GOAWAY err = %v; want ErrCodeCompression", ga.ErrCode)
  2532  	}
  2533  }
  2534  
  2535  // test that a server handler can read trailers from a client
  2536  func TestServerReadsTrailers(t *testing.T) {
  2537  	const testBody = "some test body"
  2538  	writeReq := func(st *serverTester) {
  2539  		st.writeHeaders(HeadersFrameParam{
  2540  			StreamID:      1, // clients send odd numbers
  2541  			BlockFragment: st.encodeHeader("trailer", "Foo, Bar", "trailer", "Baz"),
  2542  			EndStream:     false,
  2543  			EndHeaders:    true,
  2544  		})
  2545  		st.writeData(1, false, []byte(testBody))
  2546  		st.writeHeaders(HeadersFrameParam{
  2547  			StreamID: 1, // clients send odd numbers
  2548  			BlockFragment: st.encodeHeaderRaw(
  2549  				"foo", "foov",
  2550  				"bar", "barv",
  2551  				"baz", "bazv",
  2552  				"surprise", "wasn't declared; shouldn't show up",
  2553  			),
  2554  			EndStream:  true,
  2555  			EndHeaders: true,
  2556  		})
  2557  	}
  2558  	checkReq := func(r *http.Request) {
  2559  		wantTrailer := http.Header{
  2560  			"Foo": nil,
  2561  			"Bar": nil,
  2562  			"Baz": nil,
  2563  		}
  2564  		if !reflect.DeepEqual(r.Trailer, wantTrailer) {
  2565  			t.Errorf("initial Trailer = %v; want %v", r.Trailer, wantTrailer)
  2566  		}
  2567  		slurp, err := ioutil.ReadAll(r.Body)
  2568  		if string(slurp) != testBody {
  2569  			t.Errorf("read body %q; want %q", slurp, testBody)
  2570  		}
  2571  		if err != nil {
  2572  			t.Fatalf("Body slurp: %v", err)
  2573  		}
  2574  		wantTrailerAfter := http.Header{
  2575  			"Foo": {"foov"},
  2576  			"Bar": {"barv"},
  2577  			"Baz": {"bazv"},
  2578  		}
  2579  		if !reflect.DeepEqual(r.Trailer, wantTrailerAfter) {
  2580  			t.Errorf("final Trailer = %v; want %v", r.Trailer, wantTrailerAfter)
  2581  		}
  2582  	}
  2583  	testServerRequest(t, writeReq, checkReq)
  2584  }
  2585  
  2586  // test that a server handler can send trailers
  2587  func TestServerWritesTrailers_WithFlush(t *testing.T)    { testServerWritesTrailers(t, true) }
  2588  func TestServerWritesTrailers_WithoutFlush(t *testing.T) { testServerWritesTrailers(t, false) }
  2589  
  2590  func testServerWritesTrailers(t *testing.T, withFlush bool) {
  2591  	// See https://httpwg.github.io/specs/rfc7540.html#rfc.section.8.1.3
  2592  	testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  2593  		w.Header().Set("Trailer", "Server-Trailer-A, Server-Trailer-B")
  2594  		w.Header().Add("Trailer", "Server-Trailer-C")
  2595  
  2596  		// TODO: decide if the server should filter these while
  2597  		// writing the Trailer header in the response. Currently it
  2598  		// appears net/http doesn't do this for http/1.1
  2599  		w.Header().Add("Trailer", "Transfer-Encoding, Content-Length, Trailer") // filtered
  2600  		w.Header().Set("Foo", "Bar")
  2601  		w.Header().Set("Content-Length", "5")
  2602  
  2603  		io.WriteString(w, "Hello")
  2604  		if withFlush {
  2605  			w.(http.Flusher).Flush()
  2606  		}
  2607  		w.Header().Set("Server-Trailer-A", "valuea")
  2608  		w.Header().Set("Server-Trailer-C", "valuec") // skipping B
  2609  		w.Header().Set("Server-Surpise", "surprise! this isn't predeclared!")
  2610  		w.Header().Set("Transfer-Encoding", "should not be included; Forbidden by RFC 2616 14.40")
  2611  		w.Header().Set("Content-Length", "should not be included; Forbidden by RFC 2616 14.40")
  2612  		w.Header().Set("Trailer", "should not be included; Forbidden by RFC 2616 14.40")
  2613  		return nil
  2614  	}, func(st *serverTester) {
  2615  		getSlash(st)
  2616  		hf := st.wantHeaders()
  2617  		if hf.StreamEnded() {
  2618  			t.Fatal("response HEADERS had END_STREAM")
  2619  		}
  2620  		if !hf.HeadersEnded() {
  2621  			t.Fatal("response HEADERS didn't have END_HEADERS")
  2622  		}
  2623  		goth := st.decodeHeader(hf.HeaderBlockFragment())
  2624  		wanth := [][2]string{
  2625  			{":status", "200"},
  2626  			{"foo", "Bar"},
  2627  			{"trailer", "Server-Trailer-A, Server-Trailer-B"},
  2628  			{"trailer", "Server-Trailer-C"},
  2629  			{"trailer", "Transfer-Encoding, Content-Length, Trailer"},
  2630  			{"content-type", "text/plain; charset=utf-8"},
  2631  			{"content-length", "5"},
  2632  		}
  2633  		if !reflect.DeepEqual(goth, wanth) {
  2634  			t.Errorf("Header mismatch.\n got: %v\nwant: %v", goth, wanth)
  2635  		}
  2636  		df := st.wantData()
  2637  		if string(df.Data()) != "Hello" {
  2638  			t.Fatalf("Client read %q; want Hello", df.Data())
  2639  		}
  2640  		if df.StreamEnded() {
  2641  			t.Fatalf("data frame had STREAM_ENDED")
  2642  		}
  2643  		tf := st.wantHeaders() // for the trailers
  2644  		if !tf.StreamEnded() {
  2645  			t.Fatalf("trailers HEADERS lacked END_STREAM")
  2646  		}
  2647  		if !tf.HeadersEnded() {
  2648  			t.Fatalf("trailers HEADERS lacked END_HEADERS")
  2649  		}
  2650  		wanth = [][2]string{
  2651  			{"server-trailer-a", "valuea"},
  2652  			{"server-trailer-c", "valuec"},
  2653  		}
  2654  		goth = st.decodeHeader(tf.HeaderBlockFragment())
  2655  		if !reflect.DeepEqual(goth, wanth) {
  2656  			t.Errorf("Header mismatch.\n got: %v\nwant: %v", goth, wanth)
  2657  		}
  2658  	})
  2659  }
  2660  
  2661  func BenchmarkServerGets(b *testing.B) {
  2662  	b.ReportAllocs()
  2663  
  2664  	const msg = "Hello, world"
  2665  	st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) {
  2666  		io.WriteString(w, msg)
  2667  	})
  2668  	defer st.Close()
  2669  	st.greet()
  2670  
  2671  	// Give the server quota to reply. (plus it has the the 64KB)
  2672  	if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil {
  2673  		b.Fatal(err)
  2674  	}
  2675  
  2676  	for i := 0; i < b.N; i++ {
  2677  		id := 1 + uint32(i)*2
  2678  		st.writeHeaders(HeadersFrameParam{
  2679  			StreamID:      id,
  2680  			BlockFragment: st.encodeHeader(),
  2681  			EndStream:     true,
  2682  			EndHeaders:    true,
  2683  		})
  2684  		st.wantHeaders()
  2685  		df := st.wantData()
  2686  		if !df.StreamEnded() {
  2687  			b.Fatalf("DATA didn't have END_STREAM; got %v", df)
  2688  		}
  2689  	}
  2690  }
  2691  
  2692  func BenchmarkServerPosts(b *testing.B) {
  2693  	b.ReportAllocs()
  2694  
  2695  	const msg = "Hello, world"
  2696  	st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) {
  2697  		io.WriteString(w, msg)
  2698  	})
  2699  	defer st.Close()
  2700  	st.greet()
  2701  
  2702  	// Give the server quota to reply. (plus it has the the 64KB)
  2703  	if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil {
  2704  		b.Fatal(err)
  2705  	}
  2706  
  2707  	for i := 0; i < b.N; i++ {
  2708  		id := 1 + uint32(i)*2
  2709  		st.writeHeaders(HeadersFrameParam{
  2710  			StreamID:      id,
  2711  			BlockFragment: st.encodeHeader(":method", "POST"),
  2712  			EndStream:     false,
  2713  			EndHeaders:    true,
  2714  		})
  2715  		st.writeData(id, true, nil)
  2716  		st.wantHeaders()
  2717  		df := st.wantData()
  2718  		if !df.StreamEnded() {
  2719  			b.Fatalf("DATA didn't have END_STREAM; got %v", df)
  2720  		}
  2721  	}
  2722  }
  2723  
  2724  // go-fuzz bug, originally reported at https://github.com/bradfitz/http2/issues/53
  2725  // Verify we don't hang.
  2726  func TestIssue53(t *testing.T) {
  2727  	const data = "PRI * HTTP/2.0\r\n\r\nSM" +
  2728  		"\r\n\r\n\x00\x00\x00\x01\ainfinfin\ad"
  2729  	s := &http.Server{
  2730  		ErrorLog: log.New(io.MultiWriter(stderrv(), twriter{t: t}), "", log.LstdFlags),
  2731  	}
  2732  	s2 := &Server{MaxReadFrameSize: 1 << 16, PermitProhibitedCipherSuites: true}
  2733  	c := &issue53Conn{[]byte(data), false, false}
  2734  	s2.handleConn(s, c, http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
  2735  		w.Write([]byte("hello"))
  2736  	}))
  2737  	if !c.closed {
  2738  		t.Fatal("connection is not closed")
  2739  	}
  2740  }
  2741  
  2742  type issue53Conn struct {
  2743  	data    []byte
  2744  	closed  bool
  2745  	written bool
  2746  }
  2747  
  2748  func (c *issue53Conn) Read(b []byte) (n int, err error) {
  2749  	if len(c.data) == 0 {
  2750  		return 0, io.EOF
  2751  	}
  2752  	n = copy(b, c.data)
  2753  	c.data = c.data[n:]
  2754  	return
  2755  }
  2756  
  2757  func (c *issue53Conn) Write(b []byte) (n int, err error) {
  2758  	c.written = true
  2759  	return len(b), nil
  2760  }
  2761  
  2762  func (c *issue53Conn) Close() error {
  2763  	c.closed = true
  2764  	return nil
  2765  }
  2766  
  2767  func (c *issue53Conn) LocalAddr() net.Addr                { return &net.TCPAddr{net.IP{127, 0, 0, 1}, 49706, ""} }
  2768  func (c *issue53Conn) RemoteAddr() net.Addr               { return &net.TCPAddr{net.IP{127, 0, 0, 1}, 49706, ""} }
  2769  func (c *issue53Conn) SetDeadline(t time.Time) error      { return nil }
  2770  func (c *issue53Conn) SetReadDeadline(t time.Time) error  { return nil }
  2771  func (c *issue53Conn) SetWriteDeadline(t time.Time) error { return nil }
  2772  
  2773  // golang.org/issue/12895
  2774  func TestConfigureServer(t *testing.T) {
  2775  	tests := []struct {
  2776  		name    string
  2777  		in      http.Server
  2778  		wantErr string
  2779  	}{
  2780  		{
  2781  			name: "empty server",
  2782  			in:   http.Server{},
  2783  		},
  2784  		{
  2785  			name: "just the required cipher suite",
  2786  			in: http.Server{
  2787  				TLSConfig: &tls.Config{
  2788  					CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
  2789  				},
  2790  			},
  2791  		},
  2792  		{
  2793  			name: "missing required cipher suite",
  2794  			in: http.Server{
  2795  				TLSConfig: &tls.Config{
  2796  					CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384},
  2797  				},
  2798  			},
  2799  			wantErr: "is missing HTTP/2-required TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
  2800  		},
  2801  		{
  2802  			name: "required after bad",
  2803  			in: http.Server{
  2804  				TLSConfig: &tls.Config{
  2805  					CipherSuites: []uint16{tls.TLS_RSA_WITH_RC4_128_SHA, tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
  2806  				},
  2807  			},
  2808  			wantErr: "contains an HTTP/2-approved cipher suite (0xc02f), but it comes after",
  2809  		},
  2810  		{
  2811  			name: "bad after required",
  2812  			in: http.Server{
  2813  				TLSConfig: &tls.Config{
  2814  					CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, tls.TLS_RSA_WITH_RC4_128_SHA},
  2815  				},
  2816  			},
  2817  		},
  2818  	}
  2819  	for _, tt := range tests {
  2820  		err := ConfigureServer(&tt.in, nil)
  2821  		if (err != nil) != (tt.wantErr != "") {
  2822  			if tt.wantErr != "" {
  2823  				t.Errorf("%s: success, but want error", tt.name)
  2824  			} else {
  2825  				t.Errorf("%s: unexpected error: %v", tt.name, err)
  2826  			}
  2827  		}
  2828  		if err != nil && tt.wantErr != "" && !strings.Contains(err.Error(), tt.wantErr) {
  2829  			t.Errorf("%s: err = %v; want substring %q", tt.name, err, tt.wantErr)
  2830  		}
  2831  		if err == nil && !tt.in.TLSConfig.PreferServerCipherSuites {
  2832  			t.Errorf("%s: PreferServerCipherSuite is false; want true", tt.name)
  2833  		}
  2834  	}
  2835  }
  2836  
  2837  func TestServerRejectHeadWithBody(t *testing.T) {
  2838  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  2839  		// No response body.
  2840  	})
  2841  	defer st.Close()
  2842  	st.greet()
  2843  	st.writeHeaders(HeadersFrameParam{
  2844  		StreamID:      1, // clients send odd numbers
  2845  		BlockFragment: st.encodeHeader(":method", "HEAD"),
  2846  		EndStream:     false, // what we're testing, a bogus HEAD request with body
  2847  		EndHeaders:    true,
  2848  	})
  2849  	st.wantRSTStream(1, ErrCodeProtocol)
  2850  }
  2851  
  2852  func TestServerNoAutoContentLengthOnHead(t *testing.T) {
  2853  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  2854  		// No response body. (or smaller than one frame)
  2855  	})
  2856  	defer st.Close()
  2857  	st.greet()
  2858  	st.writeHeaders(HeadersFrameParam{
  2859  		StreamID:      1, // clients send odd numbers
  2860  		BlockFragment: st.encodeHeader(":method", "HEAD"),
  2861  		EndStream:     true,
  2862  		EndHeaders:    true,
  2863  	})
  2864  	h := st.wantHeaders()
  2865  	headers := st.decodeHeader(h.HeaderBlockFragment())
  2866  	want := [][2]string{
  2867  		{":status", "200"},
  2868  		{"content-type", "text/plain; charset=utf-8"},
  2869  	}
  2870  	if !reflect.DeepEqual(headers, want) {
  2871  		t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want)
  2872  	}
  2873  }
  2874  
  2875  // golang.org/issue/13495
  2876  func TestServerNoDuplicateContentType(t *testing.T) {
  2877  	st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  2878  		w.Header()["Content-Type"] = []string{""}
  2879  		fmt.Fprintf(w, "<html><head></head><body>hi</body></html>")
  2880  	})
  2881  	defer st.Close()
  2882  	st.greet()
  2883  	st.writeHeaders(HeadersFrameParam{
  2884  		StreamID:      1,
  2885  		BlockFragment: st.encodeHeader(),
  2886  		EndStream:     true,
  2887  		EndHeaders:    true,
  2888  	})
  2889  	h := st.wantHeaders()
  2890  	headers := st.decodeHeader(h.HeaderBlockFragment())
  2891  	want := [][2]string{
  2892  		{":status", "200"},
  2893  		{"content-type", ""},
  2894  		{"content-length", "41"},
  2895  	}
  2896  	if !reflect.DeepEqual(headers, want) {
  2897  		t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want)
  2898  	}
  2899  }