server_test.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134
  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.ContentLength != 0 {
  269. t.Errorf("ContentLength = %v; want 0", r.ContentLength)
  270. }
  271. if r.Close {
  272. t.Error("Close = true; want false")
  273. }
  274. if !strings.Contains(r.RemoteAddr, ":") {
  275. t.Errorf("RemoteAddr = %q; want something with a colon", r.RemoteAddr)
  276. }
  277. if r.Proto != "HTTP/2.0" || r.ProtoMajor != 2 || r.ProtoMinor != 0 {
  278. t.Errorf("Proto = %q Major=%v,Minor=%v; want HTTP/2.0", r.Proto, r.ProtoMajor, r.ProtoMinor)
  279. }
  280. wantHeader := http.Header{
  281. "Foo-Bar": []string{"some-value"},
  282. }
  283. if !reflect.DeepEqual(r.Header, wantHeader) {
  284. t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
  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. // TODO: add a test with EndStream=true on the HEADERS but setting a
  292. // Content-Length anyway. Should we just omit it and force it to
  293. // zero?
  294. func TestServer_Request_Post_NoContentLength_EndStream(t *testing.T) {
  295. testServerRequest(t, func(st *serverTester) {
  296. st.writeHeaders(HeadersFrameParam{
  297. StreamID: 1, // clients send odd numbers
  298. BlockFragment: encodeHeader(t, ":method", "POST"),
  299. EndStream: true,
  300. EndHeaders: true,
  301. })
  302. }, func(r *http.Request) {
  303. if r.Method != "POST" {
  304. t.Errorf("Method = %q; want POST", r.Method)
  305. }
  306. if r.ContentLength != 0 {
  307. t.Errorf("ContentLength = %v; want 0", r.ContentLength)
  308. }
  309. if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 {
  310. t.Errorf("Read = %d, %v; want 0, EOF", n, err)
  311. }
  312. })
  313. }
  314. func TestServer_Request_Post_Body_ImmediateEOF(t *testing.T) {
  315. testBodyContents(t, -1, "", func(st *serverTester) {
  316. st.writeHeaders(HeadersFrameParam{
  317. StreamID: 1, // clients send odd numbers
  318. BlockFragment: encodeHeader(t, ":method", "POST"),
  319. EndStream: false, // to say DATA frames are coming
  320. EndHeaders: true,
  321. })
  322. st.writeData(1, true, nil) // just kidding. empty body.
  323. })
  324. }
  325. func TestServer_Request_Post_Body_OneData(t *testing.T) {
  326. const content = "Some content"
  327. testBodyContents(t, -1, content, func(st *serverTester) {
  328. st.writeHeaders(HeadersFrameParam{
  329. StreamID: 1, // clients send odd numbers
  330. BlockFragment: encodeHeader(t, ":method", "POST"),
  331. EndStream: false, // to say DATA frames are coming
  332. EndHeaders: true,
  333. })
  334. st.writeData(1, true, []byte(content))
  335. })
  336. }
  337. func TestServer_Request_Post_Body_TwoData(t *testing.T) {
  338. const content = "Some content"
  339. testBodyContents(t, -1, content, func(st *serverTester) {
  340. st.writeHeaders(HeadersFrameParam{
  341. StreamID: 1, // clients send odd numbers
  342. BlockFragment: encodeHeader(t, ":method", "POST"),
  343. EndStream: false, // to say DATA frames are coming
  344. EndHeaders: true,
  345. })
  346. st.writeData(1, false, []byte(content[:5]))
  347. st.writeData(1, true, []byte(content[5:]))
  348. })
  349. }
  350. func TestServer_Request_Post_Body_ContentLength_Correct(t *testing.T) {
  351. const content = "Some content"
  352. testBodyContents(t, int64(len(content)), content, func(st *serverTester) {
  353. st.writeHeaders(HeadersFrameParam{
  354. StreamID: 1, // clients send odd numbers
  355. BlockFragment: encodeHeader(t,
  356. ":method", "POST",
  357. "content-length", strconv.Itoa(len(content)),
  358. ),
  359. EndStream: false, // to say DATA frames are coming
  360. EndHeaders: true,
  361. })
  362. st.writeData(1, true, []byte(content))
  363. })
  364. }
  365. func TestServer_Request_Post_Body_ContentLength_TooLarge(t *testing.T) {
  366. testBodyContentsFail(t, 3, "Request declared a Content-Length of 3 but only wrote 2 bytes",
  367. func(st *serverTester) {
  368. st.writeHeaders(HeadersFrameParam{
  369. StreamID: 1, // clients send odd numbers
  370. BlockFragment: encodeHeader(t,
  371. ":method", "POST",
  372. "content-length", "3",
  373. ),
  374. EndStream: false, // to say DATA frames are coming
  375. EndHeaders: true,
  376. })
  377. st.writeData(1, true, []byte("12"))
  378. })
  379. }
  380. func TestServer_Request_Post_Body_ContentLength_TooSmall(t *testing.T) {
  381. testBodyContentsFail(t, 4, "Sender tried to send more than declared Content-Length of 4 bytes",
  382. func(st *serverTester) {
  383. st.writeHeaders(HeadersFrameParam{
  384. StreamID: 1, // clients send odd numbers
  385. BlockFragment: encodeHeader(t,
  386. ":method", "POST",
  387. "content-length", "4",
  388. ),
  389. EndStream: false, // to say DATA frames are coming
  390. EndHeaders: true,
  391. })
  392. st.writeData(1, true, []byte("12345"))
  393. })
  394. }
  395. func testBodyContents(t *testing.T, wantContentLength int64, wantBody string, write func(st *serverTester)) {
  396. testServerRequest(t, write, func(r *http.Request) {
  397. if r.Method != "POST" {
  398. t.Errorf("Method = %q; want POST", r.Method)
  399. }
  400. if r.ContentLength != wantContentLength {
  401. t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength)
  402. }
  403. all, err := ioutil.ReadAll(r.Body)
  404. if err != nil {
  405. t.Fatal(err)
  406. }
  407. if string(all) != wantBody {
  408. t.Errorf("Read = %q; want %q", all, wantBody)
  409. }
  410. if err := r.Body.Close(); err != nil {
  411. t.Fatalf("Close: %v", err)
  412. }
  413. })
  414. }
  415. func testBodyContentsFail(t *testing.T, wantContentLength int64, wantReadError 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.Fatalf("expected an error (%q) reading from the body. Successfully read %q instead.",
  426. wantReadError, all)
  427. }
  428. if !strings.Contains(err.Error(), wantReadError) {
  429. t.Fatalf("Body.Read = %v; want substring %q", err, wantReadError)
  430. }
  431. if err := r.Body.Close(); err != nil {
  432. t.Fatalf("Close: %v", err)
  433. }
  434. })
  435. }
  436. // Using a Host header, instead of :authority
  437. func TestServer_Request_Get_Host(t *testing.T) {
  438. const host = "example.com"
  439. testServerRequest(t, func(st *serverTester) {
  440. st.writeHeaders(HeadersFrameParam{
  441. StreamID: 1, // clients send odd numbers
  442. BlockFragment: encodeHeader(t, "host", host),
  443. EndStream: true,
  444. EndHeaders: true,
  445. })
  446. }, func(r *http.Request) {
  447. if r.Host != host {
  448. t.Errorf("Host = %q; want %q", r.Host, host)
  449. }
  450. })
  451. }
  452. // Using an :authority pseudo-header, instead of Host
  453. func TestServer_Request_Get_Authority(t *testing.T) {
  454. const host = "example.com"
  455. testServerRequest(t, func(st *serverTester) {
  456. st.writeHeaders(HeadersFrameParam{
  457. StreamID: 1, // clients send odd numbers
  458. BlockFragment: encodeHeader(t, ":authority", host),
  459. EndStream: true,
  460. EndHeaders: true,
  461. })
  462. }, func(r *http.Request) {
  463. if r.Host != host {
  464. t.Errorf("Host = %q; want %q", r.Host, host)
  465. }
  466. })
  467. }
  468. func TestServer_Request_WithContinuation(t *testing.T) {
  469. wantHeader := http.Header{
  470. "Foo-One": []string{"value-one"},
  471. "Foo-Two": []string{"value-two"},
  472. "Foo-Three": []string{"value-three"},
  473. }
  474. testServerRequest(t, func(st *serverTester) {
  475. fullHeaders := encodeHeader(t,
  476. "foo-one", "value-one",
  477. "foo-two", "value-two",
  478. "foo-three", "value-three",
  479. )
  480. remain := fullHeaders
  481. chunks := 0
  482. for len(remain) > 0 {
  483. const maxChunkSize = 5
  484. chunk := remain
  485. if len(chunk) > maxChunkSize {
  486. chunk = chunk[:maxChunkSize]
  487. }
  488. remain = remain[len(chunk):]
  489. if chunks == 0 {
  490. st.writeHeaders(HeadersFrameParam{
  491. StreamID: 1, // clients send odd numbers
  492. BlockFragment: chunk,
  493. EndStream: true, // no DATA frames
  494. EndHeaders: false, // we'll have continuation frames
  495. })
  496. } else {
  497. err := st.fr.WriteContinuation(1, len(remain) == 0, chunk)
  498. if err != nil {
  499. t.Fatal(err)
  500. }
  501. }
  502. chunks++
  503. }
  504. if chunks < 2 {
  505. t.Fatal("too few chunks")
  506. }
  507. }, func(r *http.Request) {
  508. if !reflect.DeepEqual(r.Header, wantHeader) {
  509. t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
  510. }
  511. })
  512. }
  513. // Concatenated cookie headers. ("8.1.2.5 Compressing the Cookie Header Field")
  514. func TestServer_Request_CookieConcat(t *testing.T) {
  515. const host = "example.com"
  516. testServerRequest(t, func(st *serverTester) {
  517. st.bodylessReq1(
  518. ":authority", host,
  519. "cookie", "a=b",
  520. "cookie", "c=d",
  521. "cookie", "e=f",
  522. )
  523. }, func(r *http.Request) {
  524. const want = "a=b; c=d; e=f"
  525. if got := r.Header.Get("Cookie"); got != want {
  526. t.Errorf("Cookie = %q; want %q", got, want)
  527. }
  528. })
  529. }
  530. func TestServer_Request_Reject_CapitalHeader(t *testing.T) {
  531. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("UPPER", "v") })
  532. }
  533. func TestServer_Request_Reject_Pseudo_Missing_method(t *testing.T) {
  534. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "") })
  535. }
  536. func TestServer_Request_Reject_Pseudo_ExactlyOne(t *testing.T) {
  537. // 8.1.2.3 Request Pseudo-Header Fields
  538. // "All HTTP/2 requests MUST include exactly one valid value" ...
  539. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "GET", ":method", "POST") })
  540. }
  541. func TestServer_Request_Reject_Pseudo_AfterRegular(t *testing.T) {
  542. // 8.1.2.3 Request Pseudo-Header Fields
  543. // "All pseudo-header fields MUST appear in the header block
  544. // before regular header fields. Any request or response that
  545. // contains a pseudo-header field that appears in a header
  546. // block after a regular header field MUST be treated as
  547. // malformed (Section 8.1.2.6)."
  548. testRejectRequest(t, func(st *serverTester) {
  549. var buf bytes.Buffer
  550. enc := hpack.NewEncoder(&buf)
  551. enc.WriteField(hpack.HeaderField{Name: ":method", Value: "GET"})
  552. enc.WriteField(hpack.HeaderField{Name: "regular", Value: "foobar"})
  553. enc.WriteField(hpack.HeaderField{Name: ":path", Value: "/"})
  554. enc.WriteField(hpack.HeaderField{Name: ":scheme", Value: "https"})
  555. st.writeHeaders(HeadersFrameParam{
  556. StreamID: 1, // clients send odd numbers
  557. BlockFragment: buf.Bytes(),
  558. EndStream: true,
  559. EndHeaders: true,
  560. })
  561. })
  562. }
  563. func TestServer_Request_Reject_Pseudo_Missing_path(t *testing.T) {
  564. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":path", "") })
  565. }
  566. func TestServer_Request_Reject_Pseudo_Missing_scheme(t *testing.T) {
  567. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "") })
  568. }
  569. func TestServer_Request_Reject_Pseudo_scheme_invalid(t *testing.T) {
  570. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "bogus") })
  571. }
  572. func TestServer_Request_Reject_Pseudo_Unknown(t *testing.T) {
  573. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":unknown_thing", "") })
  574. }
  575. func testRejectRequest(t *testing.T, send func(*serverTester)) {
  576. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  577. t.Fatal("server request made it to handler; should've been rejected")
  578. })
  579. defer st.Close()
  580. st.greet()
  581. send(st)
  582. st.wantRSTStream(1, ErrCodeProtocol)
  583. }
  584. func TestServer_Ping(t *testing.T) {
  585. st := newServerTester(t, nil)
  586. defer st.Close()
  587. st.greet()
  588. // Server should ignore this one, since it has ACK set.
  589. ackPingData := [8]byte{1, 2, 4, 8, 16, 32, 64, 128}
  590. if err := st.fr.WritePing(true, ackPingData); err != nil {
  591. t.Fatal(err)
  592. }
  593. // But the server should reply to this one, since ACK is false.
  594. pingData := [8]byte{1, 2, 3, 4, 5, 6, 7, 8}
  595. if err := st.fr.WritePing(false, pingData); err != nil {
  596. t.Fatal(err)
  597. }
  598. pf := st.wantPing()
  599. if !pf.Flags.Has(FlagPingAck) {
  600. t.Error("response ping doesn't have ACK set")
  601. }
  602. if pf.Data != pingData {
  603. t.Errorf("response ping has data %q; want %q", pf.Data, pingData)
  604. }
  605. }
  606. func TestServer_Handler_Sends_WindowUpdate(t *testing.T) {
  607. puppet := newHandlerPuppet()
  608. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  609. puppet.act(w, r)
  610. })
  611. defer st.Close()
  612. defer puppet.done()
  613. st.greet()
  614. st.writeHeaders(HeadersFrameParam{
  615. StreamID: 1, // clients send odd numbers
  616. BlockFragment: encodeHeader(t, ":method", "POST"),
  617. EndStream: false, // data coming
  618. EndHeaders: true,
  619. })
  620. st.writeData(1, true, []byte("abcdef"))
  621. puppet.do(func(w http.ResponseWriter, r *http.Request) {
  622. buf := make([]byte, 3)
  623. _, err := io.ReadFull(r.Body, buf)
  624. if err != nil {
  625. t.Error(err)
  626. return
  627. }
  628. if string(buf) != "abc" {
  629. t.Errorf("read %q; want abc", buf)
  630. }
  631. })
  632. st.wantWindowUpdate(0, 3)
  633. st.wantWindowUpdate(1, 3)
  634. puppet.do(func(w http.ResponseWriter, r *http.Request) {
  635. buf := make([]byte, 3)
  636. _, err := io.ReadFull(r.Body, buf)
  637. if err != nil {
  638. t.Error(err)
  639. return
  640. }
  641. if string(buf) != "def" {
  642. t.Errorf("read %q; want abc", buf)
  643. }
  644. })
  645. st.wantWindowUpdate(0, 3)
  646. st.wantWindowUpdate(1, 3)
  647. }
  648. // TODO: test HEADERS w/o EndHeaders + another HEADERS (should get rejected)
  649. // TODO: test HEADERS w/ EndHeaders + a continuation HEADERS (should get rejected)
  650. // testServerRequest sets up an idle HTTP/2 connection and lets you
  651. // write a single request with writeReq, and then verify that the
  652. // *http.Request is built correctly in checkReq.
  653. func testServerRequest(t *testing.T, writeReq func(*serverTester), checkReq func(*http.Request)) {
  654. gotReq := make(chan bool, 1)
  655. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  656. if r.Body == nil {
  657. t.Fatal("nil Body")
  658. }
  659. checkReq(r)
  660. gotReq <- true
  661. })
  662. defer st.Close()
  663. st.greet()
  664. writeReq(st)
  665. select {
  666. case <-gotReq:
  667. case <-time.After(2 * time.Second):
  668. t.Error("timeout waiting for request")
  669. }
  670. }
  671. func getSlash(st *serverTester) { st.bodylessReq1() }
  672. func TestServer_Response_NoData(t *testing.T) {
  673. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  674. // Nothing.
  675. return nil
  676. }, func(st *serverTester) {
  677. getSlash(st)
  678. hf := st.wantHeaders()
  679. if !hf.StreamEnded() {
  680. t.Fatal("want END_STREAM flag")
  681. }
  682. if !hf.HeadersEnded() {
  683. t.Fatal("want END_HEADERS flag")
  684. }
  685. })
  686. }
  687. func TestServer_Response_NoData_Header_FooBar(t *testing.T) {
  688. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  689. w.Header().Set("Foo-Bar", "some-value")
  690. return nil
  691. }, func(st *serverTester) {
  692. getSlash(st)
  693. hf := st.wantHeaders()
  694. if !hf.StreamEnded() {
  695. t.Fatal("want END_STREAM flag")
  696. }
  697. if !hf.HeadersEnded() {
  698. t.Fatal("want END_HEADERS flag")
  699. }
  700. goth := decodeHeader(t, hf.HeaderBlockFragment())
  701. wanth := [][2]string{
  702. {":status", "200"},
  703. {"foo-bar", "some-value"},
  704. {"content-type", "text/plain; charset=utf-8"},
  705. {"content-length", "0"},
  706. }
  707. if !reflect.DeepEqual(goth, wanth) {
  708. t.Errorf("Got headers %v; want %v", goth, wanth)
  709. }
  710. })
  711. }
  712. func TestServer_Response_Data_Sniff_DoesntOverride(t *testing.T) {
  713. const msg = "<html>this is HTML."
  714. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  715. w.Header().Set("Content-Type", "foo/bar")
  716. io.WriteString(w, msg)
  717. return nil
  718. }, func(st *serverTester) {
  719. getSlash(st)
  720. hf := st.wantHeaders()
  721. if hf.StreamEnded() {
  722. t.Fatal("don't want END_STREAM, expecting data")
  723. }
  724. if !hf.HeadersEnded() {
  725. t.Fatal("want END_HEADERS flag")
  726. }
  727. goth := decodeHeader(t, hf.HeaderBlockFragment())
  728. wanth := [][2]string{
  729. {":status", "200"},
  730. {"content-type", "foo/bar"},
  731. {"content-length", strconv.Itoa(len(msg))},
  732. }
  733. if !reflect.DeepEqual(goth, wanth) {
  734. t.Errorf("Got headers %v; want %v", goth, wanth)
  735. }
  736. df := st.wantData()
  737. if !df.StreamEnded() {
  738. t.Error("expected DATA to have END_STREAM flag")
  739. }
  740. if got := string(df.Data()); got != msg {
  741. t.Errorf("got DATA %q; want %q", got, msg)
  742. }
  743. })
  744. }
  745. func TestServer_Response_TransferEncoding_chunked(t *testing.T) {
  746. const msg = "hi"
  747. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  748. w.Header().Set("Transfer-Encoding", "chunked") // should be stripped
  749. io.WriteString(w, msg)
  750. return nil
  751. }, func(st *serverTester) {
  752. getSlash(st)
  753. hf := st.wantHeaders()
  754. goth := decodeHeader(t, hf.HeaderBlockFragment())
  755. wanth := [][2]string{
  756. {":status", "200"},
  757. {"content-type", "text/plain; charset=utf-8"},
  758. {"content-length", strconv.Itoa(len(msg))},
  759. }
  760. if !reflect.DeepEqual(goth, wanth) {
  761. t.Errorf("Got headers %v; want %v", goth, wanth)
  762. }
  763. })
  764. }
  765. // Header accessed only after the initial write.
  766. func TestServer_Response_Data_IgnoreHeaderAfterWrite_After(t *testing.T) {
  767. const msg = "<html>this is HTML."
  768. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  769. io.WriteString(w, msg)
  770. w.Header().Set("foo", "should be ignored")
  771. return nil
  772. }, func(st *serverTester) {
  773. getSlash(st)
  774. hf := st.wantHeaders()
  775. if hf.StreamEnded() {
  776. t.Fatal("unexpected END_STREAM")
  777. }
  778. if !hf.HeadersEnded() {
  779. t.Fatal("want END_HEADERS flag")
  780. }
  781. goth := decodeHeader(t, hf.HeaderBlockFragment())
  782. wanth := [][2]string{
  783. {":status", "200"},
  784. {"content-type", "text/html; charset=utf-8"},
  785. {"content-length", strconv.Itoa(len(msg))},
  786. }
  787. if !reflect.DeepEqual(goth, wanth) {
  788. t.Errorf("Got headers %v; want %v", goth, wanth)
  789. }
  790. })
  791. }
  792. // Header accessed before the initial write and later mutated.
  793. func TestServer_Response_Data_IgnoreHeaderAfterWrite_Overwrite(t *testing.T) {
  794. const msg = "<html>this is HTML."
  795. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  796. w.Header().Set("foo", "proper value")
  797. io.WriteString(w, msg)
  798. w.Header().Set("foo", "should be ignored")
  799. return nil
  800. }, func(st *serverTester) {
  801. getSlash(st)
  802. hf := st.wantHeaders()
  803. if hf.StreamEnded() {
  804. t.Fatal("unexpected END_STREAM")
  805. }
  806. if !hf.HeadersEnded() {
  807. t.Fatal("want END_HEADERS flag")
  808. }
  809. goth := decodeHeader(t, hf.HeaderBlockFragment())
  810. wanth := [][2]string{
  811. {":status", "200"},
  812. {"foo", "proper value"},
  813. {"content-type", "text/html; charset=utf-8"},
  814. {"content-length", strconv.Itoa(len(msg))},
  815. }
  816. if !reflect.DeepEqual(goth, wanth) {
  817. t.Errorf("Got headers %v; want %v", goth, wanth)
  818. }
  819. })
  820. }
  821. func TestServer_Response_Data_SniffLenType(t *testing.T) {
  822. const msg = "<html>this is HTML."
  823. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  824. io.WriteString(w, msg)
  825. return nil
  826. }, func(st *serverTester) {
  827. getSlash(st)
  828. hf := st.wantHeaders()
  829. if hf.StreamEnded() {
  830. t.Fatal("don't want END_STREAM, expecting data")
  831. }
  832. if !hf.HeadersEnded() {
  833. t.Fatal("want END_HEADERS flag")
  834. }
  835. goth := decodeHeader(t, hf.HeaderBlockFragment())
  836. wanth := [][2]string{
  837. {":status", "200"},
  838. {"content-type", "text/html; charset=utf-8"},
  839. {"content-length", strconv.Itoa(len(msg))},
  840. }
  841. if !reflect.DeepEqual(goth, wanth) {
  842. t.Errorf("Got headers %v; want %v", goth, wanth)
  843. }
  844. df := st.wantData()
  845. if !df.StreamEnded() {
  846. t.Error("expected DATA to have END_STREAM flag")
  847. }
  848. if got := string(df.Data()); got != msg {
  849. t.Errorf("got DATA %q; want %q", got, msg)
  850. }
  851. })
  852. }
  853. func TestServer_Response_Header_Flush_MidWrite(t *testing.T) {
  854. const msg = "<html>this is HTML"
  855. const msg2 = ", and this is the next chunk"
  856. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  857. io.WriteString(w, msg)
  858. w.(http.Flusher).Flush()
  859. io.WriteString(w, msg2)
  860. return nil
  861. }, func(st *serverTester) {
  862. getSlash(st)
  863. hf := st.wantHeaders()
  864. if hf.StreamEnded() {
  865. t.Fatal("unexpected END_STREAM flag")
  866. }
  867. if !hf.HeadersEnded() {
  868. t.Fatal("want END_HEADERS flag")
  869. }
  870. goth := decodeHeader(t, hf.HeaderBlockFragment())
  871. wanth := [][2]string{
  872. {":status", "200"},
  873. {"content-type", "text/html; charset=utf-8"}, // sniffed
  874. // and no content-length
  875. }
  876. if !reflect.DeepEqual(goth, wanth) {
  877. t.Errorf("Got headers %v; want %v", goth, wanth)
  878. }
  879. {
  880. df := st.wantData()
  881. if df.StreamEnded() {
  882. t.Error("unexpected END_STREAM flag")
  883. }
  884. if got := string(df.Data()); got != msg {
  885. t.Errorf("got DATA %q; want %q", got, msg)
  886. }
  887. }
  888. {
  889. df := st.wantData()
  890. if !df.StreamEnded() {
  891. t.Error("wanted END_STREAM flag on last data chunk")
  892. }
  893. if got := string(df.Data()); got != msg2 {
  894. t.Errorf("got DATA %q; want %q", got, msg2)
  895. }
  896. }
  897. })
  898. }
  899. func TestServer_Response_LargeWrite(t *testing.T) {
  900. const size = 1 << 20
  901. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  902. n, err := w.Write(bytes.Repeat([]byte("a"), size))
  903. if err != nil {
  904. return fmt.Errorf("Write error: %v", err)
  905. }
  906. if n != size {
  907. return fmt.Errorf("wrong size %d from Write", n)
  908. }
  909. return nil
  910. }, func(st *serverTester) {
  911. getSlash(st) // make the single request
  912. hf := st.wantHeaders()
  913. if hf.StreamEnded() {
  914. t.Fatal("unexpected END_STREAM flag")
  915. }
  916. if !hf.HeadersEnded() {
  917. t.Fatal("want END_HEADERS flag")
  918. }
  919. goth := decodeHeader(t, hf.HeaderBlockFragment())
  920. wanth := [][2]string{
  921. {":status", "200"},
  922. {"content-type", "text/plain; charset=utf-8"}, // sniffed
  923. // and no content-length
  924. }
  925. if !reflect.DeepEqual(goth, wanth) {
  926. t.Errorf("Got headers %v; want %v", goth, wanth)
  927. }
  928. var bytes, frames int
  929. for {
  930. df := st.wantData()
  931. bytes += len(df.Data())
  932. frames++
  933. // TODO: send WINDOW_UPDATE frames at the server to keep it from stalling
  934. for _, b := range df.Data() {
  935. if b != 'a' {
  936. t.Fatal("non-'a' byte seen in DATA")
  937. }
  938. }
  939. if df.StreamEnded() {
  940. break
  941. }
  942. }
  943. if bytes != size {
  944. t.Errorf("Got %d bytes; want %d", bytes, size)
  945. }
  946. if want := 257; frames != want {
  947. t.Errorf("Got %d frames; want %d", frames, size)
  948. }
  949. })
  950. }
  951. func decodeHeader(t *testing.T, headerBlock []byte) (pairs [][2]string) {
  952. d := hpack.NewDecoder(initialHeaderTableSize, func(f hpack.HeaderField) {
  953. pairs = append(pairs, [2]string{f.Name, f.Value})
  954. })
  955. if _, err := d.Write(headerBlock); err != nil {
  956. t.Fatalf("hpack decoding error: %v", err)
  957. }
  958. if err := d.Close(); err != nil {
  959. t.Fatalf("hpack decoding error: %v", err)
  960. }
  961. return
  962. }
  963. // testServerResponse sets up an idle HTTP/2 connection and lets you
  964. // write a single request with writeReq, and then reply to it in some way with the provided handler,
  965. // and then verify the output with the serverTester again (assuming the handler returns nil)
  966. func testServerResponse(t *testing.T,
  967. handler func(http.ResponseWriter, *http.Request) error,
  968. client func(*serverTester),
  969. ) {
  970. errc := make(chan error, 1)
  971. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  972. if r.Body == nil {
  973. t.Fatal("nil Body")
  974. }
  975. errc <- handler(w, r)
  976. })
  977. defer st.Close()
  978. donec := make(chan bool)
  979. go func() {
  980. defer close(donec)
  981. st.greet()
  982. client(st)
  983. }()
  984. select {
  985. case <-donec:
  986. return
  987. case <-time.After(5 * time.Second):
  988. t.Fatal("timeout")
  989. }
  990. select {
  991. case err := <-errc:
  992. if err != nil {
  993. t.Fatalf("Error in handler: %v", err)
  994. }
  995. case <-time.After(2 * time.Second):
  996. t.Error("timeout waiting for handler to finish")
  997. }
  998. }
  999. func TestServerWithCurl(t *testing.T) {
  1000. requireCurl(t)
  1001. ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  1002. // TODO: add a bunch of different tests with different
  1003. // behavior, as a function of r or a table.
  1004. // -- with request body, without.
  1005. // -- no interaction with w.
  1006. // -- panic
  1007. // -- modify Header only, but no writes or writeheader (this test)
  1008. // -- WriteHeader only
  1009. // -- Write only
  1010. // -- WriteString
  1011. // -- both
  1012. // -- huge headers over a frame size so we get continuation headers.
  1013. // Look at net/http's Server tests for inspiration.
  1014. w.Header().Set("Foo", "Bar")
  1015. }))
  1016. ConfigureServer(ts.Config, &Server{})
  1017. ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config
  1018. ts.StartTLS()
  1019. defer ts.Close()
  1020. var gotConn int32
  1021. testHookOnConn = func() { atomic.StoreInt32(&gotConn, 1) }
  1022. t.Logf("Running test server for curl to hit at: %s", ts.URL)
  1023. container := curl(t, "--silent", "--http2", "--insecure", "-v", ts.URL)
  1024. defer kill(container)
  1025. resc := make(chan interface{}, 1)
  1026. go func() {
  1027. res, err := dockerLogs(container)
  1028. if err != nil {
  1029. resc <- err
  1030. } else {
  1031. resc <- res
  1032. }
  1033. }()
  1034. select {
  1035. case res := <-resc:
  1036. if err, ok := res.(error); ok {
  1037. t.Fatal(err)
  1038. }
  1039. if !strings.Contains(string(res.([]byte)), "< foo:Bar") {
  1040. t.Errorf("didn't see foo:Bar header")
  1041. t.Logf("Got: %s", res)
  1042. }
  1043. case <-time.After(3 * time.Second):
  1044. t.Errorf("timeout waiting for curl")
  1045. }
  1046. if atomic.LoadInt32(&gotConn) == 0 {
  1047. t.Error("never saw an http2 connection")
  1048. }
  1049. }