server_test.go 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995
  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. "runtime"
  22. "strconv"
  23. "strings"
  24. "sync"
  25. "sync/atomic"
  26. "testing"
  27. "time"
  28. "github.com/bradfitz/http2/hpack"
  29. )
  30. type serverTester struct {
  31. cc net.Conn // client conn
  32. t *testing.T
  33. ts *httptest.Server
  34. fr *Framer
  35. logBuf *bytes.Buffer
  36. sc *serverConn
  37. logFilter []string // substrings to filter out
  38. }
  39. func init() {
  40. testHookOnPanicMu = new(sync.Mutex)
  41. }
  42. func newServerTester(t *testing.T, handler http.HandlerFunc) *serverTester {
  43. testHookOnPanicMu.Lock()
  44. testHookOnPanic = nil
  45. testHookOnPanicMu.Unlock()
  46. logBuf := new(bytes.Buffer)
  47. ts := httptest.NewUnstartedServer(handler)
  48. ConfigureServer(ts.Config, &Server{})
  49. st := &serverTester{
  50. t: t,
  51. ts: ts,
  52. logBuf: logBuf,
  53. }
  54. ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config
  55. ts.Config.ErrorLog = log.New(io.MultiWriter(twriter{t: t, st: st}, logBuf), "", log.LstdFlags)
  56. ts.StartTLS()
  57. if VerboseLogs {
  58. t.Logf("Running test server at: %s", ts.URL)
  59. }
  60. var (
  61. mu sync.Mutex
  62. sc *serverConn
  63. )
  64. testHookGetServerConn = func(v *serverConn) {
  65. mu.Lock()
  66. defer mu.Unlock()
  67. sc = v
  68. sc.testHookCh = make(chan func())
  69. }
  70. cc, err := tls.Dial("tcp", ts.Listener.Addr().String(), &tls.Config{
  71. InsecureSkipVerify: true,
  72. NextProtos: []string{NextProtoTLS},
  73. })
  74. if err != nil {
  75. t.Fatal(err)
  76. }
  77. log.SetOutput(twriter{t: t, st: st})
  78. st.cc = cc
  79. st.fr = NewFramer(cc, cc)
  80. mu.Lock()
  81. st.sc = sc
  82. mu.Unlock() // unnecessary, but looks weird without.
  83. return st
  84. }
  85. func (st *serverTester) addLogFilter(phrase string) {
  86. st.logFilter = append(st.logFilter, phrase)
  87. }
  88. func (st *serverTester) stream(id uint32) *stream {
  89. ch := make(chan *stream, 1)
  90. st.sc.testHookCh <- func() {
  91. ch <- st.sc.streams[id]
  92. }
  93. return <-ch
  94. }
  95. func (st *serverTester) streamState(id uint32) streamState {
  96. ch := make(chan streamState, 1)
  97. st.sc.testHookCh <- func() {
  98. state, _ := st.sc.state(id)
  99. ch <- state
  100. }
  101. return <-ch
  102. }
  103. func (st *serverTester) Close() {
  104. st.ts.Close()
  105. st.cc.Close()
  106. log.SetOutput(os.Stderr)
  107. }
  108. // greet initiates the client's HTTP/2 connection into a state where
  109. // frames may be sent.
  110. func (st *serverTester) greet() {
  111. st.writePreface()
  112. st.writeInitialSettings()
  113. st.wantSettings()
  114. st.writeSettingsAck()
  115. st.wantSettingsAck()
  116. }
  117. func (st *serverTester) writePreface() {
  118. n, err := st.cc.Write(clientPreface)
  119. if err != nil {
  120. st.t.Fatalf("Error writing client preface: %v", err)
  121. }
  122. if n != len(clientPreface) {
  123. st.t.Fatalf("Writing client preface, wrote %d bytes; want %d", n, len(clientPreface))
  124. }
  125. }
  126. func (st *serverTester) writeInitialSettings() {
  127. if err := st.fr.WriteSettings(); err != nil {
  128. st.t.Fatalf("Error writing initial SETTINGS frame from client to server: %v", err)
  129. }
  130. }
  131. func (st *serverTester) writeSettingsAck() {
  132. if err := st.fr.WriteSettingsAck(); err != nil {
  133. st.t.Fatalf("Error writing ACK of server's SETTINGS: %v", err)
  134. }
  135. }
  136. func (st *serverTester) writeHeaders(p HeadersFrameParam) {
  137. if err := st.fr.WriteHeaders(p); err != nil {
  138. st.t.Fatalf("Error writing HEADERS: %v", err)
  139. }
  140. }
  141. // bodylessReq1 writes a HEADERS frames with StreamID 1 and EndStream and EndHeaders set.
  142. func (st *serverTester) bodylessReq1(headers ...string) {
  143. st.writeHeaders(HeadersFrameParam{
  144. StreamID: 1, // clients send odd numbers
  145. BlockFragment: encodeHeader(st.t, headers...),
  146. EndStream: true,
  147. EndHeaders: true,
  148. })
  149. }
  150. func (st *serverTester) writeData(streamID uint32, endStream bool, data []byte) {
  151. if err := st.fr.WriteData(streamID, endStream, data); err != nil {
  152. st.t.Fatalf("Error writing DATA: %v", err)
  153. }
  154. }
  155. func (st *serverTester) readFrame() (Frame, error) {
  156. frc := make(chan Frame, 1)
  157. errc := make(chan error, 1)
  158. go func() {
  159. fr, err := st.fr.ReadFrame()
  160. if err != nil {
  161. errc <- err
  162. } else {
  163. frc <- fr
  164. }
  165. }()
  166. t := time.NewTimer(2 * time.Second)
  167. defer t.Stop()
  168. select {
  169. case f := <-frc:
  170. return f, nil
  171. case err := <-errc:
  172. return nil, err
  173. case <-t.C:
  174. return nil, errors.New("timeout waiting for frame")
  175. }
  176. }
  177. func (st *serverTester) wantHeaders() *HeadersFrame {
  178. f, err := st.readFrame()
  179. if err != nil {
  180. st.t.Fatalf("Error while expecting a HEADERS frame: %v", err)
  181. }
  182. hf, ok := f.(*HeadersFrame)
  183. if !ok {
  184. st.t.Fatalf("got a %T; want *HeadersFrame", f)
  185. }
  186. return hf
  187. }
  188. func (st *serverTester) wantContinuation() *ContinuationFrame {
  189. f, err := st.readFrame()
  190. if err != nil {
  191. st.t.Fatalf("Error while expecting a CONTINUATION frame: %v", err)
  192. }
  193. cf, ok := f.(*ContinuationFrame)
  194. if !ok {
  195. st.t.Fatalf("got a %T; want *ContinuationFrame", f)
  196. }
  197. return cf
  198. }
  199. func (st *serverTester) wantData() *DataFrame {
  200. f, err := st.readFrame()
  201. if err != nil {
  202. st.t.Fatalf("Error while expecting a DATA frame: %v", err)
  203. }
  204. df, ok := f.(*DataFrame)
  205. if !ok {
  206. st.t.Fatalf("got a %T; want *DataFrame", f)
  207. }
  208. return df
  209. }
  210. func (st *serverTester) wantSettings() *SettingsFrame {
  211. f, err := st.readFrame()
  212. if err != nil {
  213. st.t.Fatalf("Error while expecting a SETTINGS frame: %v", err)
  214. }
  215. sf, ok := f.(*SettingsFrame)
  216. if !ok {
  217. st.t.Fatalf("got a %T; want *SettingsFrame", f)
  218. }
  219. return sf
  220. }
  221. func (st *serverTester) wantPing() *PingFrame {
  222. f, err := st.readFrame()
  223. if err != nil {
  224. st.t.Fatalf("Error while expecting a PING frame: %v", err)
  225. }
  226. pf, ok := f.(*PingFrame)
  227. if !ok {
  228. st.t.Fatalf("got a %T; want *PingFrame", f)
  229. }
  230. return pf
  231. }
  232. func (st *serverTester) wantGoAway() *GoAwayFrame {
  233. f, err := st.readFrame()
  234. if err != nil {
  235. st.t.Fatalf("Error while expecting a GOAWAY frame: %v", err)
  236. }
  237. gf, ok := f.(*GoAwayFrame)
  238. if !ok {
  239. st.t.Fatalf("got a %T; want *GoAwayFrame", f)
  240. }
  241. return gf
  242. }
  243. func (st *serverTester) wantRSTStream(streamID uint32, errCode ErrCode) {
  244. f, err := st.readFrame()
  245. if err != nil {
  246. st.t.Fatalf("Error while expecting an RSTStream frame: %v", err)
  247. }
  248. rs, ok := f.(*RSTStreamFrame)
  249. if !ok {
  250. st.t.Fatalf("got a %T; want *RSTStreamFrame", f)
  251. }
  252. if rs.FrameHeader.StreamID != streamID {
  253. st.t.Fatalf("RSTStream StreamID = %d; want %d", rs.FrameHeader.StreamID, streamID)
  254. }
  255. if rs.ErrCode != errCode {
  256. st.t.Fatalf("RSTStream ErrCode = %d (%s); want %d (%s)", rs.ErrCode, rs.ErrCode, errCode, errCode)
  257. }
  258. }
  259. func (st *serverTester) wantWindowUpdate(streamID, incr uint32) {
  260. f, err := st.readFrame()
  261. if err != nil {
  262. st.t.Fatalf("Error while expecting a WINDOW_UPDATE frame: %v", err)
  263. }
  264. wu, ok := f.(*WindowUpdateFrame)
  265. if !ok {
  266. st.t.Fatalf("got a %T; want *WindowUpdateFrame", f)
  267. }
  268. if wu.FrameHeader.StreamID != streamID {
  269. st.t.Fatalf("WindowUpdate StreamID = %d; want %d", wu.FrameHeader.StreamID, streamID)
  270. }
  271. if wu.Increment != incr {
  272. st.t.Fatalf("WindowUpdate increment = %d; want %d", wu.Increment, incr)
  273. }
  274. }
  275. func (st *serverTester) wantSettingsAck() {
  276. f, err := st.readFrame()
  277. if err != nil {
  278. st.t.Fatal(err)
  279. }
  280. sf, ok := f.(*SettingsFrame)
  281. if !ok {
  282. st.t.Fatalf("Wanting a settings ACK, received a %T", f)
  283. }
  284. if !sf.Header().Flags.Has(FlagSettingsAck) {
  285. st.t.Fatal("Settings Frame didn't have ACK set")
  286. }
  287. }
  288. func TestServer(t *testing.T) {
  289. gotReq := make(chan bool, 1)
  290. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  291. w.Header().Set("Foo", "Bar")
  292. gotReq <- true
  293. })
  294. defer st.Close()
  295. covers("3.5", `
  296. The server connection preface consists of a potentially empty
  297. SETTINGS frame ([SETTINGS]) that MUST be the first frame the
  298. server sends in the HTTP/2 connection.
  299. `)
  300. st.writePreface()
  301. st.writeInitialSettings()
  302. st.wantSettings()
  303. st.writeSettingsAck()
  304. st.wantSettingsAck()
  305. st.writeHeaders(HeadersFrameParam{
  306. StreamID: 1, // clients send odd numbers
  307. BlockFragment: encodeHeader(t),
  308. EndStream: true, // no DATA frames
  309. EndHeaders: true,
  310. })
  311. select {
  312. case <-gotReq:
  313. case <-time.After(2 * time.Second):
  314. t.Error("timeout waiting for request")
  315. }
  316. }
  317. func TestServer_Request_Get(t *testing.T) {
  318. testServerRequest(t, func(st *serverTester) {
  319. st.writeHeaders(HeadersFrameParam{
  320. StreamID: 1, // clients send odd numbers
  321. BlockFragment: encodeHeader(t, "foo-bar", "some-value"),
  322. EndStream: true, // no DATA frames
  323. EndHeaders: true,
  324. })
  325. }, func(r *http.Request) {
  326. if r.Method != "GET" {
  327. t.Errorf("Method = %q; want GET", r.Method)
  328. }
  329. if r.URL.Path != "/" {
  330. t.Errorf("URL.Path = %q; want /", r.URL.Path)
  331. }
  332. if r.ContentLength != 0 {
  333. t.Errorf("ContentLength = %v; want 0", r.ContentLength)
  334. }
  335. if r.Close {
  336. t.Error("Close = true; want false")
  337. }
  338. if !strings.Contains(r.RemoteAddr, ":") {
  339. t.Errorf("RemoteAddr = %q; want something with a colon", r.RemoteAddr)
  340. }
  341. if r.Proto != "HTTP/2.0" || r.ProtoMajor != 2 || r.ProtoMinor != 0 {
  342. t.Errorf("Proto = %q Major=%v,Minor=%v; want HTTP/2.0", r.Proto, r.ProtoMajor, r.ProtoMinor)
  343. }
  344. wantHeader := http.Header{
  345. "Foo-Bar": []string{"some-value"},
  346. }
  347. if !reflect.DeepEqual(r.Header, wantHeader) {
  348. t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
  349. }
  350. if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 {
  351. t.Errorf("Read = %d, %v; want 0, EOF", n, err)
  352. }
  353. })
  354. }
  355. func TestServer_Request_Get_PathSlashes(t *testing.T) {
  356. testServerRequest(t, func(st *serverTester) {
  357. st.writeHeaders(HeadersFrameParam{
  358. StreamID: 1, // clients send odd numbers
  359. BlockFragment: encodeHeader(t, ":path", "/%2f/"),
  360. EndStream: true, // no DATA frames
  361. EndHeaders: true,
  362. })
  363. }, func(r *http.Request) {
  364. if r.RequestURI != "/%2f/" {
  365. t.Errorf("RequestURI = %q; want /%2f/", r.RequestURI)
  366. }
  367. if r.URL.Path != "///" {
  368. t.Errorf("URL.Path = %q; want ///", r.URL.Path)
  369. }
  370. })
  371. }
  372. // TODO: add a test with EndStream=true on the HEADERS but setting a
  373. // Content-Length anyway. Should we just omit it and force it to
  374. // zero?
  375. func TestServer_Request_Post_NoContentLength_EndStream(t *testing.T) {
  376. testServerRequest(t, func(st *serverTester) {
  377. st.writeHeaders(HeadersFrameParam{
  378. StreamID: 1, // clients send odd numbers
  379. BlockFragment: encodeHeader(t, ":method", "POST"),
  380. EndStream: true,
  381. EndHeaders: true,
  382. })
  383. }, func(r *http.Request) {
  384. if r.Method != "POST" {
  385. t.Errorf("Method = %q; want POST", r.Method)
  386. }
  387. if r.ContentLength != 0 {
  388. t.Errorf("ContentLength = %v; want 0", r.ContentLength)
  389. }
  390. if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 {
  391. t.Errorf("Read = %d, %v; want 0, EOF", n, err)
  392. }
  393. })
  394. }
  395. func TestServer_Request_Post_Body_ImmediateEOF(t *testing.T) {
  396. testBodyContents(t, -1, "", func(st *serverTester) {
  397. st.writeHeaders(HeadersFrameParam{
  398. StreamID: 1, // clients send odd numbers
  399. BlockFragment: encodeHeader(t, ":method", "POST"),
  400. EndStream: false, // to say DATA frames are coming
  401. EndHeaders: true,
  402. })
  403. st.writeData(1, true, nil) // just kidding. empty body.
  404. })
  405. }
  406. func TestServer_Request_Post_Body_OneData(t *testing.T) {
  407. const content = "Some content"
  408. testBodyContents(t, -1, content, func(st *serverTester) {
  409. st.writeHeaders(HeadersFrameParam{
  410. StreamID: 1, // clients send odd numbers
  411. BlockFragment: encodeHeader(t, ":method", "POST"),
  412. EndStream: false, // to say DATA frames are coming
  413. EndHeaders: true,
  414. })
  415. st.writeData(1, true, []byte(content))
  416. })
  417. }
  418. func TestServer_Request_Post_Body_TwoData(t *testing.T) {
  419. const content = "Some content"
  420. testBodyContents(t, -1, content, func(st *serverTester) {
  421. st.writeHeaders(HeadersFrameParam{
  422. StreamID: 1, // clients send odd numbers
  423. BlockFragment: encodeHeader(t, ":method", "POST"),
  424. EndStream: false, // to say DATA frames are coming
  425. EndHeaders: true,
  426. })
  427. st.writeData(1, false, []byte(content[:5]))
  428. st.writeData(1, true, []byte(content[5:]))
  429. })
  430. }
  431. func TestServer_Request_Post_Body_ContentLength_Correct(t *testing.T) {
  432. const content = "Some content"
  433. testBodyContents(t, int64(len(content)), content, func(st *serverTester) {
  434. st.writeHeaders(HeadersFrameParam{
  435. StreamID: 1, // clients send odd numbers
  436. BlockFragment: encodeHeader(t,
  437. ":method", "POST",
  438. "content-length", strconv.Itoa(len(content)),
  439. ),
  440. EndStream: false, // to say DATA frames are coming
  441. EndHeaders: true,
  442. })
  443. st.writeData(1, true, []byte(content))
  444. })
  445. }
  446. func TestServer_Request_Post_Body_ContentLength_TooLarge(t *testing.T) {
  447. testBodyContentsFail(t, 3, "request declared a Content-Length of 3 but only wrote 2 bytes",
  448. func(st *serverTester) {
  449. st.writeHeaders(HeadersFrameParam{
  450. StreamID: 1, // clients send odd numbers
  451. BlockFragment: encodeHeader(t,
  452. ":method", "POST",
  453. "content-length", "3",
  454. ),
  455. EndStream: false, // to say DATA frames are coming
  456. EndHeaders: true,
  457. })
  458. st.writeData(1, true, []byte("12"))
  459. })
  460. }
  461. func TestServer_Request_Post_Body_ContentLength_TooSmall(t *testing.T) {
  462. testBodyContentsFail(t, 4, "sender tried to send more than declared Content-Length of 4 bytes",
  463. func(st *serverTester) {
  464. st.writeHeaders(HeadersFrameParam{
  465. StreamID: 1, // clients send odd numbers
  466. BlockFragment: encodeHeader(t,
  467. ":method", "POST",
  468. "content-length", "4",
  469. ),
  470. EndStream: false, // to say DATA frames are coming
  471. EndHeaders: true,
  472. })
  473. st.writeData(1, true, []byte("12345"))
  474. })
  475. }
  476. func testBodyContents(t *testing.T, wantContentLength int64, wantBody string, write func(st *serverTester)) {
  477. testServerRequest(t, write, func(r *http.Request) {
  478. if r.Method != "POST" {
  479. t.Errorf("Method = %q; want POST", r.Method)
  480. }
  481. if r.ContentLength != wantContentLength {
  482. t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength)
  483. }
  484. all, err := ioutil.ReadAll(r.Body)
  485. if err != nil {
  486. t.Fatal(err)
  487. }
  488. if string(all) != wantBody {
  489. t.Errorf("Read = %q; want %q", all, wantBody)
  490. }
  491. if err := r.Body.Close(); err != nil {
  492. t.Fatalf("Close: %v", err)
  493. }
  494. })
  495. }
  496. func testBodyContentsFail(t *testing.T, wantContentLength int64, wantReadError string, write func(st *serverTester)) {
  497. testServerRequest(t, write, func(r *http.Request) {
  498. if r.Method != "POST" {
  499. t.Errorf("Method = %q; want POST", r.Method)
  500. }
  501. if r.ContentLength != wantContentLength {
  502. t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength)
  503. }
  504. all, err := ioutil.ReadAll(r.Body)
  505. if err == nil {
  506. t.Fatalf("expected an error (%q) reading from the body. Successfully read %q instead.",
  507. wantReadError, all)
  508. }
  509. if !strings.Contains(err.Error(), wantReadError) {
  510. t.Fatalf("Body.Read = %v; want substring %q", err, wantReadError)
  511. }
  512. if err := r.Body.Close(); err != nil {
  513. t.Fatalf("Close: %v", err)
  514. }
  515. })
  516. }
  517. // Using a Host header, instead of :authority
  518. func TestServer_Request_Get_Host(t *testing.T) {
  519. const host = "example.com"
  520. testServerRequest(t, func(st *serverTester) {
  521. st.writeHeaders(HeadersFrameParam{
  522. StreamID: 1, // clients send odd numbers
  523. BlockFragment: encodeHeader(t, "host", host),
  524. EndStream: true,
  525. EndHeaders: true,
  526. })
  527. }, func(r *http.Request) {
  528. if r.Host != host {
  529. t.Errorf("Host = %q; want %q", r.Host, host)
  530. }
  531. })
  532. }
  533. // Using an :authority pseudo-header, instead of Host
  534. func TestServer_Request_Get_Authority(t *testing.T) {
  535. const host = "example.com"
  536. testServerRequest(t, func(st *serverTester) {
  537. st.writeHeaders(HeadersFrameParam{
  538. StreamID: 1, // clients send odd numbers
  539. BlockFragment: encodeHeader(t, ":authority", host),
  540. EndStream: true,
  541. EndHeaders: true,
  542. })
  543. }, func(r *http.Request) {
  544. if r.Host != host {
  545. t.Errorf("Host = %q; want %q", r.Host, host)
  546. }
  547. })
  548. }
  549. func TestServer_Request_WithContinuation(t *testing.T) {
  550. wantHeader := http.Header{
  551. "Foo-One": []string{"value-one"},
  552. "Foo-Two": []string{"value-two"},
  553. "Foo-Three": []string{"value-three"},
  554. }
  555. testServerRequest(t, func(st *serverTester) {
  556. fullHeaders := encodeHeader(t,
  557. "foo-one", "value-one",
  558. "foo-two", "value-two",
  559. "foo-three", "value-three",
  560. )
  561. remain := fullHeaders
  562. chunks := 0
  563. for len(remain) > 0 {
  564. const maxChunkSize = 5
  565. chunk := remain
  566. if len(chunk) > maxChunkSize {
  567. chunk = chunk[:maxChunkSize]
  568. }
  569. remain = remain[len(chunk):]
  570. if chunks == 0 {
  571. st.writeHeaders(HeadersFrameParam{
  572. StreamID: 1, // clients send odd numbers
  573. BlockFragment: chunk,
  574. EndStream: true, // no DATA frames
  575. EndHeaders: false, // we'll have continuation frames
  576. })
  577. } else {
  578. err := st.fr.WriteContinuation(1, len(remain) == 0, chunk)
  579. if err != nil {
  580. t.Fatal(err)
  581. }
  582. }
  583. chunks++
  584. }
  585. if chunks < 2 {
  586. t.Fatal("too few chunks")
  587. }
  588. }, func(r *http.Request) {
  589. if !reflect.DeepEqual(r.Header, wantHeader) {
  590. t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
  591. }
  592. })
  593. }
  594. // Concatenated cookie headers. ("8.1.2.5 Compressing the Cookie Header Field")
  595. func TestServer_Request_CookieConcat(t *testing.T) {
  596. const host = "example.com"
  597. testServerRequest(t, func(st *serverTester) {
  598. st.bodylessReq1(
  599. ":authority", host,
  600. "cookie", "a=b",
  601. "cookie", "c=d",
  602. "cookie", "e=f",
  603. )
  604. }, func(r *http.Request) {
  605. const want = "a=b; c=d; e=f"
  606. if got := r.Header.Get("Cookie"); got != want {
  607. t.Errorf("Cookie = %q; want %q", got, want)
  608. }
  609. })
  610. }
  611. func TestServer_Request_Reject_CapitalHeader(t *testing.T) {
  612. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("UPPER", "v") })
  613. }
  614. func TestServer_Request_Reject_Pseudo_Missing_method(t *testing.T) {
  615. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "") })
  616. }
  617. func TestServer_Request_Reject_Pseudo_ExactlyOne(t *testing.T) {
  618. // 8.1.2.3 Request Pseudo-Header Fields
  619. // "All HTTP/2 requests MUST include exactly one valid value" ...
  620. testRejectRequest(t, func(st *serverTester) {
  621. st.addLogFilter("duplicate pseudo-header")
  622. st.bodylessReq1(":method", "GET", ":method", "POST")
  623. })
  624. }
  625. func TestServer_Request_Reject_Pseudo_AfterRegular(t *testing.T) {
  626. // 8.1.2.3 Request Pseudo-Header Fields
  627. // "All pseudo-header fields MUST appear in the header block
  628. // before regular header fields. Any request or response that
  629. // contains a pseudo-header field that appears in a header
  630. // block after a regular header field MUST be treated as
  631. // malformed (Section 8.1.2.6)."
  632. testRejectRequest(t, func(st *serverTester) {
  633. st.addLogFilter("pseudo-header after regular header")
  634. var buf bytes.Buffer
  635. enc := hpack.NewEncoder(&buf)
  636. enc.WriteField(hpack.HeaderField{Name: ":method", Value: "GET"})
  637. enc.WriteField(hpack.HeaderField{Name: "regular", Value: "foobar"})
  638. enc.WriteField(hpack.HeaderField{Name: ":path", Value: "/"})
  639. enc.WriteField(hpack.HeaderField{Name: ":scheme", Value: "https"})
  640. st.writeHeaders(HeadersFrameParam{
  641. StreamID: 1, // clients send odd numbers
  642. BlockFragment: buf.Bytes(),
  643. EndStream: true,
  644. EndHeaders: true,
  645. })
  646. })
  647. }
  648. func TestServer_Request_Reject_Pseudo_Missing_path(t *testing.T) {
  649. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":path", "") })
  650. }
  651. func TestServer_Request_Reject_Pseudo_Missing_scheme(t *testing.T) {
  652. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "") })
  653. }
  654. func TestServer_Request_Reject_Pseudo_scheme_invalid(t *testing.T) {
  655. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "bogus") })
  656. }
  657. func TestServer_Request_Reject_Pseudo_Unknown(t *testing.T) {
  658. testRejectRequest(t, func(st *serverTester) {
  659. st.addLogFilter(`invalid pseudo-header ":unknown_thing"`)
  660. st.bodylessReq1(":unknown_thing", "")
  661. })
  662. }
  663. func testRejectRequest(t *testing.T, send func(*serverTester)) {
  664. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  665. t.Fatal("server request made it to handler; should've been rejected")
  666. })
  667. defer st.Close()
  668. st.greet()
  669. send(st)
  670. st.wantRSTStream(1, ErrCodeProtocol)
  671. }
  672. func TestServer_Ping(t *testing.T) {
  673. st := newServerTester(t, nil)
  674. defer st.Close()
  675. st.greet()
  676. // Server should ignore this one, since it has ACK set.
  677. ackPingData := [8]byte{1, 2, 4, 8, 16, 32, 64, 128}
  678. if err := st.fr.WritePing(true, ackPingData); err != nil {
  679. t.Fatal(err)
  680. }
  681. // But the server should reply to this one, since ACK is false.
  682. pingData := [8]byte{1, 2, 3, 4, 5, 6, 7, 8}
  683. if err := st.fr.WritePing(false, pingData); err != nil {
  684. t.Fatal(err)
  685. }
  686. pf := st.wantPing()
  687. if !pf.Flags.Has(FlagPingAck) {
  688. t.Error("response ping doesn't have ACK set")
  689. }
  690. if pf.Data != pingData {
  691. t.Errorf("response ping has data %q; want %q", pf.Data, pingData)
  692. }
  693. }
  694. func TestServer_RejectsLargeFrames(t *testing.T) {
  695. st := newServerTester(t, nil)
  696. defer st.Close()
  697. st.greet()
  698. // Write too large of a frame (too large by one byte)
  699. // We ignore the return value because it's expected that the server
  700. // will only read the first 9 bytes (the headre) and then disconnect.
  701. st.fr.WriteRawFrame(0xff, 0, 0, make([]byte, defaultMaxReadFrameSize+1))
  702. gf := st.wantGoAway()
  703. if gf.ErrCode != ErrCodeFrameSize {
  704. t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFrameSize)
  705. }
  706. }
  707. func TestServer_Handler_Sends_WindowUpdate(t *testing.T) {
  708. puppet := newHandlerPuppet()
  709. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  710. puppet.act(w, r)
  711. })
  712. defer st.Close()
  713. defer puppet.done()
  714. st.greet()
  715. st.writeHeaders(HeadersFrameParam{
  716. StreamID: 1, // clients send odd numbers
  717. BlockFragment: encodeHeader(t, ":method", "POST"),
  718. EndStream: false, // data coming
  719. EndHeaders: true,
  720. })
  721. st.writeData(1, false, []byte("abcdef"))
  722. puppet.do(readBodyHandler(t, "abc"))
  723. st.wantWindowUpdate(0, 3)
  724. st.wantWindowUpdate(1, 3)
  725. puppet.do(readBodyHandler(t, "def"))
  726. st.wantWindowUpdate(0, 3)
  727. st.wantWindowUpdate(1, 3)
  728. st.writeData(1, true, []byte("ghijkl")) // END_STREAM here
  729. puppet.do(readBodyHandler(t, "ghi"))
  730. puppet.do(readBodyHandler(t, "jkl"))
  731. st.wantWindowUpdate(0, 3)
  732. st.wantWindowUpdate(0, 3) // no more stream-level, since END_STREAM
  733. }
  734. func TestServer_Send_GoAway_After_Bogus_WindowUpdate(t *testing.T) {
  735. st := newServerTester(t, nil)
  736. defer st.Close()
  737. st.greet()
  738. if err := st.fr.WriteWindowUpdate(0, 1<<31-1); err != nil {
  739. t.Fatal(err)
  740. }
  741. gf := st.wantGoAway()
  742. if gf.ErrCode != ErrCodeFlowControl {
  743. t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFlowControl)
  744. }
  745. if gf.LastStreamID != 0 {
  746. t.Errorf("GOAWAY last stream ID = %v; want %v", gf.LastStreamID, 0)
  747. }
  748. }
  749. func TestServer_Send_RstStream_After_Bogus_WindowUpdate(t *testing.T) {
  750. inHandler := make(chan bool)
  751. blockHandler := make(chan bool)
  752. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  753. inHandler <- true
  754. <-blockHandler
  755. })
  756. defer st.Close()
  757. defer close(blockHandler)
  758. st.greet()
  759. st.writeHeaders(HeadersFrameParam{
  760. StreamID: 1,
  761. BlockFragment: encodeHeader(st.t, ":method", "POST"),
  762. EndStream: false, // keep it open
  763. EndHeaders: true,
  764. })
  765. <-inHandler
  766. // Send a bogus window update:
  767. if err := st.fr.WriteWindowUpdate(1, 1<<31-1); err != nil {
  768. t.Fatal(err)
  769. }
  770. st.wantRSTStream(1, ErrCodeFlowControl)
  771. }
  772. // testServerPostUnblock sends a hanging POST with unsent data to handler,
  773. // then runs fn once in the handler, and verifies that the error returned from
  774. // handler is acceptable. It fails if takes over 5 seconds for handler to exit.
  775. func testServerPostUnblock(t *testing.T,
  776. handler func(http.ResponseWriter, *http.Request) error,
  777. fn func(*serverTester),
  778. checkErr func(error),
  779. otherHeaders ...string) {
  780. inHandler := make(chan bool)
  781. errc := make(chan error, 1)
  782. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  783. inHandler <- true
  784. errc <- handler(w, r)
  785. })
  786. st.greet()
  787. st.writeHeaders(HeadersFrameParam{
  788. StreamID: 1,
  789. BlockFragment: encodeHeader(st.t, append([]string{":method", "POST"}, otherHeaders...)...),
  790. EndStream: false, // keep it open
  791. EndHeaders: true,
  792. })
  793. <-inHandler
  794. fn(st)
  795. select {
  796. case err := <-errc:
  797. if checkErr != nil {
  798. checkErr(err)
  799. }
  800. case <-time.After(5 * time.Second):
  801. t.Fatal("timeout waiting for Handler to return")
  802. }
  803. st.Close()
  804. }
  805. func TestServer_RSTStream_Unblocks_Read(t *testing.T) {
  806. testServerPostUnblock(t,
  807. func(w http.ResponseWriter, r *http.Request) (err error) {
  808. _, err = r.Body.Read(make([]byte, 1))
  809. return
  810. },
  811. func(st *serverTester) {
  812. if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  813. t.Fatal(err)
  814. }
  815. },
  816. func(err error) {
  817. if err == nil {
  818. t.Error("unexpected nil error from Request.Body.Read")
  819. }
  820. },
  821. )
  822. }
  823. func TestServer_DeadConn_Unblocks_Read(t *testing.T) {
  824. testServerPostUnblock(t,
  825. func(w http.ResponseWriter, r *http.Request) (err error) {
  826. _, err = r.Body.Read(make([]byte, 1))
  827. return
  828. },
  829. func(st *serverTester) { st.cc.Close() },
  830. func(err error) {
  831. if err == nil {
  832. t.Error("unexpected nil error from Request.Body.Read")
  833. }
  834. },
  835. )
  836. }
  837. var blockUntilClosed = func(w http.ResponseWriter, r *http.Request) error {
  838. <-w.(http.CloseNotifier).CloseNotify()
  839. return nil
  840. }
  841. func TestServer_CloseNotify_After_RSTStream(t *testing.T) {
  842. testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) {
  843. if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  844. t.Fatal(err)
  845. }
  846. }, nil)
  847. }
  848. func TestServer_CloseNotify_After_ConnClose(t *testing.T) {
  849. testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { st.cc.Close() }, nil)
  850. }
  851. // that CloseNotify unblocks after a stream error due to the client's
  852. // problem that's unrelated to them explicitly canceling it (which is
  853. // TestServer_CloseNotify_After_RSTStream above)
  854. func TestServer_CloseNotify_After_StreamError(t *testing.T) {
  855. testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) {
  856. // data longer than declared Content-Length => stream error
  857. st.writeData(1, true, []byte("1234"))
  858. }, nil, "content-length", "3")
  859. }
  860. func TestServer_StateTransitions(t *testing.T) {
  861. var st *serverTester
  862. inHandler := make(chan bool)
  863. writeData := make(chan bool)
  864. leaveHandler := make(chan bool)
  865. st = newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  866. inHandler <- true
  867. if st.stream(1) == nil {
  868. t.Errorf("nil stream 1 in handler")
  869. }
  870. if got, want := st.streamState(1), stateOpen; got != want {
  871. t.Errorf("in handler, state is %v; want %v", got, want)
  872. }
  873. writeData <- true
  874. if n, err := r.Body.Read(make([]byte, 1)); n != 0 || err != io.EOF {
  875. t.Errorf("body read = %d, %v; want 0, EOF", n, err)
  876. }
  877. if got, want := st.streamState(1), stateHalfClosedRemote; got != want {
  878. t.Errorf("in handler, state is %v; want %v", got, want)
  879. }
  880. <-leaveHandler
  881. })
  882. st.greet()
  883. if st.stream(1) != nil {
  884. t.Fatal("stream 1 should be empty")
  885. }
  886. if got := st.streamState(1); got != stateIdle {
  887. t.Fatalf("stream 1 should be idle; got %v", got)
  888. }
  889. st.writeHeaders(HeadersFrameParam{
  890. StreamID: 1,
  891. BlockFragment: encodeHeader(st.t, ":method", "POST"),
  892. EndStream: false, // keep it open
  893. EndHeaders: true,
  894. })
  895. <-inHandler
  896. <-writeData
  897. st.writeData(1, true, nil)
  898. leaveHandler <- true
  899. hf := st.wantHeaders()
  900. if !hf.StreamEnded() {
  901. t.Fatal("expected END_STREAM flag")
  902. }
  903. if got, want := st.streamState(1), stateClosed; got != want {
  904. t.Errorf("at end, state is %v; want %v", got, want)
  905. }
  906. if st.stream(1) != nil {
  907. t.Fatal("at end, stream 1 should be gone")
  908. }
  909. }
  910. // test HEADERS w/o EndHeaders + another HEADERS (should get rejected)
  911. func TestServer_Rejects_HeadersNoEnd_Then_Headers(t *testing.T) {
  912. testServerRejects(t, func(st *serverTester) {
  913. st.writeHeaders(HeadersFrameParam{
  914. StreamID: 1,
  915. BlockFragment: encodeHeader(st.t),
  916. EndStream: true,
  917. EndHeaders: false,
  918. })
  919. st.writeHeaders(HeadersFrameParam{ // Not a continuation.
  920. StreamID: 3, // different stream.
  921. BlockFragment: encodeHeader(st.t),
  922. EndStream: true,
  923. EndHeaders: true,
  924. })
  925. })
  926. }
  927. // test HEADERS w/o EndHeaders + PING (should get rejected)
  928. func TestServer_Rejects_HeadersNoEnd_Then_Ping(t *testing.T) {
  929. testServerRejects(t, func(st *serverTester) {
  930. st.writeHeaders(HeadersFrameParam{
  931. StreamID: 1,
  932. BlockFragment: encodeHeader(st.t),
  933. EndStream: true,
  934. EndHeaders: false,
  935. })
  936. if err := st.fr.WritePing(false, [8]byte{}); err != nil {
  937. t.Fatal(err)
  938. }
  939. })
  940. }
  941. // test HEADERS w/ EndHeaders + a continuation HEADERS (should get rejected)
  942. func TestServer_Rejects_HeadersEnd_Then_Continuation(t *testing.T) {
  943. testServerRejects(t, func(st *serverTester) {
  944. st.writeHeaders(HeadersFrameParam{
  945. StreamID: 1,
  946. BlockFragment: encodeHeader(st.t),
  947. EndStream: true,
  948. EndHeaders: true,
  949. })
  950. st.wantHeaders()
  951. if err := st.fr.WriteContinuation(1, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil {
  952. t.Fatal(err)
  953. }
  954. })
  955. }
  956. // test HEADERS w/o EndHeaders + a continuation HEADERS on wrong stream ID
  957. func TestServer_Rejects_HeadersNoEnd_Then_ContinuationWrongStream(t *testing.T) {
  958. testServerRejects(t, func(st *serverTester) {
  959. st.writeHeaders(HeadersFrameParam{
  960. StreamID: 1,
  961. BlockFragment: encodeHeader(st.t),
  962. EndStream: true,
  963. EndHeaders: false,
  964. })
  965. if err := st.fr.WriteContinuation(3, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil {
  966. t.Fatal(err)
  967. }
  968. })
  969. }
  970. // No HEADERS on stream 0.
  971. func TestServer_Rejects_Headers0(t *testing.T) {
  972. testServerRejects(t, func(st *serverTester) {
  973. st.fr.AllowIllegalWrites = true
  974. st.writeHeaders(HeadersFrameParam{
  975. StreamID: 0,
  976. BlockFragment: encodeHeader(st.t),
  977. EndStream: true,
  978. EndHeaders: true,
  979. })
  980. })
  981. }
  982. // No CONTINUATION on stream 0.
  983. func TestServer_Rejects_Continuation0(t *testing.T) {
  984. testServerRejects(t, func(st *serverTester) {
  985. st.fr.AllowIllegalWrites = true
  986. if err := st.fr.WriteContinuation(0, true, encodeHeader(t)); err != nil {
  987. t.Fatal(err)
  988. }
  989. })
  990. }
  991. func TestServer_Rejects_PushPromise(t *testing.T) {
  992. testServerRejects(t, func(st *serverTester) {
  993. pp := PushPromiseParam{
  994. StreamID: 1,
  995. PromiseID: 3,
  996. }
  997. if err := st.fr.WritePushPromise(pp); err != nil {
  998. t.Fatal(err)
  999. }
  1000. })
  1001. }
  1002. // testServerRejects tests that the server hangs up with a GOAWAY
  1003. // frame and a server close after the client does something
  1004. // deserving a CONNECTION_ERROR.
  1005. func testServerRejects(t *testing.T, writeReq func(*serverTester)) {
  1006. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {})
  1007. st.addLogFilter("connection error: PROTOCOL_ERROR")
  1008. defer st.Close()
  1009. st.greet()
  1010. writeReq(st)
  1011. st.wantGoAway()
  1012. errc := make(chan error, 1)
  1013. go func() {
  1014. fr, err := st.fr.ReadFrame()
  1015. if err == nil {
  1016. err = fmt.Errorf("got frame of type %T", fr)
  1017. }
  1018. errc <- err
  1019. }()
  1020. select {
  1021. case err := <-errc:
  1022. if err != io.EOF {
  1023. t.Errorf("ReadFrame = %v; want io.EOF", err)
  1024. }
  1025. case <-time.After(2 * time.Second):
  1026. t.Error("timeout waiting for disconnect")
  1027. }
  1028. }
  1029. // testServerRequest sets up an idle HTTP/2 connection and lets you
  1030. // write a single request with writeReq, and then verify that the
  1031. // *http.Request is built correctly in checkReq.
  1032. func testServerRequest(t *testing.T, writeReq func(*serverTester), checkReq func(*http.Request)) {
  1033. gotReq := make(chan bool, 1)
  1034. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1035. if r.Body == nil {
  1036. t.Fatal("nil Body")
  1037. }
  1038. checkReq(r)
  1039. gotReq <- true
  1040. })
  1041. defer st.Close()
  1042. st.greet()
  1043. writeReq(st)
  1044. select {
  1045. case <-gotReq:
  1046. case <-time.After(2 * time.Second):
  1047. t.Error("timeout waiting for request")
  1048. }
  1049. }
  1050. func getSlash(st *serverTester) { st.bodylessReq1() }
  1051. func TestServer_Response_NoData(t *testing.T) {
  1052. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1053. // Nothing.
  1054. return nil
  1055. }, func(st *serverTester) {
  1056. getSlash(st)
  1057. hf := st.wantHeaders()
  1058. if !hf.StreamEnded() {
  1059. t.Fatal("want END_STREAM flag")
  1060. }
  1061. if !hf.HeadersEnded() {
  1062. t.Fatal("want END_HEADERS flag")
  1063. }
  1064. })
  1065. }
  1066. func TestServer_Response_NoData_Header_FooBar(t *testing.T) {
  1067. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1068. w.Header().Set("Foo-Bar", "some-value")
  1069. return nil
  1070. }, func(st *serverTester) {
  1071. getSlash(st)
  1072. hf := st.wantHeaders()
  1073. if !hf.StreamEnded() {
  1074. t.Fatal("want END_STREAM flag")
  1075. }
  1076. if !hf.HeadersEnded() {
  1077. t.Fatal("want END_HEADERS flag")
  1078. }
  1079. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1080. wanth := [][2]string{
  1081. {":status", "200"},
  1082. {"foo-bar", "some-value"},
  1083. {"content-type", "text/plain; charset=utf-8"},
  1084. {"content-length", "0"},
  1085. }
  1086. if !reflect.DeepEqual(goth, wanth) {
  1087. t.Errorf("Got headers %v; want %v", goth, wanth)
  1088. }
  1089. })
  1090. }
  1091. func TestServer_Response_Data_Sniff_DoesntOverride(t *testing.T) {
  1092. const msg = "<html>this is HTML."
  1093. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1094. w.Header().Set("Content-Type", "foo/bar")
  1095. io.WriteString(w, msg)
  1096. return nil
  1097. }, func(st *serverTester) {
  1098. getSlash(st)
  1099. hf := st.wantHeaders()
  1100. if hf.StreamEnded() {
  1101. t.Fatal("don't want END_STREAM, expecting data")
  1102. }
  1103. if !hf.HeadersEnded() {
  1104. t.Fatal("want END_HEADERS flag")
  1105. }
  1106. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1107. wanth := [][2]string{
  1108. {":status", "200"},
  1109. {"content-type", "foo/bar"},
  1110. {"content-length", strconv.Itoa(len(msg))},
  1111. }
  1112. if !reflect.DeepEqual(goth, wanth) {
  1113. t.Errorf("Got headers %v; want %v", goth, wanth)
  1114. }
  1115. df := st.wantData()
  1116. if !df.StreamEnded() {
  1117. t.Error("expected DATA to have END_STREAM flag")
  1118. }
  1119. if got := string(df.Data()); got != msg {
  1120. t.Errorf("got DATA %q; want %q", got, msg)
  1121. }
  1122. })
  1123. }
  1124. func TestServer_Response_TransferEncoding_chunked(t *testing.T) {
  1125. const msg = "hi"
  1126. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1127. w.Header().Set("Transfer-Encoding", "chunked") // should be stripped
  1128. io.WriteString(w, msg)
  1129. return nil
  1130. }, func(st *serverTester) {
  1131. getSlash(st)
  1132. hf := st.wantHeaders()
  1133. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1134. wanth := [][2]string{
  1135. {":status", "200"},
  1136. {"content-type", "text/plain; charset=utf-8"},
  1137. {"content-length", strconv.Itoa(len(msg))},
  1138. }
  1139. if !reflect.DeepEqual(goth, wanth) {
  1140. t.Errorf("Got headers %v; want %v", goth, wanth)
  1141. }
  1142. })
  1143. }
  1144. // Header accessed only after the initial write.
  1145. func TestServer_Response_Data_IgnoreHeaderAfterWrite_After(t *testing.T) {
  1146. const msg = "<html>this is HTML."
  1147. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1148. io.WriteString(w, msg)
  1149. w.Header().Set("foo", "should be ignored")
  1150. return nil
  1151. }, func(st *serverTester) {
  1152. getSlash(st)
  1153. hf := st.wantHeaders()
  1154. if hf.StreamEnded() {
  1155. t.Fatal("unexpected END_STREAM")
  1156. }
  1157. if !hf.HeadersEnded() {
  1158. t.Fatal("want END_HEADERS flag")
  1159. }
  1160. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1161. wanth := [][2]string{
  1162. {":status", "200"},
  1163. {"content-type", "text/html; charset=utf-8"},
  1164. {"content-length", strconv.Itoa(len(msg))},
  1165. }
  1166. if !reflect.DeepEqual(goth, wanth) {
  1167. t.Errorf("Got headers %v; want %v", goth, wanth)
  1168. }
  1169. })
  1170. }
  1171. // Header accessed before the initial write and later mutated.
  1172. func TestServer_Response_Data_IgnoreHeaderAfterWrite_Overwrite(t *testing.T) {
  1173. const msg = "<html>this is HTML."
  1174. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1175. w.Header().Set("foo", "proper value")
  1176. io.WriteString(w, msg)
  1177. w.Header().Set("foo", "should be ignored")
  1178. return nil
  1179. }, func(st *serverTester) {
  1180. getSlash(st)
  1181. hf := st.wantHeaders()
  1182. if hf.StreamEnded() {
  1183. t.Fatal("unexpected END_STREAM")
  1184. }
  1185. if !hf.HeadersEnded() {
  1186. t.Fatal("want END_HEADERS flag")
  1187. }
  1188. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1189. wanth := [][2]string{
  1190. {":status", "200"},
  1191. {"foo", "proper value"},
  1192. {"content-type", "text/html; charset=utf-8"},
  1193. {"content-length", strconv.Itoa(len(msg))},
  1194. }
  1195. if !reflect.DeepEqual(goth, wanth) {
  1196. t.Errorf("Got headers %v; want %v", goth, wanth)
  1197. }
  1198. })
  1199. }
  1200. func TestServer_Response_Data_SniffLenType(t *testing.T) {
  1201. const msg = "<html>this is HTML."
  1202. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1203. io.WriteString(w, msg)
  1204. return nil
  1205. }, func(st *serverTester) {
  1206. getSlash(st)
  1207. hf := st.wantHeaders()
  1208. if hf.StreamEnded() {
  1209. t.Fatal("don't want END_STREAM, expecting data")
  1210. }
  1211. if !hf.HeadersEnded() {
  1212. t.Fatal("want END_HEADERS flag")
  1213. }
  1214. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1215. wanth := [][2]string{
  1216. {":status", "200"},
  1217. {"content-type", "text/html; charset=utf-8"},
  1218. {"content-length", strconv.Itoa(len(msg))},
  1219. }
  1220. if !reflect.DeepEqual(goth, wanth) {
  1221. t.Errorf("Got headers %v; want %v", goth, wanth)
  1222. }
  1223. df := st.wantData()
  1224. if !df.StreamEnded() {
  1225. t.Error("expected DATA to have END_STREAM flag")
  1226. }
  1227. if got := string(df.Data()); got != msg {
  1228. t.Errorf("got DATA %q; want %q", got, msg)
  1229. }
  1230. })
  1231. }
  1232. func TestServer_Response_Header_Flush_MidWrite(t *testing.T) {
  1233. const msg = "<html>this is HTML"
  1234. const msg2 = ", and this is the next chunk"
  1235. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1236. io.WriteString(w, msg)
  1237. w.(http.Flusher).Flush()
  1238. io.WriteString(w, msg2)
  1239. return nil
  1240. }, func(st *serverTester) {
  1241. getSlash(st)
  1242. hf := st.wantHeaders()
  1243. if hf.StreamEnded() {
  1244. t.Fatal("unexpected END_STREAM flag")
  1245. }
  1246. if !hf.HeadersEnded() {
  1247. t.Fatal("want END_HEADERS flag")
  1248. }
  1249. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1250. wanth := [][2]string{
  1251. {":status", "200"},
  1252. {"content-type", "text/html; charset=utf-8"}, // sniffed
  1253. // and no content-length
  1254. }
  1255. if !reflect.DeepEqual(goth, wanth) {
  1256. t.Errorf("Got headers %v; want %v", goth, wanth)
  1257. }
  1258. {
  1259. df := st.wantData()
  1260. if df.StreamEnded() {
  1261. t.Error("unexpected END_STREAM flag")
  1262. }
  1263. if got := string(df.Data()); got != msg {
  1264. t.Errorf("got DATA %q; want %q", got, msg)
  1265. }
  1266. }
  1267. {
  1268. df := st.wantData()
  1269. if !df.StreamEnded() {
  1270. t.Error("wanted END_STREAM flag on last data chunk")
  1271. }
  1272. if got := string(df.Data()); got != msg2 {
  1273. t.Errorf("got DATA %q; want %q", got, msg2)
  1274. }
  1275. }
  1276. })
  1277. }
  1278. func TestServer_Response_LargeWrite(t *testing.T) {
  1279. const size = 1 << 20
  1280. const maxFrameSize = 16 << 10
  1281. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1282. n, err := w.Write(bytes.Repeat([]byte("a"), size))
  1283. if err != nil {
  1284. return fmt.Errorf("Write error: %v", err)
  1285. }
  1286. if n != size {
  1287. return fmt.Errorf("wrong size %d from Write", n)
  1288. }
  1289. return nil
  1290. }, func(st *serverTester) {
  1291. if err := st.fr.WriteSettings(
  1292. Setting{SettingInitialWindowSize, 0},
  1293. Setting{SettingMaxFrameSize, maxFrameSize},
  1294. ); err != nil {
  1295. t.Fatal(err)
  1296. }
  1297. st.wantSettingsAck()
  1298. getSlash(st) // make the single request
  1299. // Give the handler quota to write:
  1300. if err := st.fr.WriteWindowUpdate(1, size); err != nil {
  1301. t.Fatal(err)
  1302. }
  1303. // Give the handler quota to write to connection-level
  1304. // window as well
  1305. if err := st.fr.WriteWindowUpdate(0, size); err != nil {
  1306. t.Fatal(err)
  1307. }
  1308. hf := st.wantHeaders()
  1309. if hf.StreamEnded() {
  1310. t.Fatal("unexpected END_STREAM flag")
  1311. }
  1312. if !hf.HeadersEnded() {
  1313. t.Fatal("want END_HEADERS flag")
  1314. }
  1315. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1316. wanth := [][2]string{
  1317. {":status", "200"},
  1318. {"content-type", "text/plain; charset=utf-8"}, // sniffed
  1319. // and no content-length
  1320. }
  1321. if !reflect.DeepEqual(goth, wanth) {
  1322. t.Errorf("Got headers %v; want %v", goth, wanth)
  1323. }
  1324. var bytes, frames int
  1325. for {
  1326. df := st.wantData()
  1327. bytes += len(df.Data())
  1328. frames++
  1329. for _, b := range df.Data() {
  1330. if b != 'a' {
  1331. t.Fatal("non-'a' byte seen in DATA")
  1332. }
  1333. }
  1334. if df.StreamEnded() {
  1335. break
  1336. }
  1337. }
  1338. if bytes != size {
  1339. t.Errorf("Got %d bytes; want %d", bytes, size)
  1340. }
  1341. if want := int(size / maxFrameSize); frames < want || frames > want*2 {
  1342. t.Errorf("Got %d frames; want %d", frames, size)
  1343. }
  1344. })
  1345. }
  1346. // Test that the handler can't write more than the client allows
  1347. func TestServer_Response_LargeWrite_FlowControlled(t *testing.T) {
  1348. const size = 1 << 20
  1349. const maxFrameSize = 16 << 10
  1350. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1351. w.(http.Flusher).Flush()
  1352. n, err := w.Write(bytes.Repeat([]byte("a"), size))
  1353. if err != nil {
  1354. return fmt.Errorf("Write error: %v", err)
  1355. }
  1356. if n != size {
  1357. return fmt.Errorf("wrong size %d from Write", n)
  1358. }
  1359. return nil
  1360. }, func(st *serverTester) {
  1361. // Set the window size to something explicit for this test.
  1362. // It's also how much initial data we expect.
  1363. const initWindowSize = 123
  1364. if err := st.fr.WriteSettings(
  1365. Setting{SettingInitialWindowSize, initWindowSize},
  1366. Setting{SettingMaxFrameSize, maxFrameSize},
  1367. ); err != nil {
  1368. t.Fatal(err)
  1369. }
  1370. st.wantSettingsAck()
  1371. getSlash(st) // make the single request
  1372. defer func() { st.fr.WriteRSTStream(1, ErrCodeCancel) }()
  1373. hf := st.wantHeaders()
  1374. if hf.StreamEnded() {
  1375. t.Fatal("unexpected END_STREAM flag")
  1376. }
  1377. if !hf.HeadersEnded() {
  1378. t.Fatal("want END_HEADERS flag")
  1379. }
  1380. df := st.wantData()
  1381. if got := len(df.Data()); got != initWindowSize {
  1382. t.Fatalf("Initial window size = %d but got DATA with %d bytes", initWindowSize, got)
  1383. }
  1384. for _, quota := range []int{1, 13, 127} {
  1385. if err := st.fr.WriteWindowUpdate(1, uint32(quota)); err != nil {
  1386. t.Fatal(err)
  1387. }
  1388. df := st.wantData()
  1389. if int(quota) != len(df.Data()) {
  1390. t.Fatalf("read %d bytes after giving %d quota", len(df.Data()), quota)
  1391. }
  1392. }
  1393. if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  1394. t.Fatal(err)
  1395. }
  1396. })
  1397. }
  1398. // Test that the handler blocked in a Write is unblocked if the server sends a RST_STREAM.
  1399. func TestServer_Response_RST_Unblocks_LargeWrite(t *testing.T) {
  1400. const size = 1 << 20
  1401. const maxFrameSize = 16 << 10
  1402. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1403. w.(http.Flusher).Flush()
  1404. errc := make(chan error, 1)
  1405. go func() {
  1406. _, err := w.Write(bytes.Repeat([]byte("a"), size))
  1407. errc <- err
  1408. }()
  1409. select {
  1410. case err := <-errc:
  1411. if err == nil {
  1412. return errors.New("unexpected nil error from Write in handler")
  1413. }
  1414. return nil
  1415. case <-time.After(2 * time.Second):
  1416. return errors.New("timeout waiting for Write in handler")
  1417. }
  1418. }, func(st *serverTester) {
  1419. if err := st.fr.WriteSettings(
  1420. Setting{SettingInitialWindowSize, 0},
  1421. Setting{SettingMaxFrameSize, maxFrameSize},
  1422. ); err != nil {
  1423. t.Fatal(err)
  1424. }
  1425. st.wantSettingsAck()
  1426. getSlash(st) // make the single request
  1427. hf := st.wantHeaders()
  1428. if hf.StreamEnded() {
  1429. t.Fatal("unexpected END_STREAM flag")
  1430. }
  1431. if !hf.HeadersEnded() {
  1432. t.Fatal("want END_HEADERS flag")
  1433. }
  1434. if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  1435. t.Fatal(err)
  1436. }
  1437. })
  1438. }
  1439. func TestServer_Response_Empty_Data_Not_FlowControlled(t *testing.T) {
  1440. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1441. w.(http.Flusher).Flush()
  1442. // Nothing; send empty DATA
  1443. return nil
  1444. }, func(st *serverTester) {
  1445. // Handler gets no data quota:
  1446. if err := st.fr.WriteSettings(Setting{SettingInitialWindowSize, 0}); err != nil {
  1447. t.Fatal(err)
  1448. }
  1449. st.wantSettingsAck()
  1450. getSlash(st) // make the single request
  1451. hf := st.wantHeaders()
  1452. if hf.StreamEnded() {
  1453. t.Fatal("unexpected END_STREAM flag")
  1454. }
  1455. if !hf.HeadersEnded() {
  1456. t.Fatal("want END_HEADERS flag")
  1457. }
  1458. df := st.wantData()
  1459. if got := len(df.Data()); got != 0 {
  1460. t.Fatalf("unexpected %d DATA bytes; want 0", got)
  1461. }
  1462. if !df.StreamEnded() {
  1463. t.Fatal("DATA didn't have END_STREAM")
  1464. }
  1465. })
  1466. }
  1467. func TestServer_Response_Automatic100Continue(t *testing.T) {
  1468. const msg = "foo"
  1469. const reply = "bar"
  1470. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1471. if v := r.Header.Get("Expect"); v != "" {
  1472. t.Errorf("Expect header = %q; want empty", v)
  1473. }
  1474. buf := make([]byte, len(msg))
  1475. // This read should trigger the 100-continue being sent.
  1476. if n, err := io.ReadFull(r.Body, buf); err != nil || n != len(msg) || string(buf) != msg {
  1477. return fmt.Errorf("ReadFull = %q, %v; want %q, nil", buf[:n], err, msg)
  1478. }
  1479. _, err := io.WriteString(w, reply)
  1480. return err
  1481. }, func(st *serverTester) {
  1482. st.writeHeaders(HeadersFrameParam{
  1483. StreamID: 1, // clients send odd numbers
  1484. BlockFragment: encodeHeader(st.t, ":method", "POST", "expect", "100-continue"),
  1485. EndStream: false,
  1486. EndHeaders: true,
  1487. })
  1488. hf := st.wantHeaders()
  1489. if hf.StreamEnded() {
  1490. t.Fatal("unexpected END_STREAM flag")
  1491. }
  1492. if !hf.HeadersEnded() {
  1493. t.Fatal("want END_HEADERS flag")
  1494. }
  1495. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1496. wanth := [][2]string{
  1497. {":status", "100"},
  1498. }
  1499. if !reflect.DeepEqual(goth, wanth) {
  1500. t.Fatalf("Got headers %v; want %v", goth, wanth)
  1501. }
  1502. // Okay, they sent status 100, so we can send our
  1503. // gigantic and/or sensitive "foo" payload now.
  1504. st.writeData(1, true, []byte(msg))
  1505. st.wantWindowUpdate(0, uint32(len(msg)))
  1506. hf = st.wantHeaders()
  1507. if hf.StreamEnded() {
  1508. t.Fatal("expected data to follow")
  1509. }
  1510. if !hf.HeadersEnded() {
  1511. t.Fatal("want END_HEADERS flag")
  1512. }
  1513. goth = decodeHeader(t, hf.HeaderBlockFragment())
  1514. wanth = [][2]string{
  1515. {":status", "200"},
  1516. {"content-type", "text/plain; charset=utf-8"},
  1517. {"content-length", strconv.Itoa(len(reply))},
  1518. }
  1519. if !reflect.DeepEqual(goth, wanth) {
  1520. t.Errorf("Got headers %v; want %v", goth, wanth)
  1521. }
  1522. df := st.wantData()
  1523. if string(df.Data()) != reply {
  1524. t.Errorf("Client read %q; want %q", df.Data(), reply)
  1525. }
  1526. if !df.StreamEnded() {
  1527. t.Errorf("expect data stream end")
  1528. }
  1529. })
  1530. }
  1531. func TestServer_HandlerWriteErrorOnDisconnect(t *testing.T) {
  1532. errc := make(chan error, 1)
  1533. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1534. p := []byte("some data.\n")
  1535. for {
  1536. _, err := w.Write(p)
  1537. if err != nil {
  1538. errc <- err
  1539. return nil
  1540. }
  1541. }
  1542. }, func(st *serverTester) {
  1543. st.writeHeaders(HeadersFrameParam{
  1544. StreamID: 1,
  1545. BlockFragment: encodeHeader(st.t),
  1546. EndStream: false,
  1547. EndHeaders: true,
  1548. })
  1549. hf := st.wantHeaders()
  1550. if hf.StreamEnded() {
  1551. t.Fatal("unexpected END_STREAM flag")
  1552. }
  1553. if !hf.HeadersEnded() {
  1554. t.Fatal("want END_HEADERS flag")
  1555. }
  1556. // Close the connection and wait for the handler to (hopefully) notice.
  1557. st.cc.Close()
  1558. select {
  1559. case <-errc:
  1560. case <-time.After(5 * time.Second):
  1561. t.Error("timeout")
  1562. }
  1563. })
  1564. }
  1565. func TestServer_Rejects_Too_Many_Streams(t *testing.T) {
  1566. const testPath = "/some/path"
  1567. inHandler := make(chan uint32)
  1568. leaveHandler := make(chan bool)
  1569. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1570. id := w.(*responseWriter).rws.stream.id
  1571. inHandler <- id
  1572. if id == 1+(defaultMaxStreams+1)*2 && r.URL.Path != testPath {
  1573. t.Errorf("decoded final path as %q; want %q", r.URL.Path, testPath)
  1574. }
  1575. <-leaveHandler
  1576. })
  1577. defer st.Close()
  1578. st.greet()
  1579. nextStreamID := uint32(1)
  1580. streamID := func() uint32 {
  1581. defer func() { nextStreamID += 2 }()
  1582. return nextStreamID
  1583. }
  1584. sendReq := func(id uint32, headers ...string) {
  1585. st.writeHeaders(HeadersFrameParam{
  1586. StreamID: id,
  1587. BlockFragment: encodeHeader(st.t, headers...),
  1588. EndStream: true,
  1589. EndHeaders: true,
  1590. })
  1591. }
  1592. for i := 0; i < defaultMaxStreams; i++ {
  1593. sendReq(streamID())
  1594. <-inHandler
  1595. }
  1596. defer func() {
  1597. for i := 0; i < defaultMaxStreams; i++ {
  1598. leaveHandler <- true
  1599. }
  1600. }()
  1601. // And this one should cross the limit:
  1602. // (It's also sent as a CONTINUATION, to verify we still track the decoder context,
  1603. // even if we're rejecting it)
  1604. rejectID := streamID()
  1605. headerBlock := encodeHeader(st.t, ":path", testPath)
  1606. frag1, frag2 := headerBlock[:3], headerBlock[3:]
  1607. st.writeHeaders(HeadersFrameParam{
  1608. StreamID: rejectID,
  1609. BlockFragment: frag1,
  1610. EndStream: true,
  1611. EndHeaders: false, // CONTINUATION coming
  1612. })
  1613. if err := st.fr.WriteContinuation(rejectID, true, frag2); err != nil {
  1614. t.Fatal(err)
  1615. }
  1616. st.wantRSTStream(rejectID, ErrCodeProtocol)
  1617. // But let a handler finish:
  1618. leaveHandler <- true
  1619. st.wantHeaders()
  1620. // And now another stream should be able to start:
  1621. goodID := streamID()
  1622. sendReq(goodID, ":path", testPath)
  1623. select {
  1624. case got := <-inHandler:
  1625. if got != goodID {
  1626. t.Errorf("Got stream %d; want %d", got, goodID)
  1627. }
  1628. case <-time.After(3 * time.Second):
  1629. t.Error("timeout waiting for handler")
  1630. }
  1631. }
  1632. // So many response headers that the server needs to use CONTINUATION frames:
  1633. func TestServer_Response_ManyHeaders_With_Continuation(t *testing.T) {
  1634. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1635. h := w.Header()
  1636. for i := 0; i < 5000; i++ {
  1637. h.Set(fmt.Sprintf("x-header-%d", i), fmt.Sprintf("x-value-%d", i))
  1638. }
  1639. return nil
  1640. }, func(st *serverTester) {
  1641. getSlash(st)
  1642. hf := st.wantHeaders()
  1643. if hf.HeadersEnded() {
  1644. t.Fatal("got unwanted END_HEADERS flag")
  1645. }
  1646. n := 0
  1647. for {
  1648. n++
  1649. cf := st.wantContinuation()
  1650. if cf.HeadersEnded() {
  1651. break
  1652. }
  1653. }
  1654. if n < 5 {
  1655. t.Errorf("Only got %d CONTINUATION frames; expected 5+ (currently 6)")
  1656. }
  1657. })
  1658. }
  1659. // This previously crashed (reported by Mathieu Lonjaret as observed
  1660. // while using Camlistore) because we got a DATA frame from the client
  1661. // after the handler exited and our logic at the time was wrong,
  1662. // keeping a stream in the map in stateClosed, which tickled an
  1663. // invariant check later when we tried to remove that stream (via
  1664. // defer sc.closeAllStreamsOnConnClose) when the serverConn serve loop
  1665. // ended.
  1666. func TestServer_NoCrash_HandlerClose_Then_ClientClose(t *testing.T) {
  1667. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1668. // nothing
  1669. return nil
  1670. }, func(st *serverTester) {
  1671. st.writeHeaders(HeadersFrameParam{
  1672. StreamID: 1,
  1673. BlockFragment: encodeHeader(st.t),
  1674. EndStream: false, // DATA is coming
  1675. EndHeaders: true,
  1676. })
  1677. hf := st.wantHeaders()
  1678. if !hf.HeadersEnded() || !hf.StreamEnded() {
  1679. t.Fatalf("want END_HEADERS+END_STREAM, got %v", hf)
  1680. }
  1681. // Sent when the a Handler closes while a client has
  1682. // indicated it's still sending DATA:
  1683. st.wantRSTStream(1, ErrCodeCancel)
  1684. // Now the handler has ended, so it's ended its
  1685. // stream, but the client hasn't closed its side
  1686. // (stateClosedLocal). So send more data and verify
  1687. // it doesn't crash with an internal invariant panic, like
  1688. // it did before.
  1689. st.writeData(1, true, []byte("foo"))
  1690. // Sent after a peer sends data anyway (admittedly the
  1691. // previous RST_STREAM might've still been in-flight),
  1692. // but they'll get the more friendly 'cancel' code
  1693. // first.
  1694. st.wantRSTStream(1, ErrCodeStreamClosed)
  1695. // Set up a bunch of machinery to record the panic we saw
  1696. // previously.
  1697. var (
  1698. panMu sync.Mutex
  1699. panicVal interface{}
  1700. )
  1701. testHookOnPanicMu.Lock()
  1702. testHookOnPanic = func(sc *serverConn, pv interface{}) bool {
  1703. panMu.Lock()
  1704. panicVal = pv
  1705. panMu.Unlock()
  1706. return true
  1707. }
  1708. testHookOnPanicMu.Unlock()
  1709. // Now force the serve loop to end, via closing the connection.
  1710. st.cc.Close()
  1711. select {
  1712. case <-st.sc.doneServing:
  1713. // Loop has exited.
  1714. panMu.Lock()
  1715. got := panicVal
  1716. panMu.Unlock()
  1717. if got != nil {
  1718. t.Errorf("Got panic: %v", got)
  1719. }
  1720. case <-time.After(5 * time.Second):
  1721. t.Error("timeout")
  1722. }
  1723. })
  1724. }
  1725. func decodeHeader(t *testing.T, headerBlock []byte) (pairs [][2]string) {
  1726. d := hpack.NewDecoder(initialHeaderTableSize, func(f hpack.HeaderField) {
  1727. pairs = append(pairs, [2]string{f.Name, f.Value})
  1728. })
  1729. if _, err := d.Write(headerBlock); err != nil {
  1730. t.Fatalf("hpack decoding error: %v", err)
  1731. }
  1732. if err := d.Close(); err != nil {
  1733. t.Fatalf("hpack decoding error: %v", err)
  1734. }
  1735. return
  1736. }
  1737. // testServerResponse sets up an idle HTTP/2 connection and lets you
  1738. // write a single request with writeReq, and then reply to it in some way with the provided handler,
  1739. // and then verify the output with the serverTester again (assuming the handler returns nil)
  1740. func testServerResponse(t *testing.T,
  1741. handler func(http.ResponseWriter, *http.Request) error,
  1742. client func(*serverTester),
  1743. ) {
  1744. errc := make(chan error, 1)
  1745. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1746. if r.Body == nil {
  1747. t.Fatal("nil Body")
  1748. }
  1749. errc <- handler(w, r)
  1750. })
  1751. defer st.Close()
  1752. donec := make(chan bool)
  1753. go func() {
  1754. defer close(donec)
  1755. st.greet()
  1756. client(st)
  1757. }()
  1758. select {
  1759. case <-donec:
  1760. return
  1761. case <-time.After(5 * time.Second):
  1762. t.Fatal("timeout")
  1763. }
  1764. select {
  1765. case err := <-errc:
  1766. if err != nil {
  1767. t.Fatalf("Error in handler: %v", err)
  1768. }
  1769. case <-time.After(2 * time.Second):
  1770. t.Error("timeout waiting for handler to finish")
  1771. }
  1772. }
  1773. // readBodyHandler returns an http Handler func that reads len(want)
  1774. // bytes from r.Body and fails t if the contents read were not
  1775. // the value of want.
  1776. func readBodyHandler(t *testing.T, want string) func(w http.ResponseWriter, r *http.Request) {
  1777. return func(w http.ResponseWriter, r *http.Request) {
  1778. buf := make([]byte, len(want))
  1779. _, err := io.ReadFull(r.Body, buf)
  1780. if err != nil {
  1781. t.Error(err)
  1782. return
  1783. }
  1784. if string(buf) != want {
  1785. t.Errorf("read %q; want %q", buf, want)
  1786. }
  1787. }
  1788. }
  1789. func TestServerWithCurl(t *testing.T) {
  1790. if runtime.GOOS == "darwin" {
  1791. t.Skip("skipping Docker test on Darwin; requires --net which won't work with boot2docker anyway")
  1792. }
  1793. requireCurl(t)
  1794. const msg = "Hello from curl!\n"
  1795. ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  1796. w.Header().Set("Foo", "Bar")
  1797. io.WriteString(w, msg)
  1798. }))
  1799. ConfigureServer(ts.Config, &Server{})
  1800. ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config
  1801. ts.StartTLS()
  1802. defer ts.Close()
  1803. var gotConn int32
  1804. testHookOnConn = func() { atomic.StoreInt32(&gotConn, 1) }
  1805. t.Logf("Running test server for curl to hit at: %s", ts.URL)
  1806. container := curl(t, "--silent", "--http2", "--insecure", "-v", ts.URL)
  1807. defer kill(container)
  1808. resc := make(chan interface{}, 1)
  1809. go func() {
  1810. res, err := dockerLogs(container)
  1811. if err != nil {
  1812. resc <- err
  1813. } else {
  1814. resc <- res
  1815. }
  1816. }()
  1817. select {
  1818. case res := <-resc:
  1819. if err, ok := res.(error); ok {
  1820. t.Fatal(err)
  1821. }
  1822. if !strings.Contains(string(res.([]byte)), "< foo:Bar") {
  1823. t.Errorf("didn't see foo:Bar header")
  1824. t.Logf("Got: %s", res)
  1825. }
  1826. if !strings.Contains(string(res.([]byte)), msg) {
  1827. t.Errorf("didn't see %q content", msg)
  1828. t.Logf("Got: %s", res)
  1829. }
  1830. case <-time.After(3 * time.Second):
  1831. t.Errorf("timeout waiting for curl")
  1832. }
  1833. if atomic.LoadInt32(&gotConn) == 0 {
  1834. t.Error("never saw an http2 connection")
  1835. }
  1836. }