server_test.go 34 KB

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