server_test.go 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225
  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. // See https://code.google.com/p/go/source/browse/CONTRIBUTORS
  5. // Licensed under the same terms as Go itself:
  6. // https://code.google.com/p/go/source/browse/LICENSE
  7. package http2
  8. import (
  9. "bytes"
  10. "crypto/tls"
  11. "errors"
  12. "fmt"
  13. "io"
  14. "io/ioutil"
  15. "log"
  16. "net"
  17. "net/http"
  18. "net/http/httptest"
  19. "os"
  20. "reflect"
  21. "strconv"
  22. "strings"
  23. "sync/atomic"
  24. "testing"
  25. "time"
  26. "github.com/bradfitz/http2/hpack"
  27. )
  28. type serverTester struct {
  29. cc net.Conn // client conn
  30. t *testing.T
  31. ts *httptest.Server
  32. fr *Framer
  33. logBuf *bytes.Buffer
  34. }
  35. func newServerTester(t *testing.T, handler http.HandlerFunc) *serverTester {
  36. logBuf := new(bytes.Buffer)
  37. ts := httptest.NewUnstartedServer(handler)
  38. ConfigureServer(ts.Config, &Server{})
  39. ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config
  40. ts.Config.ErrorLog = log.New(io.MultiWriter(twriter{t: t}, logBuf), "", log.LstdFlags)
  41. ts.StartTLS()
  42. if VerboseLogs {
  43. t.Logf("Running test server at: %s", ts.URL)
  44. }
  45. cc, err := tls.Dial("tcp", ts.Listener.Addr().String(), &tls.Config{
  46. InsecureSkipVerify: true,
  47. NextProtos: []string{npnProto},
  48. })
  49. if err != nil {
  50. t.Fatal(err)
  51. }
  52. log.SetOutput(twriter{t})
  53. return &serverTester{
  54. t: t,
  55. ts: ts,
  56. cc: cc,
  57. fr: NewFramer(cc, cc),
  58. logBuf: logBuf,
  59. }
  60. }
  61. func (st *serverTester) Close() {
  62. st.ts.Close()
  63. st.cc.Close()
  64. log.SetOutput(os.Stderr)
  65. }
  66. // greet initiates the client's HTTP/2 connection into a state where
  67. // frames may be sent.
  68. func (st *serverTester) greet() {
  69. st.writePreface()
  70. st.writeInitialSettings()
  71. st.wantSettings()
  72. st.writeSettingsAck()
  73. st.wantSettingsAck()
  74. }
  75. func (st *serverTester) writePreface() {
  76. n, err := st.cc.Write(clientPreface)
  77. if err != nil {
  78. st.t.Fatalf("Error writing client preface: %v", err)
  79. }
  80. if n != len(clientPreface) {
  81. st.t.Fatalf("Writing client preface, wrote %d bytes; want %d", n, len(clientPreface))
  82. }
  83. }
  84. func (st *serverTester) writeInitialSettings() {
  85. if err := st.fr.WriteSettings(); err != nil {
  86. st.t.Fatalf("Error writing initial SETTINGS frame from client to server: %v", err)
  87. }
  88. }
  89. func (st *serverTester) writeSettingsAck() {
  90. if err := st.fr.WriteSettingsAck(); err != nil {
  91. st.t.Fatalf("Error writing ACK of server's SETTINGS: %v", err)
  92. }
  93. }
  94. func (st *serverTester) writeHeaders(p HeadersFrameParam) {
  95. if err := st.fr.WriteHeaders(p); err != nil {
  96. st.t.Fatalf("Error writing HEADERS: %v", err)
  97. }
  98. }
  99. // bodylessReq1 writes a HEADERS frames with StreamID 1 and EndStream and EndHeaders set.
  100. func (st *serverTester) bodylessReq1(headers ...string) {
  101. st.writeHeaders(HeadersFrameParam{
  102. StreamID: 1, // clients send odd numbers
  103. BlockFragment: encodeHeader(st.t, headers...),
  104. EndStream: true,
  105. EndHeaders: true,
  106. })
  107. }
  108. func (st *serverTester) writeData(streamID uint32, endStream bool, data []byte) {
  109. if err := st.fr.WriteData(streamID, endStream, data); err != nil {
  110. st.t.Fatalf("Error writing DATA: %v", err)
  111. }
  112. }
  113. func (st *serverTester) readFrame() (Frame, error) {
  114. frc := make(chan Frame, 1)
  115. errc := make(chan error, 1)
  116. go func() {
  117. fr, err := st.fr.ReadFrame()
  118. if err != nil {
  119. errc <- err
  120. } else {
  121. frc <- fr
  122. }
  123. }()
  124. t := time.NewTimer(2 * time.Second)
  125. defer t.Stop()
  126. select {
  127. case f := <-frc:
  128. return f, nil
  129. case err := <-errc:
  130. return nil, err
  131. case <-t.C:
  132. return nil, errors.New("timeout waiting for frame")
  133. }
  134. }
  135. func (st *serverTester) wantHeaders() *HeadersFrame {
  136. f, err := st.readFrame()
  137. if err != nil {
  138. st.t.Fatalf("Error while expecting a HEADERS frame: %v", err)
  139. }
  140. hf, ok := f.(*HeadersFrame)
  141. if !ok {
  142. st.t.Fatalf("got a %T; want *HeadersFrame", f)
  143. }
  144. return hf
  145. }
  146. func (st *serverTester) wantData() *DataFrame {
  147. f, err := st.readFrame()
  148. if err != nil {
  149. st.t.Fatalf("Error while expecting a DATA frame: %v", err)
  150. }
  151. df, ok := f.(*DataFrame)
  152. if !ok {
  153. st.t.Fatalf("got a %T; want *DataFrame", f)
  154. }
  155. return df
  156. }
  157. func (st *serverTester) wantSettings() *SettingsFrame {
  158. f, err := st.readFrame()
  159. if err != nil {
  160. st.t.Fatalf("Error while expecting a SETTINGS frame: %v", err)
  161. }
  162. sf, ok := f.(*SettingsFrame)
  163. if !ok {
  164. st.t.Fatalf("got a %T; want *SettingsFrame", f)
  165. }
  166. return sf
  167. }
  168. func (st *serverTester) wantPing() *PingFrame {
  169. f, err := st.readFrame()
  170. if err != nil {
  171. st.t.Fatalf("Error while expecting a PING frame: %v", err)
  172. }
  173. pf, ok := f.(*PingFrame)
  174. if !ok {
  175. st.t.Fatalf("got a %T; want *PingFrame", f)
  176. }
  177. return pf
  178. }
  179. func (st *serverTester) wantRSTStream(streamID uint32, errCode ErrCode) {
  180. f, err := st.readFrame()
  181. if err != nil {
  182. st.t.Fatalf("Error while expecting an RSTStream frame: %v", err)
  183. }
  184. rs, ok := f.(*RSTStreamFrame)
  185. if !ok {
  186. st.t.Fatalf("got a %T; want *RSTStreamFrame", f)
  187. }
  188. if rs.FrameHeader.StreamID != streamID {
  189. st.t.Fatalf("RSTStream StreamID = %d; want %d", rs.FrameHeader.StreamID, streamID)
  190. }
  191. if rs.ErrCode != uint32(errCode) {
  192. st.t.Fatalf("RSTStream ErrCode = %d (%s); want %d (%s)", rs.ErrCode, rs.ErrCode, errCode, errCode)
  193. }
  194. }
  195. func (st *serverTester) wantWindowUpdate(streamID, incr uint32) {
  196. f, err := st.readFrame()
  197. if err != nil {
  198. st.t.Fatalf("Error while expecting an RSTStream frame: %v", err)
  199. }
  200. wu, ok := f.(*WindowUpdateFrame)
  201. if !ok {
  202. st.t.Fatalf("got a %T; want *WindowUpdateFrame", f)
  203. }
  204. if wu.FrameHeader.StreamID != streamID {
  205. st.t.Fatalf("WindowUpdate StreamID = %d; want %d", wu.FrameHeader.StreamID, streamID)
  206. }
  207. if wu.Increment != incr {
  208. st.t.Fatalf("WindowUpdate increment = %d; want %d", wu.Increment, incr)
  209. }
  210. }
  211. func (st *serverTester) wantSettingsAck() {
  212. f, err := st.readFrame()
  213. if err != nil {
  214. st.t.Fatal(err)
  215. }
  216. sf, ok := f.(*SettingsFrame)
  217. if !ok {
  218. st.t.Fatalf("Wanting a settings ACK, received a %T", f)
  219. }
  220. if !sf.Header().Flags.Has(FlagSettingsAck) {
  221. st.t.Fatal("Settings Frame didn't have ACK set")
  222. }
  223. }
  224. func TestServer(t *testing.T) {
  225. gotReq := make(chan bool, 1)
  226. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  227. w.Header().Set("Foo", "Bar")
  228. gotReq <- true
  229. })
  230. defer st.Close()
  231. covers("3.5", `
  232. The server connection preface consists of a potentially empty
  233. SETTINGS frame ([SETTINGS]) that MUST be the first frame the
  234. server sends in the HTTP/2 connection.
  235. `)
  236. st.writePreface()
  237. st.writeInitialSettings()
  238. st.wantSettings().ForeachSetting(func(s Setting) error {
  239. t.Logf("Server sent setting %v = %v", s.ID, s.Val)
  240. return nil
  241. })
  242. st.writeSettingsAck()
  243. st.wantSettingsAck()
  244. st.writeHeaders(HeadersFrameParam{
  245. StreamID: 1, // clients send odd numbers
  246. BlockFragment: encodeHeader(t),
  247. EndStream: true, // no DATA frames
  248. EndHeaders: true,
  249. })
  250. select {
  251. case <-gotReq:
  252. case <-time.After(2 * time.Second):
  253. t.Error("timeout waiting for request")
  254. }
  255. }
  256. func TestServer_Request_Get(t *testing.T) {
  257. testServerRequest(t, func(st *serverTester) {
  258. st.writeHeaders(HeadersFrameParam{
  259. StreamID: 1, // clients send odd numbers
  260. BlockFragment: encodeHeader(t, "foo-bar", "some-value"),
  261. EndStream: true, // no DATA frames
  262. EndHeaders: true,
  263. })
  264. }, func(r *http.Request) {
  265. if r.Method != "GET" {
  266. t.Errorf("Method = %q; want GET", r.Method)
  267. }
  268. if r.URL.Path != "/" {
  269. t.Errorf("URL.Path = %q; want /", r.URL.Path)
  270. }
  271. if r.ContentLength != 0 {
  272. t.Errorf("ContentLength = %v; want 0", r.ContentLength)
  273. }
  274. if r.Close {
  275. t.Error("Close = true; want false")
  276. }
  277. if !strings.Contains(r.RemoteAddr, ":") {
  278. t.Errorf("RemoteAddr = %q; want something with a colon", r.RemoteAddr)
  279. }
  280. if r.Proto != "HTTP/2.0" || r.ProtoMajor != 2 || r.ProtoMinor != 0 {
  281. t.Errorf("Proto = %q Major=%v,Minor=%v; want HTTP/2.0", r.Proto, r.ProtoMajor, r.ProtoMinor)
  282. }
  283. wantHeader := http.Header{
  284. "Foo-Bar": []string{"some-value"},
  285. }
  286. if !reflect.DeepEqual(r.Header, wantHeader) {
  287. t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
  288. }
  289. if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 {
  290. t.Errorf("Read = %d, %v; want 0, EOF", n, err)
  291. }
  292. })
  293. }
  294. func TestServer_Request_Get_PathSlashes(t *testing.T) {
  295. testServerRequest(t, func(st *serverTester) {
  296. st.writeHeaders(HeadersFrameParam{
  297. StreamID: 1, // clients send odd numbers
  298. BlockFragment: encodeHeader(t, ":path", "/%2f/"),
  299. EndStream: true, // no DATA frames
  300. EndHeaders: true,
  301. })
  302. }, func(r *http.Request) {
  303. if r.RequestURI != "/%2f/" {
  304. t.Errorf("RequestURI = %q; want /%2f/", r.RequestURI)
  305. }
  306. if r.URL.Path != "///" {
  307. t.Errorf("URL.Path = %q; want ///", r.URL.Path)
  308. }
  309. })
  310. }
  311. // TODO: add a test with EndStream=true on the HEADERS but setting a
  312. // Content-Length anyway. Should we just omit it and force it to
  313. // zero?
  314. func TestServer_Request_Post_NoContentLength_EndStream(t *testing.T) {
  315. testServerRequest(t, func(st *serverTester) {
  316. st.writeHeaders(HeadersFrameParam{
  317. StreamID: 1, // clients send odd numbers
  318. BlockFragment: encodeHeader(t, ":method", "POST"),
  319. EndStream: true,
  320. EndHeaders: true,
  321. })
  322. }, func(r *http.Request) {
  323. if r.Method != "POST" {
  324. t.Errorf("Method = %q; want POST", r.Method)
  325. }
  326. if r.ContentLength != 0 {
  327. t.Errorf("ContentLength = %v; want 0", r.ContentLength)
  328. }
  329. if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 {
  330. t.Errorf("Read = %d, %v; want 0, EOF", n, err)
  331. }
  332. })
  333. }
  334. func TestServer_Request_Post_Body_ImmediateEOF(t *testing.T) {
  335. testBodyContents(t, -1, "", func(st *serverTester) {
  336. st.writeHeaders(HeadersFrameParam{
  337. StreamID: 1, // clients send odd numbers
  338. BlockFragment: encodeHeader(t, ":method", "POST"),
  339. EndStream: false, // to say DATA frames are coming
  340. EndHeaders: true,
  341. })
  342. st.writeData(1, true, nil) // just kidding. empty body.
  343. })
  344. }
  345. func TestServer_Request_Post_Body_OneData(t *testing.T) {
  346. const content = "Some content"
  347. testBodyContents(t, -1, content, func(st *serverTester) {
  348. st.writeHeaders(HeadersFrameParam{
  349. StreamID: 1, // clients send odd numbers
  350. BlockFragment: encodeHeader(t, ":method", "POST"),
  351. EndStream: false, // to say DATA frames are coming
  352. EndHeaders: true,
  353. })
  354. st.writeData(1, true, []byte(content))
  355. })
  356. }
  357. func TestServer_Request_Post_Body_TwoData(t *testing.T) {
  358. const content = "Some content"
  359. testBodyContents(t, -1, content, func(st *serverTester) {
  360. st.writeHeaders(HeadersFrameParam{
  361. StreamID: 1, // clients send odd numbers
  362. BlockFragment: encodeHeader(t, ":method", "POST"),
  363. EndStream: false, // to say DATA frames are coming
  364. EndHeaders: true,
  365. })
  366. st.writeData(1, false, []byte(content[:5]))
  367. st.writeData(1, true, []byte(content[5:]))
  368. })
  369. }
  370. func TestServer_Request_Post_Body_ContentLength_Correct(t *testing.T) {
  371. const content = "Some content"
  372. testBodyContents(t, int64(len(content)), content, func(st *serverTester) {
  373. st.writeHeaders(HeadersFrameParam{
  374. StreamID: 1, // clients send odd numbers
  375. BlockFragment: encodeHeader(t,
  376. ":method", "POST",
  377. "content-length", strconv.Itoa(len(content)),
  378. ),
  379. EndStream: false, // to say DATA frames are coming
  380. EndHeaders: true,
  381. })
  382. st.writeData(1, true, []byte(content))
  383. })
  384. }
  385. func TestServer_Request_Post_Body_ContentLength_TooLarge(t *testing.T) {
  386. testBodyContentsFail(t, 3, "Request declared a Content-Length of 3 but only wrote 2 bytes",
  387. func(st *serverTester) {
  388. st.writeHeaders(HeadersFrameParam{
  389. StreamID: 1, // clients send odd numbers
  390. BlockFragment: encodeHeader(t,
  391. ":method", "POST",
  392. "content-length", "3",
  393. ),
  394. EndStream: false, // to say DATA frames are coming
  395. EndHeaders: true,
  396. })
  397. st.writeData(1, true, []byte("12"))
  398. })
  399. }
  400. func TestServer_Request_Post_Body_ContentLength_TooSmall(t *testing.T) {
  401. testBodyContentsFail(t, 4, "Sender tried to send more than declared Content-Length of 4 bytes",
  402. func(st *serverTester) {
  403. st.writeHeaders(HeadersFrameParam{
  404. StreamID: 1, // clients send odd numbers
  405. BlockFragment: encodeHeader(t,
  406. ":method", "POST",
  407. "content-length", "4",
  408. ),
  409. EndStream: false, // to say DATA frames are coming
  410. EndHeaders: true,
  411. })
  412. st.writeData(1, true, []byte("12345"))
  413. })
  414. }
  415. func testBodyContents(t *testing.T, wantContentLength int64, wantBody string, write func(st *serverTester)) {
  416. testServerRequest(t, write, func(r *http.Request) {
  417. if r.Method != "POST" {
  418. t.Errorf("Method = %q; want POST", r.Method)
  419. }
  420. if r.ContentLength != wantContentLength {
  421. t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength)
  422. }
  423. all, err := ioutil.ReadAll(r.Body)
  424. if err != nil {
  425. t.Fatal(err)
  426. }
  427. if string(all) != wantBody {
  428. t.Errorf("Read = %q; want %q", all, wantBody)
  429. }
  430. if err := r.Body.Close(); err != nil {
  431. t.Fatalf("Close: %v", err)
  432. }
  433. })
  434. }
  435. func testBodyContentsFail(t *testing.T, wantContentLength int64, wantReadError string, write func(st *serverTester)) {
  436. testServerRequest(t, write, func(r *http.Request) {
  437. if r.Method != "POST" {
  438. t.Errorf("Method = %q; want POST", r.Method)
  439. }
  440. if r.ContentLength != wantContentLength {
  441. t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength)
  442. }
  443. all, err := ioutil.ReadAll(r.Body)
  444. if err == nil {
  445. t.Fatalf("expected an error (%q) reading from the body. Successfully read %q instead.",
  446. wantReadError, all)
  447. }
  448. if !strings.Contains(err.Error(), wantReadError) {
  449. t.Fatalf("Body.Read = %v; want substring %q", err, wantReadError)
  450. }
  451. if err := r.Body.Close(); err != nil {
  452. t.Fatalf("Close: %v", err)
  453. }
  454. })
  455. }
  456. // Using a Host header, instead of :authority
  457. func TestServer_Request_Get_Host(t *testing.T) {
  458. const host = "example.com"
  459. testServerRequest(t, func(st *serverTester) {
  460. st.writeHeaders(HeadersFrameParam{
  461. StreamID: 1, // clients send odd numbers
  462. BlockFragment: encodeHeader(t, "host", host),
  463. EndStream: true,
  464. EndHeaders: true,
  465. })
  466. }, func(r *http.Request) {
  467. if r.Host != host {
  468. t.Errorf("Host = %q; want %q", r.Host, host)
  469. }
  470. })
  471. }
  472. // Using an :authority pseudo-header, instead of Host
  473. func TestServer_Request_Get_Authority(t *testing.T) {
  474. const host = "example.com"
  475. testServerRequest(t, func(st *serverTester) {
  476. st.writeHeaders(HeadersFrameParam{
  477. StreamID: 1, // clients send odd numbers
  478. BlockFragment: encodeHeader(t, ":authority", host),
  479. EndStream: true,
  480. EndHeaders: true,
  481. })
  482. }, func(r *http.Request) {
  483. if r.Host != host {
  484. t.Errorf("Host = %q; want %q", r.Host, host)
  485. }
  486. })
  487. }
  488. func TestServer_Request_WithContinuation(t *testing.T) {
  489. wantHeader := http.Header{
  490. "Foo-One": []string{"value-one"},
  491. "Foo-Two": []string{"value-two"},
  492. "Foo-Three": []string{"value-three"},
  493. }
  494. testServerRequest(t, func(st *serverTester) {
  495. fullHeaders := encodeHeader(t,
  496. "foo-one", "value-one",
  497. "foo-two", "value-two",
  498. "foo-three", "value-three",
  499. )
  500. remain := fullHeaders
  501. chunks := 0
  502. for len(remain) > 0 {
  503. const maxChunkSize = 5
  504. chunk := remain
  505. if len(chunk) > maxChunkSize {
  506. chunk = chunk[:maxChunkSize]
  507. }
  508. remain = remain[len(chunk):]
  509. if chunks == 0 {
  510. st.writeHeaders(HeadersFrameParam{
  511. StreamID: 1, // clients send odd numbers
  512. BlockFragment: chunk,
  513. EndStream: true, // no DATA frames
  514. EndHeaders: false, // we'll have continuation frames
  515. })
  516. } else {
  517. err := st.fr.WriteContinuation(1, len(remain) == 0, chunk)
  518. if err != nil {
  519. t.Fatal(err)
  520. }
  521. }
  522. chunks++
  523. }
  524. if chunks < 2 {
  525. t.Fatal("too few chunks")
  526. }
  527. }, func(r *http.Request) {
  528. if !reflect.DeepEqual(r.Header, wantHeader) {
  529. t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
  530. }
  531. })
  532. }
  533. // Concatenated cookie headers. ("8.1.2.5 Compressing the Cookie Header Field")
  534. func TestServer_Request_CookieConcat(t *testing.T) {
  535. const host = "example.com"
  536. testServerRequest(t, func(st *serverTester) {
  537. st.bodylessReq1(
  538. ":authority", host,
  539. "cookie", "a=b",
  540. "cookie", "c=d",
  541. "cookie", "e=f",
  542. )
  543. }, func(r *http.Request) {
  544. const want = "a=b; c=d; e=f"
  545. if got := r.Header.Get("Cookie"); got != want {
  546. t.Errorf("Cookie = %q; want %q", got, want)
  547. }
  548. })
  549. }
  550. func TestServer_Request_Reject_CapitalHeader(t *testing.T) {
  551. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("UPPER", "v") })
  552. }
  553. func TestServer_Request_Reject_Pseudo_Missing_method(t *testing.T) {
  554. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "") })
  555. }
  556. func TestServer_Request_Reject_Pseudo_ExactlyOne(t *testing.T) {
  557. // 8.1.2.3 Request Pseudo-Header Fields
  558. // "All HTTP/2 requests MUST include exactly one valid value" ...
  559. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "GET", ":method", "POST") })
  560. }
  561. func TestServer_Request_Reject_Pseudo_AfterRegular(t *testing.T) {
  562. // 8.1.2.3 Request Pseudo-Header Fields
  563. // "All pseudo-header fields MUST appear in the header block
  564. // before regular header fields. Any request or response that
  565. // contains a pseudo-header field that appears in a header
  566. // block after a regular header field MUST be treated as
  567. // malformed (Section 8.1.2.6)."
  568. testRejectRequest(t, func(st *serverTester) {
  569. var buf bytes.Buffer
  570. enc := hpack.NewEncoder(&buf)
  571. enc.WriteField(hpack.HeaderField{Name: ":method", Value: "GET"})
  572. enc.WriteField(hpack.HeaderField{Name: "regular", Value: "foobar"})
  573. enc.WriteField(hpack.HeaderField{Name: ":path", Value: "/"})
  574. enc.WriteField(hpack.HeaderField{Name: ":scheme", Value: "https"})
  575. st.writeHeaders(HeadersFrameParam{
  576. StreamID: 1, // clients send odd numbers
  577. BlockFragment: buf.Bytes(),
  578. EndStream: true,
  579. EndHeaders: true,
  580. })
  581. })
  582. }
  583. func TestServer_Request_Reject_Pseudo_Missing_path(t *testing.T) {
  584. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":path", "") })
  585. }
  586. func TestServer_Request_Reject_Pseudo_Missing_scheme(t *testing.T) {
  587. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "") })
  588. }
  589. func TestServer_Request_Reject_Pseudo_scheme_invalid(t *testing.T) {
  590. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "bogus") })
  591. }
  592. func TestServer_Request_Reject_Pseudo_Unknown(t *testing.T) {
  593. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":unknown_thing", "") })
  594. }
  595. func testRejectRequest(t *testing.T, send func(*serverTester)) {
  596. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  597. t.Fatal("server request made it to handler; should've been rejected")
  598. })
  599. defer st.Close()
  600. st.greet()
  601. send(st)
  602. st.wantRSTStream(1, ErrCodeProtocol)
  603. }
  604. func TestServer_Ping(t *testing.T) {
  605. st := newServerTester(t, nil)
  606. defer st.Close()
  607. st.greet()
  608. // Server should ignore this one, since it has ACK set.
  609. ackPingData := [8]byte{1, 2, 4, 8, 16, 32, 64, 128}
  610. if err := st.fr.WritePing(true, ackPingData); err != nil {
  611. t.Fatal(err)
  612. }
  613. // But the server should reply to this one, since ACK is false.
  614. pingData := [8]byte{1, 2, 3, 4, 5, 6, 7, 8}
  615. if err := st.fr.WritePing(false, pingData); err != nil {
  616. t.Fatal(err)
  617. }
  618. pf := st.wantPing()
  619. if !pf.Flags.Has(FlagPingAck) {
  620. t.Error("response ping doesn't have ACK set")
  621. }
  622. if pf.Data != pingData {
  623. t.Errorf("response ping has data %q; want %q", pf.Data, pingData)
  624. }
  625. }
  626. func TestServer_Handler_Sends_WindowUpdate(t *testing.T) {
  627. puppet := newHandlerPuppet()
  628. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  629. puppet.act(w, r)
  630. })
  631. defer st.Close()
  632. defer puppet.done()
  633. st.greet()
  634. st.writeHeaders(HeadersFrameParam{
  635. StreamID: 1, // clients send odd numbers
  636. BlockFragment: encodeHeader(t, ":method", "POST"),
  637. EndStream: false, // data coming
  638. EndHeaders: true,
  639. })
  640. st.writeData(1, true, []byte("abcdef"))
  641. puppet.do(func(w http.ResponseWriter, r *http.Request) {
  642. buf := make([]byte, 3)
  643. _, err := io.ReadFull(r.Body, buf)
  644. if err != nil {
  645. t.Error(err)
  646. return
  647. }
  648. if string(buf) != "abc" {
  649. t.Errorf("read %q; want abc", buf)
  650. }
  651. })
  652. st.wantWindowUpdate(0, 3)
  653. st.wantWindowUpdate(1, 3)
  654. puppet.do(func(w http.ResponseWriter, r *http.Request) {
  655. buf := make([]byte, 3)
  656. _, err := io.ReadFull(r.Body, buf)
  657. if err != nil {
  658. t.Error(err)
  659. return
  660. }
  661. if string(buf) != "def" {
  662. t.Errorf("read %q; want abc", buf)
  663. }
  664. })
  665. st.wantWindowUpdate(0, 3)
  666. st.wantWindowUpdate(1, 3)
  667. }
  668. // TODO: test HEADERS w/o EndHeaders + another HEADERS (should get rejected)
  669. // TODO: test HEADERS w/ EndHeaders + a continuation HEADERS (should get rejected)
  670. // testServerRequest sets up an idle HTTP/2 connection and lets you
  671. // write a single request with writeReq, and then verify that the
  672. // *http.Request is built correctly in checkReq.
  673. func testServerRequest(t *testing.T, writeReq func(*serverTester), checkReq func(*http.Request)) {
  674. gotReq := make(chan bool, 1)
  675. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  676. if r.Body == nil {
  677. t.Fatal("nil Body")
  678. }
  679. checkReq(r)
  680. gotReq <- true
  681. })
  682. defer st.Close()
  683. st.greet()
  684. writeReq(st)
  685. select {
  686. case <-gotReq:
  687. case <-time.After(2 * time.Second):
  688. t.Error("timeout waiting for request")
  689. }
  690. }
  691. func getSlash(st *serverTester) { st.bodylessReq1() }
  692. func TestServer_Response_NoData(t *testing.T) {
  693. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  694. // Nothing.
  695. return nil
  696. }, func(st *serverTester) {
  697. getSlash(st)
  698. hf := st.wantHeaders()
  699. if !hf.StreamEnded() {
  700. t.Fatal("want END_STREAM flag")
  701. }
  702. if !hf.HeadersEnded() {
  703. t.Fatal("want END_HEADERS flag")
  704. }
  705. })
  706. }
  707. func TestServer_Response_NoData_Header_FooBar(t *testing.T) {
  708. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  709. w.Header().Set("Foo-Bar", "some-value")
  710. return nil
  711. }, func(st *serverTester) {
  712. getSlash(st)
  713. hf := st.wantHeaders()
  714. if !hf.StreamEnded() {
  715. t.Fatal("want END_STREAM flag")
  716. }
  717. if !hf.HeadersEnded() {
  718. t.Fatal("want END_HEADERS flag")
  719. }
  720. goth := decodeHeader(t, hf.HeaderBlockFragment())
  721. wanth := [][2]string{
  722. {":status", "200"},
  723. {"foo-bar", "some-value"},
  724. {"content-type", "text/plain; charset=utf-8"},
  725. {"content-length", "0"},
  726. }
  727. if !reflect.DeepEqual(goth, wanth) {
  728. t.Errorf("Got headers %v; want %v", goth, wanth)
  729. }
  730. })
  731. }
  732. func TestServer_Response_Data_Sniff_DoesntOverride(t *testing.T) {
  733. const msg = "<html>this is HTML."
  734. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  735. w.Header().Set("Content-Type", "foo/bar")
  736. io.WriteString(w, msg)
  737. return nil
  738. }, func(st *serverTester) {
  739. getSlash(st)
  740. hf := st.wantHeaders()
  741. if hf.StreamEnded() {
  742. t.Fatal("don't want END_STREAM, expecting data")
  743. }
  744. if !hf.HeadersEnded() {
  745. t.Fatal("want END_HEADERS flag")
  746. }
  747. goth := decodeHeader(t, hf.HeaderBlockFragment())
  748. wanth := [][2]string{
  749. {":status", "200"},
  750. {"content-type", "foo/bar"},
  751. {"content-length", strconv.Itoa(len(msg))},
  752. }
  753. if !reflect.DeepEqual(goth, wanth) {
  754. t.Errorf("Got headers %v; want %v", goth, wanth)
  755. }
  756. df := st.wantData()
  757. if !df.StreamEnded() {
  758. t.Error("expected DATA to have END_STREAM flag")
  759. }
  760. if got := string(df.Data()); got != msg {
  761. t.Errorf("got DATA %q; want %q", got, msg)
  762. }
  763. })
  764. }
  765. func TestServer_Response_TransferEncoding_chunked(t *testing.T) {
  766. const msg = "hi"
  767. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  768. w.Header().Set("Transfer-Encoding", "chunked") // should be stripped
  769. io.WriteString(w, msg)
  770. return nil
  771. }, func(st *serverTester) {
  772. getSlash(st)
  773. hf := st.wantHeaders()
  774. goth := decodeHeader(t, hf.HeaderBlockFragment())
  775. wanth := [][2]string{
  776. {":status", "200"},
  777. {"content-type", "text/plain; charset=utf-8"},
  778. {"content-length", strconv.Itoa(len(msg))},
  779. }
  780. if !reflect.DeepEqual(goth, wanth) {
  781. t.Errorf("Got headers %v; want %v", goth, wanth)
  782. }
  783. })
  784. }
  785. // Header accessed only after the initial write.
  786. func TestServer_Response_Data_IgnoreHeaderAfterWrite_After(t *testing.T) {
  787. const msg = "<html>this is HTML."
  788. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  789. io.WriteString(w, msg)
  790. w.Header().Set("foo", "should be ignored")
  791. return nil
  792. }, func(st *serverTester) {
  793. getSlash(st)
  794. hf := st.wantHeaders()
  795. if hf.StreamEnded() {
  796. t.Fatal("unexpected END_STREAM")
  797. }
  798. if !hf.HeadersEnded() {
  799. t.Fatal("want END_HEADERS flag")
  800. }
  801. goth := decodeHeader(t, hf.HeaderBlockFragment())
  802. wanth := [][2]string{
  803. {":status", "200"},
  804. {"content-type", "text/html; charset=utf-8"},
  805. {"content-length", strconv.Itoa(len(msg))},
  806. }
  807. if !reflect.DeepEqual(goth, wanth) {
  808. t.Errorf("Got headers %v; want %v", goth, wanth)
  809. }
  810. })
  811. }
  812. // Header accessed before the initial write and later mutated.
  813. func TestServer_Response_Data_IgnoreHeaderAfterWrite_Overwrite(t *testing.T) {
  814. const msg = "<html>this is HTML."
  815. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  816. w.Header().Set("foo", "proper value")
  817. io.WriteString(w, msg)
  818. w.Header().Set("foo", "should be ignored")
  819. return nil
  820. }, func(st *serverTester) {
  821. getSlash(st)
  822. hf := st.wantHeaders()
  823. if hf.StreamEnded() {
  824. t.Fatal("unexpected END_STREAM")
  825. }
  826. if !hf.HeadersEnded() {
  827. t.Fatal("want END_HEADERS flag")
  828. }
  829. goth := decodeHeader(t, hf.HeaderBlockFragment())
  830. wanth := [][2]string{
  831. {":status", "200"},
  832. {"foo", "proper value"},
  833. {"content-type", "text/html; charset=utf-8"},
  834. {"content-length", strconv.Itoa(len(msg))},
  835. }
  836. if !reflect.DeepEqual(goth, wanth) {
  837. t.Errorf("Got headers %v; want %v", goth, wanth)
  838. }
  839. })
  840. }
  841. func TestServer_Response_Data_SniffLenType(t *testing.T) {
  842. const msg = "<html>this is HTML."
  843. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  844. io.WriteString(w, msg)
  845. return nil
  846. }, func(st *serverTester) {
  847. getSlash(st)
  848. hf := st.wantHeaders()
  849. if hf.StreamEnded() {
  850. t.Fatal("don't want END_STREAM, expecting data")
  851. }
  852. if !hf.HeadersEnded() {
  853. t.Fatal("want END_HEADERS flag")
  854. }
  855. goth := decodeHeader(t, hf.HeaderBlockFragment())
  856. wanth := [][2]string{
  857. {":status", "200"},
  858. {"content-type", "text/html; charset=utf-8"},
  859. {"content-length", strconv.Itoa(len(msg))},
  860. }
  861. if !reflect.DeepEqual(goth, wanth) {
  862. t.Errorf("Got headers %v; want %v", goth, wanth)
  863. }
  864. df := st.wantData()
  865. if !df.StreamEnded() {
  866. t.Error("expected DATA to have END_STREAM flag")
  867. }
  868. if got := string(df.Data()); got != msg {
  869. t.Errorf("got DATA %q; want %q", got, msg)
  870. }
  871. })
  872. }
  873. func TestServer_Response_Header_Flush_MidWrite(t *testing.T) {
  874. const msg = "<html>this is HTML"
  875. const msg2 = ", and this is the next chunk"
  876. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  877. io.WriteString(w, msg)
  878. w.(http.Flusher).Flush()
  879. io.WriteString(w, msg2)
  880. return nil
  881. }, func(st *serverTester) {
  882. getSlash(st)
  883. hf := st.wantHeaders()
  884. if hf.StreamEnded() {
  885. t.Fatal("unexpected END_STREAM flag")
  886. }
  887. if !hf.HeadersEnded() {
  888. t.Fatal("want END_HEADERS flag")
  889. }
  890. goth := decodeHeader(t, hf.HeaderBlockFragment())
  891. wanth := [][2]string{
  892. {":status", "200"},
  893. {"content-type", "text/html; charset=utf-8"}, // sniffed
  894. // and no content-length
  895. }
  896. if !reflect.DeepEqual(goth, wanth) {
  897. t.Errorf("Got headers %v; want %v", goth, wanth)
  898. }
  899. {
  900. df := st.wantData()
  901. if df.StreamEnded() {
  902. t.Error("unexpected END_STREAM flag")
  903. }
  904. if got := string(df.Data()); got != msg {
  905. t.Errorf("got DATA %q; want %q", got, msg)
  906. }
  907. }
  908. {
  909. df := st.wantData()
  910. if !df.StreamEnded() {
  911. t.Error("wanted END_STREAM flag on last data chunk")
  912. }
  913. if got := string(df.Data()); got != msg2 {
  914. t.Errorf("got DATA %q; want %q", got, msg2)
  915. }
  916. }
  917. })
  918. }
  919. func TestServer_Response_LargeWrite(t *testing.T) {
  920. const size = 1 << 20
  921. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  922. n, err := w.Write(bytes.Repeat([]byte("a"), size))
  923. if err != nil {
  924. return fmt.Errorf("Write error: %v", err)
  925. }
  926. if n != size {
  927. return fmt.Errorf("wrong size %d from Write", n)
  928. }
  929. return nil
  930. }, func(st *serverTester) {
  931. getSlash(st) // make the single request
  932. hf := st.wantHeaders()
  933. if hf.StreamEnded() {
  934. t.Fatal("unexpected END_STREAM flag")
  935. }
  936. if !hf.HeadersEnded() {
  937. t.Fatal("want END_HEADERS flag")
  938. }
  939. goth := decodeHeader(t, hf.HeaderBlockFragment())
  940. wanth := [][2]string{
  941. {":status", "200"},
  942. {"content-type", "text/plain; charset=utf-8"}, // sniffed
  943. // and no content-length
  944. }
  945. if !reflect.DeepEqual(goth, wanth) {
  946. t.Errorf("Got headers %v; want %v", goth, wanth)
  947. }
  948. var bytes, frames int
  949. for {
  950. df := st.wantData()
  951. bytes += len(df.Data())
  952. frames++
  953. // TODO: send WINDOW_UPDATE frames at the server to keep it from stalling
  954. for _, b := range df.Data() {
  955. if b != 'a' {
  956. t.Fatal("non-'a' byte seen in DATA")
  957. }
  958. }
  959. if df.StreamEnded() {
  960. break
  961. }
  962. }
  963. if bytes != size {
  964. t.Errorf("Got %d bytes; want %d", bytes, size)
  965. }
  966. if want := 257; frames != want {
  967. t.Errorf("Got %d frames; want %d", frames, size)
  968. }
  969. })
  970. }
  971. func TestServer_Response_Automatic100Continue(t *testing.T) {
  972. const msg = "foo"
  973. const reply = "bar"
  974. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  975. if v := r.Header.Get("Expect"); v != "" {
  976. t.Errorf("Expect header = %q; want empty", v)
  977. }
  978. buf := make([]byte, len(msg))
  979. // This read should trigger the 100-continue being sent.
  980. if n, err := io.ReadFull(r.Body, buf); err != nil || n != len(msg) || string(buf) != msg {
  981. return fmt.Errorf("ReadFull = %q, %v; want %q, nil", buf[:n], err, msg)
  982. }
  983. _, err := io.WriteString(w, reply)
  984. return err
  985. }, func(st *serverTester) {
  986. st.writeHeaders(HeadersFrameParam{
  987. StreamID: 1, // clients send odd numbers
  988. BlockFragment: encodeHeader(st.t, ":method", "POST", "expect", "100-continue"),
  989. EndStream: false,
  990. EndHeaders: true,
  991. })
  992. hf := st.wantHeaders()
  993. if hf.StreamEnded() {
  994. t.Fatal("unexpected END_STREAM flag")
  995. }
  996. if !hf.HeadersEnded() {
  997. t.Fatal("want END_HEADERS flag")
  998. }
  999. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1000. wanth := [][2]string{
  1001. {":status", "100"},
  1002. }
  1003. if !reflect.DeepEqual(goth, wanth) {
  1004. t.Fatalf("Got headers %v; want %v", goth, wanth)
  1005. }
  1006. // Okay, they sent status 100, so we can send our
  1007. // gigantic and/or sensitive "foo" payload now.
  1008. st.writeData(1, true, []byte(msg))
  1009. st.wantWindowUpdate(0, uint32(len(msg)))
  1010. st.wantWindowUpdate(1, uint32(len(msg)))
  1011. hf = st.wantHeaders()
  1012. if hf.StreamEnded() {
  1013. t.Fatal("expected data to follow")
  1014. }
  1015. if !hf.HeadersEnded() {
  1016. t.Fatal("want END_HEADERS flag")
  1017. }
  1018. goth = decodeHeader(t, hf.HeaderBlockFragment())
  1019. wanth = [][2]string{
  1020. {":status", "200"},
  1021. {"content-type", "text/plain; charset=utf-8"},
  1022. {"content-length", strconv.Itoa(len(reply))},
  1023. }
  1024. if !reflect.DeepEqual(goth, wanth) {
  1025. t.Errorf("Got headers %v; want %v", goth, wanth)
  1026. }
  1027. df := st.wantData()
  1028. if string(df.Data()) != reply {
  1029. t.Errorf("Client read %q; want %q", df.Data(), reply)
  1030. }
  1031. if !df.StreamEnded() {
  1032. t.Errorf("expect data stream end")
  1033. }
  1034. })
  1035. }
  1036. func decodeHeader(t *testing.T, headerBlock []byte) (pairs [][2]string) {
  1037. d := hpack.NewDecoder(initialHeaderTableSize, func(f hpack.HeaderField) {
  1038. pairs = append(pairs, [2]string{f.Name, f.Value})
  1039. })
  1040. if _, err := d.Write(headerBlock); err != nil {
  1041. t.Fatalf("hpack decoding error: %v", err)
  1042. }
  1043. if err := d.Close(); err != nil {
  1044. t.Fatalf("hpack decoding error: %v", err)
  1045. }
  1046. return
  1047. }
  1048. // testServerResponse sets up an idle HTTP/2 connection and lets you
  1049. // write a single request with writeReq, and then reply to it in some way with the provided handler,
  1050. // and then verify the output with the serverTester again (assuming the handler returns nil)
  1051. func testServerResponse(t *testing.T,
  1052. handler func(http.ResponseWriter, *http.Request) error,
  1053. client func(*serverTester),
  1054. ) {
  1055. errc := make(chan error, 1)
  1056. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1057. if r.Body == nil {
  1058. t.Fatal("nil Body")
  1059. }
  1060. errc <- handler(w, r)
  1061. })
  1062. defer st.Close()
  1063. donec := make(chan bool)
  1064. go func() {
  1065. defer close(donec)
  1066. st.greet()
  1067. client(st)
  1068. }()
  1069. select {
  1070. case <-donec:
  1071. return
  1072. case <-time.After(5 * time.Second):
  1073. t.Fatal("timeout")
  1074. }
  1075. select {
  1076. case err := <-errc:
  1077. if err != nil {
  1078. t.Fatalf("Error in handler: %v", err)
  1079. }
  1080. case <-time.After(2 * time.Second):
  1081. t.Error("timeout waiting for handler to finish")
  1082. }
  1083. }
  1084. func TestServerWithCurl(t *testing.T) {
  1085. requireCurl(t)
  1086. ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  1087. // TODO: add a bunch of different tests with different
  1088. // behavior, as a function of r or a table.
  1089. // -- with request body, without.
  1090. // -- no interaction with w.
  1091. // -- panic
  1092. // -- modify Header only, but no writes or writeheader (this test)
  1093. // -- WriteHeader only
  1094. // -- Write only
  1095. // -- WriteString
  1096. // -- both
  1097. // -- huge headers over a frame size so we get continuation headers.
  1098. // Look at net/http's Server tests for inspiration.
  1099. w.Header().Set("Foo", "Bar")
  1100. }))
  1101. ConfigureServer(ts.Config, &Server{})
  1102. ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config
  1103. ts.StartTLS()
  1104. defer ts.Close()
  1105. var gotConn int32
  1106. testHookOnConn = func() { atomic.StoreInt32(&gotConn, 1) }
  1107. t.Logf("Running test server for curl to hit at: %s", ts.URL)
  1108. container := curl(t, "--silent", "--http2", "--insecure", "-v", ts.URL)
  1109. defer kill(container)
  1110. resc := make(chan interface{}, 1)
  1111. go func() {
  1112. res, err := dockerLogs(container)
  1113. if err != nil {
  1114. resc <- err
  1115. } else {
  1116. resc <- res
  1117. }
  1118. }()
  1119. select {
  1120. case res := <-resc:
  1121. if err, ok := res.(error); ok {
  1122. t.Fatal(err)
  1123. }
  1124. if !strings.Contains(string(res.([]byte)), "< foo:Bar") {
  1125. t.Errorf("didn't see foo:Bar header")
  1126. t.Logf("Got: %s", res)
  1127. }
  1128. case <-time.After(3 * time.Second):
  1129. t.Errorf("timeout waiting for curl")
  1130. }
  1131. if atomic.LoadInt32(&gotConn) == 0 {
  1132. t.Error("never saw an http2 connection")
  1133. }
  1134. }