server_test.go 21 KB

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