server_test.go 31 KB

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