http2_test.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  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. "flag"
  13. "fmt"
  14. "io"
  15. "io/ioutil"
  16. "log"
  17. "net"
  18. "net/http"
  19. "net/http/httptest"
  20. "os"
  21. "os/exec"
  22. "reflect"
  23. "strconv"
  24. "strings"
  25. "sync/atomic"
  26. "testing"
  27. "time"
  28. "github.com/bradfitz/http2/hpack"
  29. )
  30. func init() {
  31. DebugGoroutines = true
  32. flag.BoolVar(&VerboseLogs, "verboseh2", false, "Verbose HTTP/2 debug logging")
  33. }
  34. type serverTester struct {
  35. cc net.Conn // client conn
  36. t *testing.T
  37. ts *httptest.Server
  38. fr *Framer
  39. logBuf *bytes.Buffer
  40. }
  41. func newServerTester(t *testing.T, handler http.HandlerFunc) *serverTester {
  42. logBuf := new(bytes.Buffer)
  43. ts := httptest.NewUnstartedServer(handler)
  44. ConfigureServer(ts.Config, &Server{})
  45. ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config
  46. ts.Config.ErrorLog = log.New(io.MultiWriter(twriter{t: t}, logBuf), "", log.LstdFlags)
  47. ts.StartTLS()
  48. if VerboseLogs {
  49. t.Logf("Running test server at: %s", ts.URL)
  50. }
  51. cc, err := tls.Dial("tcp", ts.Listener.Addr().String(), &tls.Config{
  52. InsecureSkipVerify: true,
  53. NextProtos: []string{npnProto},
  54. })
  55. if err != nil {
  56. t.Fatal(err)
  57. }
  58. log.SetOutput(twriter{t})
  59. return &serverTester{
  60. t: t,
  61. ts: ts,
  62. cc: cc,
  63. fr: NewFramer(cc, cc),
  64. logBuf: logBuf,
  65. }
  66. }
  67. func (st *serverTester) Close() {
  68. st.ts.Close()
  69. st.cc.Close()
  70. log.SetOutput(os.Stderr)
  71. }
  72. // greet initiates the client's HTTP/2 connection into a state where
  73. // frames may be sent.
  74. func (st *serverTester) greet() {
  75. st.writePreface()
  76. st.writeInitialSettings()
  77. st.wantSettings()
  78. st.writeSettingsAck()
  79. st.wantSettingsAck()
  80. }
  81. func (st *serverTester) writePreface() {
  82. n, err := st.cc.Write(clientPreface)
  83. if err != nil {
  84. st.t.Fatalf("Error writing client preface: %v", err)
  85. }
  86. if n != len(clientPreface) {
  87. st.t.Fatalf("Writing client preface, wrote %d bytes; want %d", n, len(clientPreface))
  88. }
  89. }
  90. func (st *serverTester) writeInitialSettings() {
  91. if err := st.fr.WriteSettings(); err != nil {
  92. st.t.Fatalf("Error writing initial SETTINGS frame from client to server: %v", err)
  93. }
  94. }
  95. func (st *serverTester) writeSettingsAck() {
  96. if err := st.fr.WriteSettingsAck(); err != nil {
  97. st.t.Fatalf("Error writing ACK of server's SETTINGS: %v", err)
  98. }
  99. }
  100. func (st *serverTester) writeHeaders(p HeadersFrameParam) {
  101. if err := st.fr.WriteHeaders(p); err != nil {
  102. st.t.Fatalf("Error writing HEADERS: %v", err)
  103. }
  104. }
  105. // bodylessReq1 writes a HEADERS frames with StreamID 1 and EndStream and EndHeaders set.
  106. func (st *serverTester) bodylessReq1(headers ...string) {
  107. st.writeHeaders(HeadersFrameParam{
  108. StreamID: 1, // clients send odd numbers
  109. BlockFragment: encodeHeader(st.t, headers...),
  110. EndStream: true,
  111. EndHeaders: true,
  112. })
  113. }
  114. func (st *serverTester) writeData(streamID uint32, endStream bool, data []byte) {
  115. if err := st.fr.WriteData(streamID, endStream, data); err != nil {
  116. st.t.Fatalf("Error writing DATA: %v", err)
  117. }
  118. }
  119. func (st *serverTester) readFrame() (Frame, error) {
  120. frc := make(chan Frame, 1)
  121. errc := make(chan error, 1)
  122. go func() {
  123. fr, err := st.fr.ReadFrame()
  124. if err != nil {
  125. errc <- err
  126. } else {
  127. frc <- fr
  128. }
  129. }()
  130. t := time.NewTimer(2 * time.Second)
  131. defer t.Stop()
  132. select {
  133. case f := <-frc:
  134. return f, nil
  135. case err := <-errc:
  136. return nil, err
  137. case <-t.C:
  138. return nil, errors.New("timeout waiting for frame")
  139. }
  140. }
  141. func (st *serverTester) wantSettings() *SettingsFrame {
  142. f, err := st.readFrame()
  143. if err != nil {
  144. st.t.Fatalf("Error while expecting a SETTINGS frame: %v", err)
  145. }
  146. sf, ok := f.(*SettingsFrame)
  147. if !ok {
  148. st.t.Fatalf("got a %T; want *SettingsFrame", f)
  149. }
  150. return sf
  151. }
  152. func (st *serverTester) wantPing() *PingFrame {
  153. f, err := st.readFrame()
  154. if err != nil {
  155. st.t.Fatalf("Error while expecting a PING frame: %v", err)
  156. }
  157. pf, ok := f.(*PingFrame)
  158. if !ok {
  159. st.t.Fatalf("got a %T; want *PingFrame", f)
  160. }
  161. return pf
  162. }
  163. func (st *serverTester) wantRSTStream(streamID uint32, errCode ErrCode) {
  164. f, err := st.readFrame()
  165. if err != nil {
  166. st.t.Fatalf("Error while expecting an RSTStream frame: %v", err)
  167. }
  168. rs, ok := f.(*RSTStreamFrame)
  169. if !ok {
  170. st.t.Fatalf("got a %T; want *RSTStream", f)
  171. }
  172. if rs.FrameHeader.StreamID != streamID {
  173. st.t.Fatalf("RSTStream StreamID = %d; want %d", rs.FrameHeader.StreamID, streamID)
  174. }
  175. if rs.ErrCode != uint32(errCode) {
  176. st.t.Fatalf("RSTStream ErrCode = %d (%s); want %d (%s)", rs.ErrCode, rs.ErrCode, errCode, errCode)
  177. }
  178. }
  179. func (st *serverTester) wantSettingsAck() {
  180. f, err := st.readFrame()
  181. if err != nil {
  182. st.t.Fatal(err)
  183. }
  184. sf, ok := f.(*SettingsFrame)
  185. if !ok {
  186. st.t.Fatalf("Wanting a settings ACK, received a %T", f)
  187. }
  188. if !sf.Header().Flags.Has(FlagSettingsAck) {
  189. st.t.Fatal("Settings Frame didn't have ACK set")
  190. }
  191. }
  192. func TestServer(t *testing.T) {
  193. gotReq := make(chan bool, 1)
  194. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  195. w.Header().Set("Foo", "Bar")
  196. gotReq <- true
  197. })
  198. defer st.Close()
  199. covers("3.5", `
  200. The server connection preface consists of a potentially empty
  201. SETTINGS frame ([SETTINGS]) that MUST be the first frame the
  202. server sends in the HTTP/2 connection.
  203. `)
  204. st.writePreface()
  205. st.writeInitialSettings()
  206. st.wantSettings().ForeachSetting(func(s Setting) error {
  207. t.Logf("Server sent setting %v = %v", s.ID, s.Val)
  208. return nil
  209. })
  210. st.writeSettingsAck()
  211. st.wantSettingsAck()
  212. st.writeHeaders(HeadersFrameParam{
  213. StreamID: 1, // clients send odd numbers
  214. BlockFragment: encodeHeader(t),
  215. EndStream: true, // no DATA frames
  216. EndHeaders: true,
  217. })
  218. select {
  219. case <-gotReq:
  220. case <-time.After(2 * time.Second):
  221. t.Error("timeout waiting for request")
  222. }
  223. }
  224. func TestServer_Request_Get(t *testing.T) {
  225. testServerRequest(t, func(st *serverTester) {
  226. st.writeHeaders(HeadersFrameParam{
  227. StreamID: 1, // clients send odd numbers
  228. BlockFragment: encodeHeader(t, "foo-bar", "some-value"),
  229. EndStream: true, // no DATA frames
  230. EndHeaders: true,
  231. })
  232. }, func(r *http.Request) {
  233. if r.Method != "GET" {
  234. t.Errorf("Method = %q; want GET", r.Method)
  235. }
  236. if r.ContentLength != 0 {
  237. t.Errorf("ContentLength = %v; want 0", r.ContentLength)
  238. }
  239. if r.Close {
  240. t.Error("Close = true; want false")
  241. }
  242. if !strings.Contains(r.RemoteAddr, ":") {
  243. t.Errorf("RemoteAddr = %q; want something with a colon", r.RemoteAddr)
  244. }
  245. if r.Proto != "HTTP/2.0" || r.ProtoMajor != 2 || r.ProtoMinor != 0 {
  246. t.Errorf("Proto = %q Major=%v,Minor=%v; want HTTP/2.0", r.Proto, r.ProtoMajor, r.ProtoMinor)
  247. }
  248. wantHeader := http.Header{
  249. "Foo-Bar": []string{"some-value"},
  250. }
  251. if !reflect.DeepEqual(r.Header, wantHeader) {
  252. t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
  253. }
  254. if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 {
  255. t.Errorf("Read = %d, %v; want 0, EOF", n, err)
  256. }
  257. })
  258. }
  259. // TODO: add a test with EndStream=true on the HEADERS but setting a
  260. // Content-Length anyway. Should we just omit it and force it to
  261. // zero?
  262. func TestServer_Request_Post_NoContentLength_EndStream(t *testing.T) {
  263. testServerRequest(t, func(st *serverTester) {
  264. st.writeHeaders(HeadersFrameParam{
  265. StreamID: 1, // clients send odd numbers
  266. BlockFragment: encodeHeader(t, ":method", "POST"),
  267. EndStream: true,
  268. EndHeaders: true,
  269. })
  270. }, func(r *http.Request) {
  271. if r.Method != "POST" {
  272. t.Errorf("Method = %q; want POST", r.Method)
  273. }
  274. if r.ContentLength != 0 {
  275. t.Errorf("ContentLength = %v; want 0", r.ContentLength)
  276. }
  277. if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 {
  278. t.Errorf("Read = %d, %v; want 0, EOF", n, err)
  279. }
  280. })
  281. }
  282. func TestServer_Request_Post_Body_ImmediateEOF(t *testing.T) {
  283. testBodyContents(t, -1, "", func(st *serverTester) {
  284. st.writeHeaders(HeadersFrameParam{
  285. StreamID: 1, // clients send odd numbers
  286. BlockFragment: encodeHeader(t, ":method", "POST"),
  287. EndStream: false, // to say DATA frames are coming
  288. EndHeaders: true,
  289. })
  290. st.writeData(1, true, nil) // just kidding. empty body.
  291. })
  292. }
  293. func TestServer_Request_Post_Body_OneData(t *testing.T) {
  294. const content = "Some content"
  295. testBodyContents(t, -1, content, func(st *serverTester) {
  296. st.writeHeaders(HeadersFrameParam{
  297. StreamID: 1, // clients send odd numbers
  298. BlockFragment: encodeHeader(t, ":method", "POST"),
  299. EndStream: false, // to say DATA frames are coming
  300. EndHeaders: true,
  301. })
  302. st.writeData(1, true, []byte(content))
  303. })
  304. }
  305. func TestServer_Request_Post_Body_TwoData(t *testing.T) {
  306. const content = "Some content"
  307. testBodyContents(t, -1, content, func(st *serverTester) {
  308. st.writeHeaders(HeadersFrameParam{
  309. StreamID: 1, // clients send odd numbers
  310. BlockFragment: encodeHeader(t, ":method", "POST"),
  311. EndStream: false, // to say DATA frames are coming
  312. EndHeaders: true,
  313. })
  314. st.writeData(1, false, []byte(content[:5]))
  315. st.writeData(1, true, []byte(content[5:]))
  316. })
  317. }
  318. func TestServer_Request_Post_Body_ContentLength_Correct(t *testing.T) {
  319. const content = "Some content"
  320. testBodyContents(t, int64(len(content)), content, func(st *serverTester) {
  321. st.writeHeaders(HeadersFrameParam{
  322. StreamID: 1, // clients send odd numbers
  323. BlockFragment: encodeHeader(t,
  324. ":method", "POST",
  325. "content-length", strconv.Itoa(len(content)),
  326. ),
  327. EndStream: false, // to say DATA frames are coming
  328. EndHeaders: true,
  329. })
  330. st.writeData(1, true, []byte(content))
  331. })
  332. }
  333. func TestServer_Request_Post_Body_ContentLength_TooLarge(t *testing.T) {
  334. testBodyContentsFail(t, 3, "Request declared a Content-Length of 3 but only wrote 2 bytes",
  335. func(st *serverTester) {
  336. st.writeHeaders(HeadersFrameParam{
  337. StreamID: 1, // clients send odd numbers
  338. BlockFragment: encodeHeader(t,
  339. ":method", "POST",
  340. "content-length", "3",
  341. ),
  342. EndStream: false, // to say DATA frames are coming
  343. EndHeaders: true,
  344. })
  345. st.writeData(1, true, []byte("12"))
  346. })
  347. }
  348. func TestServer_Request_Post_Body_ContentLength_TooSmall(t *testing.T) {
  349. testBodyContentsFail(t, 4, "Sender tried to send more than declared Content-Length of 4 bytes",
  350. func(st *serverTester) {
  351. st.writeHeaders(HeadersFrameParam{
  352. StreamID: 1, // clients send odd numbers
  353. BlockFragment: encodeHeader(t,
  354. ":method", "POST",
  355. "content-length", "4",
  356. ),
  357. EndStream: false, // to say DATA frames are coming
  358. EndHeaders: true,
  359. })
  360. st.writeData(1, true, []byte("12345"))
  361. })
  362. }
  363. func testBodyContents(t *testing.T, wantContentLength int64, wantBody string, write func(st *serverTester)) {
  364. testServerRequest(t, write, func(r *http.Request) {
  365. if r.Method != "POST" {
  366. t.Errorf("Method = %q; want POST", r.Method)
  367. }
  368. if r.ContentLength != wantContentLength {
  369. t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength)
  370. }
  371. all, err := ioutil.ReadAll(r.Body)
  372. if err != nil {
  373. t.Fatal(err)
  374. }
  375. if string(all) != wantBody {
  376. t.Errorf("Read = %q; want %q", all, wantBody)
  377. }
  378. if err := r.Body.Close(); err != nil {
  379. t.Fatalf("Close: %v", err)
  380. }
  381. })
  382. }
  383. func testBodyContentsFail(t *testing.T, wantContentLength int64, wantReadError string, write func(st *serverTester)) {
  384. testServerRequest(t, write, func(r *http.Request) {
  385. if r.Method != "POST" {
  386. t.Errorf("Method = %q; want POST", r.Method)
  387. }
  388. if r.ContentLength != wantContentLength {
  389. t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength)
  390. }
  391. all, err := ioutil.ReadAll(r.Body)
  392. if err == nil {
  393. t.Fatalf("expected an error (%q) reading from the body. Successfully read %q instead.",
  394. wantReadError, all)
  395. }
  396. if !strings.Contains(err.Error(), wantReadError) {
  397. t.Fatalf("Body.Read = %v; want substring %q", err, wantReadError)
  398. }
  399. if err := r.Body.Close(); err != nil {
  400. t.Fatalf("Close: %v", err)
  401. }
  402. })
  403. }
  404. // Using a Host header, instead of :authority
  405. func TestServer_Request_Get_Host(t *testing.T) {
  406. const host = "example.com"
  407. testServerRequest(t, func(st *serverTester) {
  408. st.writeHeaders(HeadersFrameParam{
  409. StreamID: 1, // clients send odd numbers
  410. BlockFragment: encodeHeader(t, "host", host),
  411. EndStream: true,
  412. EndHeaders: true,
  413. })
  414. }, func(r *http.Request) {
  415. if r.Host != host {
  416. t.Errorf("Host = %q; want %q", r.Host, host)
  417. }
  418. })
  419. }
  420. // Using an :authority pseudo-header, instead of Host
  421. func TestServer_Request_Get_Authority(t *testing.T) {
  422. const host = "example.com"
  423. testServerRequest(t, func(st *serverTester) {
  424. st.writeHeaders(HeadersFrameParam{
  425. StreamID: 1, // clients send odd numbers
  426. BlockFragment: encodeHeader(t, ":authority", host),
  427. EndStream: true,
  428. EndHeaders: true,
  429. })
  430. }, func(r *http.Request) {
  431. if r.Host != host {
  432. t.Errorf("Host = %q; want %q", r.Host, host)
  433. }
  434. })
  435. }
  436. func TestServer_Request_WithContinuation(t *testing.T) {
  437. wantHeader := http.Header{
  438. "Foo-One": []string{"value-one"},
  439. "Foo-Two": []string{"value-two"},
  440. "Foo-Three": []string{"value-three"},
  441. }
  442. testServerRequest(t, func(st *serverTester) {
  443. fullHeaders := encodeHeader(t,
  444. "foo-one", "value-one",
  445. "foo-two", "value-two",
  446. "foo-three", "value-three",
  447. )
  448. remain := fullHeaders
  449. chunks := 0
  450. for len(remain) > 0 {
  451. const maxChunkSize = 5
  452. chunk := remain
  453. if len(chunk) > maxChunkSize {
  454. chunk = chunk[:maxChunkSize]
  455. }
  456. remain = remain[len(chunk):]
  457. if chunks == 0 {
  458. st.writeHeaders(HeadersFrameParam{
  459. StreamID: 1, // clients send odd numbers
  460. BlockFragment: chunk,
  461. EndStream: true, // no DATA frames
  462. EndHeaders: false, // we'll have continuation frames
  463. })
  464. } else {
  465. err := st.fr.WriteContinuation(1, len(remain) == 0, chunk)
  466. if err != nil {
  467. t.Fatal(err)
  468. }
  469. }
  470. chunks++
  471. }
  472. if chunks < 2 {
  473. t.Fatal("too few chunks")
  474. }
  475. }, func(r *http.Request) {
  476. if !reflect.DeepEqual(r.Header, wantHeader) {
  477. t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
  478. }
  479. })
  480. }
  481. // Concatenated cookie headers. ("8.1.2.5 Compressing the Cookie Header Field")
  482. func TestServer_Request_CookieConcat(t *testing.T) {
  483. const host = "example.com"
  484. testServerRequest(t, func(st *serverTester) {
  485. st.bodylessReq1(
  486. ":authority", host,
  487. "cookie", "a=b",
  488. "cookie", "c=d",
  489. "cookie", "e=f",
  490. )
  491. }, func(r *http.Request) {
  492. const want = "a=b; c=d; e=f"
  493. if got := r.Header.Get("Cookie"); got != want {
  494. t.Errorf("Cookie = %q; want %q", got, want)
  495. }
  496. })
  497. }
  498. func TestServer_Request_Reject_CapitalHeader(t *testing.T) {
  499. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("UPPER", "v") })
  500. }
  501. func TestServer_Request_Reject_Pseudo_Missing_method(t *testing.T) {
  502. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "") })
  503. }
  504. func TestServer_Request_Reject_Pseudo_ExactlyOne(t *testing.T) {
  505. // 8.1.2.3 Request Pseudo-Header Fields
  506. // "All HTTP/2 requests MUST include exactly one valid value" ...
  507. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "GET", ":method", "POST") })
  508. }
  509. func TestServer_Request_Reject_Pseudo_AfterRegular(t *testing.T) {
  510. // 8.1.2.3 Request Pseudo-Header Fields
  511. // "All pseudo-header fields MUST appear in the header block
  512. // before regular header fields. Any request or response that
  513. // contains a pseudo-header field that appears in a header
  514. // block after a regular header field MUST be treated as
  515. // malformed (Section 8.1.2.6)."
  516. testRejectRequest(t, func(st *serverTester) {
  517. var buf bytes.Buffer
  518. enc := hpack.NewEncoder(&buf)
  519. enc.WriteField(hpack.HeaderField{Name: ":method", Value: "GET"})
  520. enc.WriteField(hpack.HeaderField{Name: "regular", Value: "foobar"})
  521. enc.WriteField(hpack.HeaderField{Name: ":path", Value: "/"})
  522. enc.WriteField(hpack.HeaderField{Name: ":scheme", Value: "https"})
  523. st.writeHeaders(HeadersFrameParam{
  524. StreamID: 1, // clients send odd numbers
  525. BlockFragment: buf.Bytes(),
  526. EndStream: true,
  527. EndHeaders: true,
  528. })
  529. })
  530. }
  531. func TestServer_Request_Reject_Pseudo_Missing_path(t *testing.T) {
  532. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":path", "") })
  533. }
  534. func TestServer_Request_Reject_Pseudo_Missing_scheme(t *testing.T) {
  535. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "") })
  536. }
  537. func TestServer_Request_Reject_Pseudo_scheme_invalid(t *testing.T) {
  538. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "bogus") })
  539. }
  540. func TestServer_Request_Reject_Pseudo_Unknown(t *testing.T) {
  541. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":unknown_thing", "") })
  542. }
  543. func testRejectRequest(t *testing.T, send func(*serverTester)) {
  544. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  545. t.Fatal("server request made it to handler; should've been rejected")
  546. })
  547. defer st.Close()
  548. st.greet()
  549. send(st)
  550. st.wantRSTStream(1, ErrCodeProtocol)
  551. }
  552. func TestServer_Ping(t *testing.T) {
  553. st := newServerTester(t, nil)
  554. defer st.Close()
  555. st.greet()
  556. // Server should ignore this one, since it has ACK set.
  557. ackPingData := [8]byte{1, 2, 4, 8, 16, 32, 64, 128}
  558. if err := st.fr.WritePing(true, ackPingData); err != nil {
  559. t.Fatal(err)
  560. }
  561. // But the server should reply to this one, since ACK is false.
  562. pingData := [8]byte{1, 2, 3, 4, 5, 6, 7, 8}
  563. if err := st.fr.WritePing(false, pingData); err != nil {
  564. t.Fatal(err)
  565. }
  566. pf := st.wantPing()
  567. if !pf.Flags.Has(FlagPingAck) {
  568. t.Error("response ping doesn't have ACK set")
  569. }
  570. if pf.Data != pingData {
  571. t.Errorf("response ping has data %q; want %q", pf.Data, pingData)
  572. }
  573. }
  574. // TODO: test HEADERS w/o EndHeaders + another HEADERS (should get rejected)
  575. // TODO: test HEADERS w/ EndHeaders + a continuation HEADERS (should get rejected)
  576. // testServerRequest sets up an idle HTTP/2 connection and lets you
  577. // write a single request with writeReq, and then verify that the
  578. // *http.Request is built correctly in checkReq.
  579. func testServerRequest(t *testing.T, writeReq func(*serverTester), checkReq func(*http.Request)) {
  580. gotReq := make(chan bool, 1)
  581. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  582. if r.Body == nil {
  583. t.Fatal("nil Body")
  584. }
  585. checkReq(r)
  586. gotReq <- true
  587. })
  588. defer st.Close()
  589. st.greet()
  590. writeReq(st)
  591. select {
  592. case <-gotReq:
  593. case <-time.After(2 * time.Second):
  594. t.Error("timeout waiting for request")
  595. }
  596. }
  597. func TestServerWithCurl(t *testing.T) {
  598. requireCurl(t)
  599. ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  600. // TODO: add a bunch of different tests with different
  601. // behavior, as a function of r or a table.
  602. // -- with request body, without.
  603. // -- no interaction with w.
  604. // -- panic
  605. // -- modify Header only, but no writes or writeheader (this test)
  606. // -- WriteHeader only
  607. // -- Write only
  608. // -- WriteString
  609. // -- both
  610. // -- huge headers over a frame size so we get continuation headers.
  611. // Look at net/http's Server tests for inspiration.
  612. w.Header().Set("Foo", "Bar")
  613. }))
  614. ConfigureServer(ts.Config, &Server{})
  615. ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config
  616. ts.StartTLS()
  617. defer ts.Close()
  618. var gotConn int32
  619. testHookOnConn = func() { atomic.StoreInt32(&gotConn, 1) }
  620. t.Logf("Running test server for curl to hit at: %s", ts.URL)
  621. container := curl(t, "--silent", "--http2", "--insecure", "-v", ts.URL)
  622. defer kill(container)
  623. resc := make(chan interface{}, 1)
  624. go func() {
  625. res, err := dockerLogs(container)
  626. if err != nil {
  627. resc <- err
  628. } else {
  629. resc <- res
  630. }
  631. }()
  632. select {
  633. case res := <-resc:
  634. if err, ok := res.(error); ok {
  635. t.Fatal(err)
  636. }
  637. if !strings.Contains(string(res.([]byte)), "< foo:Bar") {
  638. t.Errorf("didn't see foo:Bar header")
  639. t.Logf("Got: %s", res)
  640. }
  641. case <-time.After(3 * time.Second):
  642. t.Errorf("timeout waiting for curl")
  643. }
  644. if atomic.LoadInt32(&gotConn) == 0 {
  645. t.Error("never saw an http2 connection")
  646. }
  647. }
  648. func dockerLogs(container string) ([]byte, error) {
  649. out, err := exec.Command("docker", "wait", container).CombinedOutput()
  650. if err != nil {
  651. return out, err
  652. }
  653. exitStatus, err := strconv.Atoi(strings.TrimSpace(string(out)))
  654. if err != nil {
  655. return out, errors.New("unexpected exit status from docker wait")
  656. }
  657. out, err = exec.Command("docker", "logs", container).CombinedOutput()
  658. exec.Command("docker", "rm", container).Run()
  659. if err == nil && exitStatus != 0 {
  660. err = fmt.Errorf("exit status %d", exitStatus)
  661. }
  662. return out, err
  663. }
  664. func kill(container string) {
  665. exec.Command("docker", "kill", container).Run()
  666. exec.Command("docker", "rm", container).Run()
  667. }
  668. // Verify that curl has http2.
  669. func requireCurl(t *testing.T) {
  670. out, err := dockerLogs(curl(t, "--version"))
  671. if err != nil {
  672. t.Skipf("failed to determine curl features; skipping test")
  673. }
  674. if !strings.Contains(string(out), "HTTP2") {
  675. t.Skip("curl doesn't support HTTP2; skipping test")
  676. }
  677. }
  678. func curl(t *testing.T, args ...string) (container string) {
  679. out, err := exec.Command("docker", append([]string{"run", "-d", "--net=host", "gohttp2/curl"}, args...)...).CombinedOutput()
  680. if err != nil {
  681. t.Skipf("Failed to run curl in docker: %v, %s", err, out)
  682. }
  683. return strings.TrimSpace(string(out))
  684. }
  685. type twriter struct {
  686. t testing.TB
  687. }
  688. func (w twriter) Write(p []byte) (n int, err error) {
  689. w.t.Logf("%s", p)
  690. return len(p), nil
  691. }
  692. // encodeHeader encodes headers and returns their HPACK bytes. headers
  693. // must contain an even number of key/value pairs. There may be
  694. // multiple pairs for keys (e.g. "cookie"). The :method, :path, and
  695. // :scheme headers default to GET, / and https.
  696. func encodeHeader(t *testing.T, headers ...string) []byte {
  697. pseudoCount := map[string]int{}
  698. if len(headers)%2 == 1 {
  699. panic("odd number of kv args")
  700. }
  701. keys := []string{":method", ":path", ":scheme"}
  702. vals := map[string][]string{
  703. ":method": {"GET"},
  704. ":path": {"/"},
  705. ":scheme": {"https"},
  706. }
  707. for len(headers) > 0 {
  708. k, v := headers[0], headers[1]
  709. headers = headers[2:]
  710. if _, ok := vals[k]; !ok {
  711. keys = append(keys, k)
  712. }
  713. if strings.HasPrefix(k, ":") {
  714. pseudoCount[k]++
  715. if pseudoCount[k] == 1 {
  716. vals[k] = []string{v}
  717. } else {
  718. // Allows testing of invalid headers w/ dup pseudo fields.
  719. vals[k] = append(vals[k], v)
  720. }
  721. } else {
  722. vals[k] = append(vals[k], v)
  723. }
  724. }
  725. var buf bytes.Buffer
  726. enc := hpack.NewEncoder(&buf)
  727. for _, k := range keys {
  728. for _, v := range vals[k] {
  729. if err := enc.WriteField(hpack.HeaderField{Name: k, Value: v}); err != nil {
  730. t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err)
  731. }
  732. }
  733. }
  734. return buf.Bytes()
  735. }