server_test.go 68 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524
  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. package http2
  5. import (
  6. "bytes"
  7. "crypto/tls"
  8. "errors"
  9. "flag"
  10. "fmt"
  11. "io"
  12. "io/ioutil"
  13. "log"
  14. "net"
  15. "net/http"
  16. "net/http/httptest"
  17. "os"
  18. "reflect"
  19. "runtime"
  20. "strconv"
  21. "strings"
  22. "sync"
  23. "sync/atomic"
  24. "testing"
  25. "time"
  26. "golang.org/x/net/http2/hpack"
  27. )
  28. var stderrVerbose = flag.Bool("stderr_verbose", false, "Mirror verbosity to stderr, unbuffered")
  29. func stderrv() io.Writer {
  30. if *stderrVerbose {
  31. return os.Stderr
  32. }
  33. return ioutil.Discard
  34. }
  35. type serverTester struct {
  36. cc net.Conn // client conn
  37. t testing.TB
  38. ts *httptest.Server
  39. fr *Framer
  40. logBuf *bytes.Buffer
  41. logFilter []string // substrings to filter out
  42. scMu sync.Mutex // guards sc
  43. sc *serverConn
  44. // writing headers:
  45. headerBuf bytes.Buffer
  46. hpackEnc *hpack.Encoder
  47. // reading frames:
  48. frc chan Frame
  49. frErrc chan error
  50. readTimer *time.Timer
  51. }
  52. func init() {
  53. testHookOnPanicMu = new(sync.Mutex)
  54. }
  55. func resetHooks() {
  56. testHookOnPanicMu.Lock()
  57. testHookOnPanic = nil
  58. testHookOnPanicMu.Unlock()
  59. }
  60. type serverTesterOpt string
  61. var optOnlyServer = serverTesterOpt("only_server")
  62. func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{}) *serverTester {
  63. resetHooks()
  64. logBuf := new(bytes.Buffer)
  65. ts := httptest.NewUnstartedServer(handler)
  66. tlsConfig := &tls.Config{
  67. InsecureSkipVerify: true,
  68. // The h2-14 is temporary, until curl is updated. (as used by unit tests
  69. // in Docker)
  70. NextProtos: []string{NextProtoTLS, "h2-14"},
  71. }
  72. onlyServer := false
  73. for _, opt := range opts {
  74. switch v := opt.(type) {
  75. case func(*tls.Config):
  76. v(tlsConfig)
  77. case func(*httptest.Server):
  78. v(ts)
  79. case serverTesterOpt:
  80. onlyServer = (v == optOnlyServer)
  81. default:
  82. t.Fatalf("unknown newServerTester option type %T", v)
  83. }
  84. }
  85. ConfigureServer(ts.Config, &Server{})
  86. st := &serverTester{
  87. t: t,
  88. ts: ts,
  89. logBuf: logBuf,
  90. frc: make(chan Frame, 1),
  91. frErrc: make(chan error, 1),
  92. }
  93. st.hpackEnc = hpack.NewEncoder(&st.headerBuf)
  94. ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config
  95. ts.Config.ErrorLog = log.New(io.MultiWriter(stderrv(), twriter{t: t, st: st}, logBuf), "", log.LstdFlags)
  96. ts.StartTLS()
  97. if VerboseLogs {
  98. t.Logf("Running test server at: %s", ts.URL)
  99. }
  100. testHookGetServerConn = func(v *serverConn) {
  101. st.scMu.Lock()
  102. defer st.scMu.Unlock()
  103. st.sc = v
  104. st.sc.testHookCh = make(chan func(int))
  105. }
  106. log.SetOutput(io.MultiWriter(stderrv(), twriter{t: t, st: st}))
  107. if !onlyServer {
  108. cc, err := tls.Dial("tcp", ts.Listener.Addr().String(), tlsConfig)
  109. if err != nil {
  110. t.Fatal(err)
  111. }
  112. st.cc = cc
  113. st.fr = NewFramer(cc, cc)
  114. }
  115. return st
  116. }
  117. func (st *serverTester) closeConn() {
  118. st.scMu.Lock()
  119. defer st.scMu.Unlock()
  120. st.sc.conn.Close()
  121. }
  122. func (st *serverTester) addLogFilter(phrase string) {
  123. st.logFilter = append(st.logFilter, phrase)
  124. }
  125. func (st *serverTester) stream(id uint32) *stream {
  126. ch := make(chan *stream, 1)
  127. st.sc.testHookCh <- func(int) {
  128. ch <- st.sc.streams[id]
  129. }
  130. return <-ch
  131. }
  132. func (st *serverTester) streamState(id uint32) streamState {
  133. ch := make(chan streamState, 1)
  134. st.sc.testHookCh <- func(int) {
  135. state, _ := st.sc.state(id)
  136. ch <- state
  137. }
  138. return <-ch
  139. }
  140. // loopNum reports how many times this conn's select loop has gone around.
  141. func (st *serverTester) loopNum() int {
  142. lastc := make(chan int, 1)
  143. st.sc.testHookCh <- func(loopNum int) {
  144. lastc <- loopNum
  145. }
  146. return <-lastc
  147. }
  148. // awaitIdle heuristically awaits for the server conn's select loop to be idle.
  149. // The heuristic is that the server connection's serve loop must schedule
  150. // 50 times in a row without any channel sends or receives occuring.
  151. func (st *serverTester) awaitIdle() {
  152. remain := 50
  153. last := st.loopNum()
  154. for remain > 0 {
  155. n := st.loopNum()
  156. if n == last+1 {
  157. remain--
  158. } else {
  159. remain = 50
  160. }
  161. last = n
  162. }
  163. }
  164. func (st *serverTester) Close() {
  165. st.ts.Close()
  166. if st.cc != nil {
  167. st.cc.Close()
  168. }
  169. log.SetOutput(os.Stderr)
  170. }
  171. // greet initiates the client's HTTP/2 connection into a state where
  172. // frames may be sent.
  173. func (st *serverTester) greet() {
  174. st.writePreface()
  175. st.writeInitialSettings()
  176. st.wantSettings()
  177. st.writeSettingsAck()
  178. st.wantSettingsAck()
  179. }
  180. func (st *serverTester) writePreface() {
  181. n, err := st.cc.Write(clientPreface)
  182. if err != nil {
  183. st.t.Fatalf("Error writing client preface: %v", err)
  184. }
  185. if n != len(clientPreface) {
  186. st.t.Fatalf("Writing client preface, wrote %d bytes; want %d", n, len(clientPreface))
  187. }
  188. }
  189. func (st *serverTester) writeInitialSettings() {
  190. if err := st.fr.WriteSettings(); err != nil {
  191. st.t.Fatalf("Error writing initial SETTINGS frame from client to server: %v", err)
  192. }
  193. }
  194. func (st *serverTester) writeSettingsAck() {
  195. if err := st.fr.WriteSettingsAck(); err != nil {
  196. st.t.Fatalf("Error writing ACK of server's SETTINGS: %v", err)
  197. }
  198. }
  199. func (st *serverTester) writeHeaders(p HeadersFrameParam) {
  200. if err := st.fr.WriteHeaders(p); err != nil {
  201. st.t.Fatalf("Error writing HEADERS: %v", err)
  202. }
  203. }
  204. func (st *serverTester) encodeHeaderField(k, v string) {
  205. err := st.hpackEnc.WriteField(hpack.HeaderField{Name: k, Value: v})
  206. if err != nil {
  207. st.t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err)
  208. }
  209. }
  210. // encodeHeader encodes headers and returns their HPACK bytes. headers
  211. // must contain an even number of key/value pairs. There may be
  212. // multiple pairs for keys (e.g. "cookie"). The :method, :path, and
  213. // :scheme headers default to GET, / and https.
  214. func (st *serverTester) encodeHeader(headers ...string) []byte {
  215. if len(headers)%2 == 1 {
  216. panic("odd number of kv args")
  217. }
  218. st.headerBuf.Reset()
  219. if len(headers) == 0 {
  220. // Fast path, mostly for benchmarks, so test code doesn't pollute
  221. // profiles when we're looking to improve server allocations.
  222. st.encodeHeaderField(":method", "GET")
  223. st.encodeHeaderField(":path", "/")
  224. st.encodeHeaderField(":scheme", "https")
  225. return st.headerBuf.Bytes()
  226. }
  227. if len(headers) == 2 && headers[0] == ":method" {
  228. // Another fast path for benchmarks.
  229. st.encodeHeaderField(":method", headers[1])
  230. st.encodeHeaderField(":path", "/")
  231. st.encodeHeaderField(":scheme", "https")
  232. return st.headerBuf.Bytes()
  233. }
  234. pseudoCount := map[string]int{}
  235. keys := []string{":method", ":path", ":scheme"}
  236. vals := map[string][]string{
  237. ":method": {"GET"},
  238. ":path": {"/"},
  239. ":scheme": {"https"},
  240. }
  241. for len(headers) > 0 {
  242. k, v := headers[0], headers[1]
  243. headers = headers[2:]
  244. if _, ok := vals[k]; !ok {
  245. keys = append(keys, k)
  246. }
  247. if strings.HasPrefix(k, ":") {
  248. pseudoCount[k]++
  249. if pseudoCount[k] == 1 {
  250. vals[k] = []string{v}
  251. } else {
  252. // Allows testing of invalid headers w/ dup pseudo fields.
  253. vals[k] = append(vals[k], v)
  254. }
  255. } else {
  256. vals[k] = append(vals[k], v)
  257. }
  258. }
  259. st.headerBuf.Reset()
  260. for _, k := range keys {
  261. for _, v := range vals[k] {
  262. st.encodeHeaderField(k, v)
  263. }
  264. }
  265. return st.headerBuf.Bytes()
  266. }
  267. // bodylessReq1 writes a HEADERS frames with StreamID 1 and EndStream and EndHeaders set.
  268. func (st *serverTester) bodylessReq1(headers ...string) {
  269. st.writeHeaders(HeadersFrameParam{
  270. StreamID: 1, // clients send odd numbers
  271. BlockFragment: st.encodeHeader(headers...),
  272. EndStream: true,
  273. EndHeaders: true,
  274. })
  275. }
  276. func (st *serverTester) writeData(streamID uint32, endStream bool, data []byte) {
  277. if err := st.fr.WriteData(streamID, endStream, data); err != nil {
  278. st.t.Fatalf("Error writing DATA: %v", err)
  279. }
  280. }
  281. func (st *serverTester) readFrame() (Frame, error) {
  282. go func() {
  283. fr, err := st.fr.ReadFrame()
  284. if err != nil {
  285. st.frErrc <- err
  286. } else {
  287. st.frc <- fr
  288. }
  289. }()
  290. t := st.readTimer
  291. if t == nil {
  292. t = time.NewTimer(2 * time.Second)
  293. st.readTimer = t
  294. }
  295. t.Reset(2 * time.Second)
  296. defer t.Stop()
  297. select {
  298. case f := <-st.frc:
  299. return f, nil
  300. case err := <-st.frErrc:
  301. return nil, err
  302. case <-t.C:
  303. return nil, errors.New("timeout waiting for frame")
  304. }
  305. }
  306. func (st *serverTester) wantHeaders() *HeadersFrame {
  307. f, err := st.readFrame()
  308. if err != nil {
  309. st.t.Fatalf("Error while expecting a HEADERS frame: %v", err)
  310. }
  311. hf, ok := f.(*HeadersFrame)
  312. if !ok {
  313. st.t.Fatalf("got a %T; want *HeadersFrame", f)
  314. }
  315. return hf
  316. }
  317. func (st *serverTester) wantContinuation() *ContinuationFrame {
  318. f, err := st.readFrame()
  319. if err != nil {
  320. st.t.Fatalf("Error while expecting a CONTINUATION frame: %v", err)
  321. }
  322. cf, ok := f.(*ContinuationFrame)
  323. if !ok {
  324. st.t.Fatalf("got a %T; want *ContinuationFrame", f)
  325. }
  326. return cf
  327. }
  328. func (st *serverTester) wantData() *DataFrame {
  329. f, err := st.readFrame()
  330. if err != nil {
  331. st.t.Fatalf("Error while expecting a DATA frame: %v", err)
  332. }
  333. df, ok := f.(*DataFrame)
  334. if !ok {
  335. st.t.Fatalf("got a %T; want *DataFrame", f)
  336. }
  337. return df
  338. }
  339. func (st *serverTester) wantSettings() *SettingsFrame {
  340. f, err := st.readFrame()
  341. if err != nil {
  342. st.t.Fatalf("Error while expecting a SETTINGS frame: %v", err)
  343. }
  344. sf, ok := f.(*SettingsFrame)
  345. if !ok {
  346. st.t.Fatalf("got a %T; want *SettingsFrame", f)
  347. }
  348. return sf
  349. }
  350. func (st *serverTester) wantPing() *PingFrame {
  351. f, err := st.readFrame()
  352. if err != nil {
  353. st.t.Fatalf("Error while expecting a PING frame: %v", err)
  354. }
  355. pf, ok := f.(*PingFrame)
  356. if !ok {
  357. st.t.Fatalf("got a %T; want *PingFrame", f)
  358. }
  359. return pf
  360. }
  361. func (st *serverTester) wantGoAway() *GoAwayFrame {
  362. f, err := st.readFrame()
  363. if err != nil {
  364. st.t.Fatalf("Error while expecting a GOAWAY frame: %v", err)
  365. }
  366. gf, ok := f.(*GoAwayFrame)
  367. if !ok {
  368. st.t.Fatalf("got a %T; want *GoAwayFrame", f)
  369. }
  370. return gf
  371. }
  372. func (st *serverTester) wantRSTStream(streamID uint32, errCode ErrCode) {
  373. f, err := st.readFrame()
  374. if err != nil {
  375. st.t.Fatalf("Error while expecting an RSTStream frame: %v", err)
  376. }
  377. rs, ok := f.(*RSTStreamFrame)
  378. if !ok {
  379. st.t.Fatalf("got a %T; want *RSTStreamFrame", f)
  380. }
  381. if rs.FrameHeader.StreamID != streamID {
  382. st.t.Fatalf("RSTStream StreamID = %d; want %d", rs.FrameHeader.StreamID, streamID)
  383. }
  384. if rs.ErrCode != errCode {
  385. st.t.Fatalf("RSTStream ErrCode = %d (%s); want %d (%s)", rs.ErrCode, rs.ErrCode, errCode, errCode)
  386. }
  387. }
  388. func (st *serverTester) wantWindowUpdate(streamID, incr uint32) {
  389. f, err := st.readFrame()
  390. if err != nil {
  391. st.t.Fatalf("Error while expecting a WINDOW_UPDATE frame: %v", err)
  392. }
  393. wu, ok := f.(*WindowUpdateFrame)
  394. if !ok {
  395. st.t.Fatalf("got a %T; want *WindowUpdateFrame", f)
  396. }
  397. if wu.FrameHeader.StreamID != streamID {
  398. st.t.Fatalf("WindowUpdate StreamID = %d; want %d", wu.FrameHeader.StreamID, streamID)
  399. }
  400. if wu.Increment != incr {
  401. st.t.Fatalf("WindowUpdate increment = %d; want %d", wu.Increment, incr)
  402. }
  403. }
  404. func (st *serverTester) wantSettingsAck() {
  405. f, err := st.readFrame()
  406. if err != nil {
  407. st.t.Fatal(err)
  408. }
  409. sf, ok := f.(*SettingsFrame)
  410. if !ok {
  411. st.t.Fatalf("Wanting a settings ACK, received a %T", f)
  412. }
  413. if !sf.Header().Flags.Has(FlagSettingsAck) {
  414. st.t.Fatal("Settings Frame didn't have ACK set")
  415. }
  416. }
  417. func TestServer(t *testing.T) {
  418. gotReq := make(chan bool, 1)
  419. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  420. w.Header().Set("Foo", "Bar")
  421. gotReq <- true
  422. })
  423. defer st.Close()
  424. covers("3.5", `
  425. The server connection preface consists of a potentially empty
  426. SETTINGS frame ([SETTINGS]) that MUST be the first frame the
  427. server sends in the HTTP/2 connection.
  428. `)
  429. st.writePreface()
  430. st.writeInitialSettings()
  431. st.wantSettings()
  432. st.writeSettingsAck()
  433. st.wantSettingsAck()
  434. st.writeHeaders(HeadersFrameParam{
  435. StreamID: 1, // clients send odd numbers
  436. BlockFragment: st.encodeHeader(),
  437. EndStream: true, // no DATA frames
  438. EndHeaders: true,
  439. })
  440. select {
  441. case <-gotReq:
  442. case <-time.After(2 * time.Second):
  443. t.Error("timeout waiting for request")
  444. }
  445. }
  446. func TestServer_Request_Get(t *testing.T) {
  447. testServerRequest(t, func(st *serverTester) {
  448. st.writeHeaders(HeadersFrameParam{
  449. StreamID: 1, // clients send odd numbers
  450. BlockFragment: st.encodeHeader("foo-bar", "some-value"),
  451. EndStream: true, // no DATA frames
  452. EndHeaders: true,
  453. })
  454. }, func(r *http.Request) {
  455. if r.Method != "GET" {
  456. t.Errorf("Method = %q; want GET", r.Method)
  457. }
  458. if r.URL.Path != "/" {
  459. t.Errorf("URL.Path = %q; want /", r.URL.Path)
  460. }
  461. if r.ContentLength != 0 {
  462. t.Errorf("ContentLength = %v; want 0", r.ContentLength)
  463. }
  464. if r.Close {
  465. t.Error("Close = true; want false")
  466. }
  467. if !strings.Contains(r.RemoteAddr, ":") {
  468. t.Errorf("RemoteAddr = %q; want something with a colon", r.RemoteAddr)
  469. }
  470. if r.Proto != "HTTP/2.0" || r.ProtoMajor != 2 || r.ProtoMinor != 0 {
  471. t.Errorf("Proto = %q Major=%v,Minor=%v; want HTTP/2.0", r.Proto, r.ProtoMajor, r.ProtoMinor)
  472. }
  473. wantHeader := http.Header{
  474. "Foo-Bar": []string{"some-value"},
  475. }
  476. if !reflect.DeepEqual(r.Header, wantHeader) {
  477. t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
  478. }
  479. if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 {
  480. t.Errorf("Read = %d, %v; want 0, EOF", n, err)
  481. }
  482. })
  483. }
  484. func TestServer_Request_Get_PathSlashes(t *testing.T) {
  485. testServerRequest(t, func(st *serverTester) {
  486. st.writeHeaders(HeadersFrameParam{
  487. StreamID: 1, // clients send odd numbers
  488. BlockFragment: st.encodeHeader(":path", "/%2f/"),
  489. EndStream: true, // no DATA frames
  490. EndHeaders: true,
  491. })
  492. }, func(r *http.Request) {
  493. if r.RequestURI != "/%2f/" {
  494. t.Errorf("RequestURI = %q; want /%%2f/", r.RequestURI)
  495. }
  496. if r.URL.Path != "///" {
  497. t.Errorf("URL.Path = %q; want ///", r.URL.Path)
  498. }
  499. })
  500. }
  501. // TODO: add a test with EndStream=true on the HEADERS but setting a
  502. // Content-Length anyway. Should we just omit it and force it to
  503. // zero?
  504. func TestServer_Request_Post_NoContentLength_EndStream(t *testing.T) {
  505. testServerRequest(t, func(st *serverTester) {
  506. st.writeHeaders(HeadersFrameParam{
  507. StreamID: 1, // clients send odd numbers
  508. BlockFragment: st.encodeHeader(":method", "POST"),
  509. EndStream: true,
  510. EndHeaders: true,
  511. })
  512. }, func(r *http.Request) {
  513. if r.Method != "POST" {
  514. t.Errorf("Method = %q; want POST", r.Method)
  515. }
  516. if r.ContentLength != 0 {
  517. t.Errorf("ContentLength = %v; want 0", r.ContentLength)
  518. }
  519. if n, err := r.Body.Read([]byte(" ")); err != io.EOF || n != 0 {
  520. t.Errorf("Read = %d, %v; want 0, EOF", n, err)
  521. }
  522. })
  523. }
  524. func TestServer_Request_Post_Body_ImmediateEOF(t *testing.T) {
  525. testBodyContents(t, -1, "", func(st *serverTester) {
  526. st.writeHeaders(HeadersFrameParam{
  527. StreamID: 1, // clients send odd numbers
  528. BlockFragment: st.encodeHeader(":method", "POST"),
  529. EndStream: false, // to say DATA frames are coming
  530. EndHeaders: true,
  531. })
  532. st.writeData(1, true, nil) // just kidding. empty body.
  533. })
  534. }
  535. func TestServer_Request_Post_Body_OneData(t *testing.T) {
  536. const content = "Some content"
  537. testBodyContents(t, -1, content, func(st *serverTester) {
  538. st.writeHeaders(HeadersFrameParam{
  539. StreamID: 1, // clients send odd numbers
  540. BlockFragment: st.encodeHeader(":method", "POST"),
  541. EndStream: false, // to say DATA frames are coming
  542. EndHeaders: true,
  543. })
  544. st.writeData(1, true, []byte(content))
  545. })
  546. }
  547. func TestServer_Request_Post_Body_TwoData(t *testing.T) {
  548. const content = "Some content"
  549. testBodyContents(t, -1, content, func(st *serverTester) {
  550. st.writeHeaders(HeadersFrameParam{
  551. StreamID: 1, // clients send odd numbers
  552. BlockFragment: st.encodeHeader(":method", "POST"),
  553. EndStream: false, // to say DATA frames are coming
  554. EndHeaders: true,
  555. })
  556. st.writeData(1, false, []byte(content[:5]))
  557. st.writeData(1, true, []byte(content[5:]))
  558. })
  559. }
  560. func TestServer_Request_Post_Body_ContentLength_Correct(t *testing.T) {
  561. const content = "Some content"
  562. testBodyContents(t, int64(len(content)), content, func(st *serverTester) {
  563. st.writeHeaders(HeadersFrameParam{
  564. StreamID: 1, // clients send odd numbers
  565. BlockFragment: st.encodeHeader(
  566. ":method", "POST",
  567. "content-length", strconv.Itoa(len(content)),
  568. ),
  569. EndStream: false, // to say DATA frames are coming
  570. EndHeaders: true,
  571. })
  572. st.writeData(1, true, []byte(content))
  573. })
  574. }
  575. func TestServer_Request_Post_Body_ContentLength_TooLarge(t *testing.T) {
  576. testBodyContentsFail(t, 3, "request declared a Content-Length of 3 but only wrote 2 bytes",
  577. func(st *serverTester) {
  578. st.writeHeaders(HeadersFrameParam{
  579. StreamID: 1, // clients send odd numbers
  580. BlockFragment: st.encodeHeader(
  581. ":method", "POST",
  582. "content-length", "3",
  583. ),
  584. EndStream: false, // to say DATA frames are coming
  585. EndHeaders: true,
  586. })
  587. st.writeData(1, true, []byte("12"))
  588. })
  589. }
  590. func TestServer_Request_Post_Body_ContentLength_TooSmall(t *testing.T) {
  591. testBodyContentsFail(t, 4, "sender tried to send more than declared Content-Length of 4 bytes",
  592. func(st *serverTester) {
  593. st.writeHeaders(HeadersFrameParam{
  594. StreamID: 1, // clients send odd numbers
  595. BlockFragment: st.encodeHeader(
  596. ":method", "POST",
  597. "content-length", "4",
  598. ),
  599. EndStream: false, // to say DATA frames are coming
  600. EndHeaders: true,
  601. })
  602. st.writeData(1, true, []byte("12345"))
  603. })
  604. }
  605. func testBodyContents(t *testing.T, wantContentLength int64, wantBody string, write func(st *serverTester)) {
  606. testServerRequest(t, write, func(r *http.Request) {
  607. if r.Method != "POST" {
  608. t.Errorf("Method = %q; want POST", r.Method)
  609. }
  610. if r.ContentLength != wantContentLength {
  611. t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength)
  612. }
  613. all, err := ioutil.ReadAll(r.Body)
  614. if err != nil {
  615. t.Fatal(err)
  616. }
  617. if string(all) != wantBody {
  618. t.Errorf("Read = %q; want %q", all, wantBody)
  619. }
  620. if err := r.Body.Close(); err != nil {
  621. t.Fatalf("Close: %v", err)
  622. }
  623. })
  624. }
  625. func testBodyContentsFail(t *testing.T, wantContentLength int64, wantReadError string, write func(st *serverTester)) {
  626. testServerRequest(t, write, func(r *http.Request) {
  627. if r.Method != "POST" {
  628. t.Errorf("Method = %q; want POST", r.Method)
  629. }
  630. if r.ContentLength != wantContentLength {
  631. t.Errorf("ContentLength = %v; want %d", r.ContentLength, wantContentLength)
  632. }
  633. all, err := ioutil.ReadAll(r.Body)
  634. if err == nil {
  635. t.Fatalf("expected an error (%q) reading from the body. Successfully read %q instead.",
  636. wantReadError, all)
  637. }
  638. if !strings.Contains(err.Error(), wantReadError) {
  639. t.Fatalf("Body.Read = %v; want substring %q", err, wantReadError)
  640. }
  641. if err := r.Body.Close(); err != nil {
  642. t.Fatalf("Close: %v", err)
  643. }
  644. })
  645. }
  646. // Using a Host header, instead of :authority
  647. func TestServer_Request_Get_Host(t *testing.T) {
  648. const host = "example.com"
  649. testServerRequest(t, func(st *serverTester) {
  650. st.writeHeaders(HeadersFrameParam{
  651. StreamID: 1, // clients send odd numbers
  652. BlockFragment: st.encodeHeader("host", host),
  653. EndStream: true,
  654. EndHeaders: true,
  655. })
  656. }, func(r *http.Request) {
  657. if r.Host != host {
  658. t.Errorf("Host = %q; want %q", r.Host, host)
  659. }
  660. })
  661. }
  662. // Using an :authority pseudo-header, instead of Host
  663. func TestServer_Request_Get_Authority(t *testing.T) {
  664. const host = "example.com"
  665. testServerRequest(t, func(st *serverTester) {
  666. st.writeHeaders(HeadersFrameParam{
  667. StreamID: 1, // clients send odd numbers
  668. BlockFragment: st.encodeHeader(":authority", host),
  669. EndStream: true,
  670. EndHeaders: true,
  671. })
  672. }, func(r *http.Request) {
  673. if r.Host != host {
  674. t.Errorf("Host = %q; want %q", r.Host, host)
  675. }
  676. })
  677. }
  678. func TestServer_Request_WithContinuation(t *testing.T) {
  679. wantHeader := http.Header{
  680. "Foo-One": []string{"value-one"},
  681. "Foo-Two": []string{"value-two"},
  682. "Foo-Three": []string{"value-three"},
  683. }
  684. testServerRequest(t, func(st *serverTester) {
  685. fullHeaders := st.encodeHeader(
  686. "foo-one", "value-one",
  687. "foo-two", "value-two",
  688. "foo-three", "value-three",
  689. )
  690. remain := fullHeaders
  691. chunks := 0
  692. for len(remain) > 0 {
  693. const maxChunkSize = 5
  694. chunk := remain
  695. if len(chunk) > maxChunkSize {
  696. chunk = chunk[:maxChunkSize]
  697. }
  698. remain = remain[len(chunk):]
  699. if chunks == 0 {
  700. st.writeHeaders(HeadersFrameParam{
  701. StreamID: 1, // clients send odd numbers
  702. BlockFragment: chunk,
  703. EndStream: true, // no DATA frames
  704. EndHeaders: false, // we'll have continuation frames
  705. })
  706. } else {
  707. err := st.fr.WriteContinuation(1, len(remain) == 0, chunk)
  708. if err != nil {
  709. t.Fatal(err)
  710. }
  711. }
  712. chunks++
  713. }
  714. if chunks < 2 {
  715. t.Fatal("too few chunks")
  716. }
  717. }, func(r *http.Request) {
  718. if !reflect.DeepEqual(r.Header, wantHeader) {
  719. t.Errorf("Header = %#v; want %#v", r.Header, wantHeader)
  720. }
  721. })
  722. }
  723. // Concatenated cookie headers. ("8.1.2.5 Compressing the Cookie Header Field")
  724. func TestServer_Request_CookieConcat(t *testing.T) {
  725. const host = "example.com"
  726. testServerRequest(t, func(st *serverTester) {
  727. st.bodylessReq1(
  728. ":authority", host,
  729. "cookie", "a=b",
  730. "cookie", "c=d",
  731. "cookie", "e=f",
  732. )
  733. }, func(r *http.Request) {
  734. const want = "a=b; c=d; e=f"
  735. if got := r.Header.Get("Cookie"); got != want {
  736. t.Errorf("Cookie = %q; want %q", got, want)
  737. }
  738. })
  739. }
  740. func TestServer_Request_Reject_CapitalHeader(t *testing.T) {
  741. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("UPPER", "v") })
  742. }
  743. func TestServer_Request_Reject_Pseudo_Missing_method(t *testing.T) {
  744. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":method", "") })
  745. }
  746. func TestServer_Request_Reject_Pseudo_ExactlyOne(t *testing.T) {
  747. // 8.1.2.3 Request Pseudo-Header Fields
  748. // "All HTTP/2 requests MUST include exactly one valid value" ...
  749. testRejectRequest(t, func(st *serverTester) {
  750. st.addLogFilter("duplicate pseudo-header")
  751. st.bodylessReq1(":method", "GET", ":method", "POST")
  752. })
  753. }
  754. func TestServer_Request_Reject_Pseudo_AfterRegular(t *testing.T) {
  755. // 8.1.2.3 Request Pseudo-Header Fields
  756. // "All pseudo-header fields MUST appear in the header block
  757. // before regular header fields. Any request or response that
  758. // contains a pseudo-header field that appears in a header
  759. // block after a regular header field MUST be treated as
  760. // malformed (Section 8.1.2.6)."
  761. testRejectRequest(t, func(st *serverTester) {
  762. st.addLogFilter("pseudo-header after regular header")
  763. var buf bytes.Buffer
  764. enc := hpack.NewEncoder(&buf)
  765. enc.WriteField(hpack.HeaderField{Name: ":method", Value: "GET"})
  766. enc.WriteField(hpack.HeaderField{Name: "regular", Value: "foobar"})
  767. enc.WriteField(hpack.HeaderField{Name: ":path", Value: "/"})
  768. enc.WriteField(hpack.HeaderField{Name: ":scheme", Value: "https"})
  769. st.writeHeaders(HeadersFrameParam{
  770. StreamID: 1, // clients send odd numbers
  771. BlockFragment: buf.Bytes(),
  772. EndStream: true,
  773. EndHeaders: true,
  774. })
  775. })
  776. }
  777. func TestServer_Request_Reject_Pseudo_Missing_path(t *testing.T) {
  778. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":path", "") })
  779. }
  780. func TestServer_Request_Reject_Pseudo_Missing_scheme(t *testing.T) {
  781. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "") })
  782. }
  783. func TestServer_Request_Reject_Pseudo_scheme_invalid(t *testing.T) {
  784. testRejectRequest(t, func(st *serverTester) { st.bodylessReq1(":scheme", "bogus") })
  785. }
  786. func TestServer_Request_Reject_Pseudo_Unknown(t *testing.T) {
  787. testRejectRequest(t, func(st *serverTester) {
  788. st.addLogFilter(`invalid pseudo-header ":unknown_thing"`)
  789. st.bodylessReq1(":unknown_thing", "")
  790. })
  791. }
  792. func testRejectRequest(t *testing.T, send func(*serverTester)) {
  793. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  794. t.Fatal("server request made it to handler; should've been rejected")
  795. })
  796. defer st.Close()
  797. st.greet()
  798. send(st)
  799. st.wantRSTStream(1, ErrCodeProtocol)
  800. }
  801. func TestServer_Ping(t *testing.T) {
  802. st := newServerTester(t, nil)
  803. defer st.Close()
  804. st.greet()
  805. // Server should ignore this one, since it has ACK set.
  806. ackPingData := [8]byte{1, 2, 4, 8, 16, 32, 64, 128}
  807. if err := st.fr.WritePing(true, ackPingData); err != nil {
  808. t.Fatal(err)
  809. }
  810. // But the server should reply to this one, since ACK is false.
  811. pingData := [8]byte{1, 2, 3, 4, 5, 6, 7, 8}
  812. if err := st.fr.WritePing(false, pingData); err != nil {
  813. t.Fatal(err)
  814. }
  815. pf := st.wantPing()
  816. if !pf.Flags.Has(FlagPingAck) {
  817. t.Error("response ping doesn't have ACK set")
  818. }
  819. if pf.Data != pingData {
  820. t.Errorf("response ping has data %q; want %q", pf.Data, pingData)
  821. }
  822. }
  823. func TestServer_RejectsLargeFrames(t *testing.T) {
  824. st := newServerTester(t, nil)
  825. defer st.Close()
  826. st.greet()
  827. // Write too large of a frame (too large by one byte)
  828. // We ignore the return value because it's expected that the server
  829. // will only read the first 9 bytes (the headre) and then disconnect.
  830. st.fr.WriteRawFrame(0xff, 0, 0, make([]byte, defaultMaxReadFrameSize+1))
  831. gf := st.wantGoAway()
  832. if gf.ErrCode != ErrCodeFrameSize {
  833. t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFrameSize)
  834. }
  835. }
  836. func TestServer_Handler_Sends_WindowUpdate(t *testing.T) {
  837. puppet := newHandlerPuppet()
  838. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  839. puppet.act(w, r)
  840. })
  841. defer st.Close()
  842. defer puppet.done()
  843. st.greet()
  844. st.writeHeaders(HeadersFrameParam{
  845. StreamID: 1, // clients send odd numbers
  846. BlockFragment: st.encodeHeader(":method", "POST"),
  847. EndStream: false, // data coming
  848. EndHeaders: true,
  849. })
  850. st.writeData(1, false, []byte("abcdef"))
  851. puppet.do(readBodyHandler(t, "abc"))
  852. st.wantWindowUpdate(0, 3)
  853. st.wantWindowUpdate(1, 3)
  854. puppet.do(readBodyHandler(t, "def"))
  855. st.wantWindowUpdate(0, 3)
  856. st.wantWindowUpdate(1, 3)
  857. st.writeData(1, true, []byte("ghijkl")) // END_STREAM here
  858. puppet.do(readBodyHandler(t, "ghi"))
  859. puppet.do(readBodyHandler(t, "jkl"))
  860. st.wantWindowUpdate(0, 3)
  861. st.wantWindowUpdate(0, 3) // no more stream-level, since END_STREAM
  862. }
  863. func TestServer_Send_GoAway_After_Bogus_WindowUpdate(t *testing.T) {
  864. st := newServerTester(t, nil)
  865. defer st.Close()
  866. st.greet()
  867. if err := st.fr.WriteWindowUpdate(0, 1<<31-1); err != nil {
  868. t.Fatal(err)
  869. }
  870. gf := st.wantGoAway()
  871. if gf.ErrCode != ErrCodeFlowControl {
  872. t.Errorf("GOAWAY err = %v; want %v", gf.ErrCode, ErrCodeFlowControl)
  873. }
  874. if gf.LastStreamID != 0 {
  875. t.Errorf("GOAWAY last stream ID = %v; want %v", gf.LastStreamID, 0)
  876. }
  877. }
  878. func TestServer_Send_RstStream_After_Bogus_WindowUpdate(t *testing.T) {
  879. inHandler := make(chan bool)
  880. blockHandler := make(chan bool)
  881. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  882. inHandler <- true
  883. <-blockHandler
  884. })
  885. defer st.Close()
  886. defer close(blockHandler)
  887. st.greet()
  888. st.writeHeaders(HeadersFrameParam{
  889. StreamID: 1,
  890. BlockFragment: st.encodeHeader(":method", "POST"),
  891. EndStream: false, // keep it open
  892. EndHeaders: true,
  893. })
  894. <-inHandler
  895. // Send a bogus window update:
  896. if err := st.fr.WriteWindowUpdate(1, 1<<31-1); err != nil {
  897. t.Fatal(err)
  898. }
  899. st.wantRSTStream(1, ErrCodeFlowControl)
  900. }
  901. // testServerPostUnblock sends a hanging POST with unsent data to handler,
  902. // then runs fn once in the handler, and verifies that the error returned from
  903. // handler is acceptable. It fails if takes over 5 seconds for handler to exit.
  904. func testServerPostUnblock(t *testing.T,
  905. handler func(http.ResponseWriter, *http.Request) error,
  906. fn func(*serverTester),
  907. checkErr func(error),
  908. otherHeaders ...string) {
  909. inHandler := make(chan bool)
  910. errc := make(chan error, 1)
  911. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  912. inHandler <- true
  913. errc <- handler(w, r)
  914. })
  915. st.greet()
  916. st.writeHeaders(HeadersFrameParam{
  917. StreamID: 1,
  918. BlockFragment: st.encodeHeader(append([]string{":method", "POST"}, otherHeaders...)...),
  919. EndStream: false, // keep it open
  920. EndHeaders: true,
  921. })
  922. <-inHandler
  923. fn(st)
  924. select {
  925. case err := <-errc:
  926. if checkErr != nil {
  927. checkErr(err)
  928. }
  929. case <-time.After(5 * time.Second):
  930. t.Fatal("timeout waiting for Handler to return")
  931. }
  932. st.Close()
  933. }
  934. func TestServer_RSTStream_Unblocks_Read(t *testing.T) {
  935. testServerPostUnblock(t,
  936. func(w http.ResponseWriter, r *http.Request) (err error) {
  937. _, err = r.Body.Read(make([]byte, 1))
  938. return
  939. },
  940. func(st *serverTester) {
  941. if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  942. t.Fatal(err)
  943. }
  944. },
  945. func(err error) {
  946. if err == nil {
  947. t.Error("unexpected nil error from Request.Body.Read")
  948. }
  949. },
  950. )
  951. }
  952. func TestServer_RSTStream_Unblocks_Header_Write(t *testing.T) {
  953. // Run this test a bunch, because it doesn't always
  954. // deadlock. But with a bunch, it did.
  955. n := 50
  956. if testing.Short() {
  957. n = 5
  958. }
  959. for i := 0; i < n; i++ {
  960. testServer_RSTStream_Unblocks_Header_Write(t)
  961. }
  962. }
  963. func testServer_RSTStream_Unblocks_Header_Write(t *testing.T) {
  964. inHandler := make(chan bool, 1)
  965. unblockHandler := make(chan bool, 1)
  966. headerWritten := make(chan bool, 1)
  967. wroteRST := make(chan bool, 1)
  968. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  969. inHandler <- true
  970. <-wroteRST
  971. w.Header().Set("foo", "bar")
  972. w.WriteHeader(200)
  973. w.(http.Flusher).Flush()
  974. headerWritten <- true
  975. <-unblockHandler
  976. })
  977. defer st.Close()
  978. st.greet()
  979. st.writeHeaders(HeadersFrameParam{
  980. StreamID: 1,
  981. BlockFragment: st.encodeHeader(":method", "POST"),
  982. EndStream: false, // keep it open
  983. EndHeaders: true,
  984. })
  985. <-inHandler
  986. if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  987. t.Fatal(err)
  988. }
  989. wroteRST <- true
  990. st.awaitIdle()
  991. select {
  992. case <-headerWritten:
  993. case <-time.After(2 * time.Second):
  994. t.Error("timeout waiting for header write")
  995. }
  996. unblockHandler <- true
  997. }
  998. func TestServer_DeadConn_Unblocks_Read(t *testing.T) {
  999. testServerPostUnblock(t,
  1000. func(w http.ResponseWriter, r *http.Request) (err error) {
  1001. _, err = r.Body.Read(make([]byte, 1))
  1002. return
  1003. },
  1004. func(st *serverTester) { st.cc.Close() },
  1005. func(err error) {
  1006. if err == nil {
  1007. t.Error("unexpected nil error from Request.Body.Read")
  1008. }
  1009. },
  1010. )
  1011. }
  1012. var blockUntilClosed = func(w http.ResponseWriter, r *http.Request) error {
  1013. <-w.(http.CloseNotifier).CloseNotify()
  1014. return nil
  1015. }
  1016. func TestServer_CloseNotify_After_RSTStream(t *testing.T) {
  1017. testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) {
  1018. if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  1019. t.Fatal(err)
  1020. }
  1021. }, nil)
  1022. }
  1023. func TestServer_CloseNotify_After_ConnClose(t *testing.T) {
  1024. testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) { st.cc.Close() }, nil)
  1025. }
  1026. // that CloseNotify unblocks after a stream error due to the client's
  1027. // problem that's unrelated to them explicitly canceling it (which is
  1028. // TestServer_CloseNotify_After_RSTStream above)
  1029. func TestServer_CloseNotify_After_StreamError(t *testing.T) {
  1030. testServerPostUnblock(t, blockUntilClosed, func(st *serverTester) {
  1031. // data longer than declared Content-Length => stream error
  1032. st.writeData(1, true, []byte("1234"))
  1033. }, nil, "content-length", "3")
  1034. }
  1035. func TestServer_StateTransitions(t *testing.T) {
  1036. var st *serverTester
  1037. inHandler := make(chan bool)
  1038. writeData := make(chan bool)
  1039. leaveHandler := make(chan bool)
  1040. st = newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1041. inHandler <- true
  1042. if st.stream(1) == nil {
  1043. t.Errorf("nil stream 1 in handler")
  1044. }
  1045. if got, want := st.streamState(1), stateOpen; got != want {
  1046. t.Errorf("in handler, state is %v; want %v", got, want)
  1047. }
  1048. writeData <- true
  1049. if n, err := r.Body.Read(make([]byte, 1)); n != 0 || err != io.EOF {
  1050. t.Errorf("body read = %d, %v; want 0, EOF", n, err)
  1051. }
  1052. if got, want := st.streamState(1), stateHalfClosedRemote; got != want {
  1053. t.Errorf("in handler, state is %v; want %v", got, want)
  1054. }
  1055. <-leaveHandler
  1056. })
  1057. st.greet()
  1058. if st.stream(1) != nil {
  1059. t.Fatal("stream 1 should be empty")
  1060. }
  1061. if got := st.streamState(1); got != stateIdle {
  1062. t.Fatalf("stream 1 should be idle; got %v", got)
  1063. }
  1064. st.writeHeaders(HeadersFrameParam{
  1065. StreamID: 1,
  1066. BlockFragment: st.encodeHeader(":method", "POST"),
  1067. EndStream: false, // keep it open
  1068. EndHeaders: true,
  1069. })
  1070. <-inHandler
  1071. <-writeData
  1072. st.writeData(1, true, nil)
  1073. leaveHandler <- true
  1074. hf := st.wantHeaders()
  1075. if !hf.StreamEnded() {
  1076. t.Fatal("expected END_STREAM flag")
  1077. }
  1078. if got, want := st.streamState(1), stateClosed; got != want {
  1079. t.Errorf("at end, state is %v; want %v", got, want)
  1080. }
  1081. if st.stream(1) != nil {
  1082. t.Fatal("at end, stream 1 should be gone")
  1083. }
  1084. }
  1085. // test HEADERS w/o EndHeaders + another HEADERS (should get rejected)
  1086. func TestServer_Rejects_HeadersNoEnd_Then_Headers(t *testing.T) {
  1087. testServerRejects(t, func(st *serverTester) {
  1088. st.writeHeaders(HeadersFrameParam{
  1089. StreamID: 1,
  1090. BlockFragment: st.encodeHeader(),
  1091. EndStream: true,
  1092. EndHeaders: false,
  1093. })
  1094. st.writeHeaders(HeadersFrameParam{ // Not a continuation.
  1095. StreamID: 3, // different stream.
  1096. BlockFragment: st.encodeHeader(),
  1097. EndStream: true,
  1098. EndHeaders: true,
  1099. })
  1100. })
  1101. }
  1102. // test HEADERS w/o EndHeaders + PING (should get rejected)
  1103. func TestServer_Rejects_HeadersNoEnd_Then_Ping(t *testing.T) {
  1104. testServerRejects(t, func(st *serverTester) {
  1105. st.writeHeaders(HeadersFrameParam{
  1106. StreamID: 1,
  1107. BlockFragment: st.encodeHeader(),
  1108. EndStream: true,
  1109. EndHeaders: false,
  1110. })
  1111. if err := st.fr.WritePing(false, [8]byte{}); err != nil {
  1112. t.Fatal(err)
  1113. }
  1114. })
  1115. }
  1116. // test HEADERS w/ EndHeaders + a continuation HEADERS (should get rejected)
  1117. func TestServer_Rejects_HeadersEnd_Then_Continuation(t *testing.T) {
  1118. testServerRejects(t, func(st *serverTester) {
  1119. st.writeHeaders(HeadersFrameParam{
  1120. StreamID: 1,
  1121. BlockFragment: st.encodeHeader(),
  1122. EndStream: true,
  1123. EndHeaders: true,
  1124. })
  1125. st.wantHeaders()
  1126. if err := st.fr.WriteContinuation(1, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil {
  1127. t.Fatal(err)
  1128. }
  1129. })
  1130. }
  1131. // test HEADERS w/o EndHeaders + a continuation HEADERS on wrong stream ID
  1132. func TestServer_Rejects_HeadersNoEnd_Then_ContinuationWrongStream(t *testing.T) {
  1133. testServerRejects(t, func(st *serverTester) {
  1134. st.writeHeaders(HeadersFrameParam{
  1135. StreamID: 1,
  1136. BlockFragment: st.encodeHeader(),
  1137. EndStream: true,
  1138. EndHeaders: false,
  1139. })
  1140. if err := st.fr.WriteContinuation(3, true, encodeHeaderNoImplicit(t, "foo", "bar")); err != nil {
  1141. t.Fatal(err)
  1142. }
  1143. })
  1144. }
  1145. // No HEADERS on stream 0.
  1146. func TestServer_Rejects_Headers0(t *testing.T) {
  1147. testServerRejects(t, func(st *serverTester) {
  1148. st.fr.AllowIllegalWrites = true
  1149. st.writeHeaders(HeadersFrameParam{
  1150. StreamID: 0,
  1151. BlockFragment: st.encodeHeader(),
  1152. EndStream: true,
  1153. EndHeaders: true,
  1154. })
  1155. })
  1156. }
  1157. // No CONTINUATION on stream 0.
  1158. func TestServer_Rejects_Continuation0(t *testing.T) {
  1159. testServerRejects(t, func(st *serverTester) {
  1160. st.fr.AllowIllegalWrites = true
  1161. if err := st.fr.WriteContinuation(0, true, st.encodeHeader()); err != nil {
  1162. t.Fatal(err)
  1163. }
  1164. })
  1165. }
  1166. func TestServer_Rejects_PushPromise(t *testing.T) {
  1167. testServerRejects(t, func(st *serverTester) {
  1168. pp := PushPromiseParam{
  1169. StreamID: 1,
  1170. PromiseID: 3,
  1171. }
  1172. if err := st.fr.WritePushPromise(pp); err != nil {
  1173. t.Fatal(err)
  1174. }
  1175. })
  1176. }
  1177. // testServerRejects tests that the server hangs up with a GOAWAY
  1178. // frame and a server close after the client does something
  1179. // deserving a CONNECTION_ERROR.
  1180. func testServerRejects(t *testing.T, writeReq func(*serverTester)) {
  1181. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {})
  1182. st.addLogFilter("connection error: PROTOCOL_ERROR")
  1183. defer st.Close()
  1184. st.greet()
  1185. writeReq(st)
  1186. st.wantGoAway()
  1187. errc := make(chan error, 1)
  1188. go func() {
  1189. fr, err := st.fr.ReadFrame()
  1190. if err == nil {
  1191. err = fmt.Errorf("got frame of type %T", fr)
  1192. }
  1193. errc <- err
  1194. }()
  1195. select {
  1196. case err := <-errc:
  1197. if err != io.EOF {
  1198. t.Errorf("ReadFrame = %v; want io.EOF", err)
  1199. }
  1200. case <-time.After(2 * time.Second):
  1201. t.Error("timeout waiting for disconnect")
  1202. }
  1203. }
  1204. // testServerRequest sets up an idle HTTP/2 connection and lets you
  1205. // write a single request with writeReq, and then verify that the
  1206. // *http.Request is built correctly in checkReq.
  1207. func testServerRequest(t *testing.T, writeReq func(*serverTester), checkReq func(*http.Request)) {
  1208. gotReq := make(chan bool, 1)
  1209. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1210. if r.Body == nil {
  1211. t.Fatal("nil Body")
  1212. }
  1213. checkReq(r)
  1214. gotReq <- true
  1215. })
  1216. defer st.Close()
  1217. st.greet()
  1218. writeReq(st)
  1219. select {
  1220. case <-gotReq:
  1221. case <-time.After(2 * time.Second):
  1222. t.Error("timeout waiting for request")
  1223. }
  1224. }
  1225. func getSlash(st *serverTester) { st.bodylessReq1() }
  1226. func TestServer_Response_NoData(t *testing.T) {
  1227. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1228. // Nothing.
  1229. return nil
  1230. }, func(st *serverTester) {
  1231. getSlash(st)
  1232. hf := st.wantHeaders()
  1233. if !hf.StreamEnded() {
  1234. t.Fatal("want END_STREAM flag")
  1235. }
  1236. if !hf.HeadersEnded() {
  1237. t.Fatal("want END_HEADERS flag")
  1238. }
  1239. })
  1240. }
  1241. func TestServer_Response_NoData_Header_FooBar(t *testing.T) {
  1242. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1243. w.Header().Set("Foo-Bar", "some-value")
  1244. return nil
  1245. }, func(st *serverTester) {
  1246. getSlash(st)
  1247. hf := st.wantHeaders()
  1248. if !hf.StreamEnded() {
  1249. t.Fatal("want END_STREAM flag")
  1250. }
  1251. if !hf.HeadersEnded() {
  1252. t.Fatal("want END_HEADERS flag")
  1253. }
  1254. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1255. wanth := [][2]string{
  1256. {":status", "200"},
  1257. {"foo-bar", "some-value"},
  1258. {"content-type", "text/plain; charset=utf-8"},
  1259. {"content-length", "0"},
  1260. }
  1261. if !reflect.DeepEqual(goth, wanth) {
  1262. t.Errorf("Got headers %v; want %v", goth, wanth)
  1263. }
  1264. })
  1265. }
  1266. func TestServer_Response_Data_Sniff_DoesntOverride(t *testing.T) {
  1267. const msg = "<html>this is HTML."
  1268. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1269. w.Header().Set("Content-Type", "foo/bar")
  1270. io.WriteString(w, msg)
  1271. return nil
  1272. }, func(st *serverTester) {
  1273. getSlash(st)
  1274. hf := st.wantHeaders()
  1275. if hf.StreamEnded() {
  1276. t.Fatal("don't want END_STREAM, expecting data")
  1277. }
  1278. if !hf.HeadersEnded() {
  1279. t.Fatal("want END_HEADERS flag")
  1280. }
  1281. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1282. wanth := [][2]string{
  1283. {":status", "200"},
  1284. {"content-type", "foo/bar"},
  1285. {"content-length", strconv.Itoa(len(msg))},
  1286. }
  1287. if !reflect.DeepEqual(goth, wanth) {
  1288. t.Errorf("Got headers %v; want %v", goth, wanth)
  1289. }
  1290. df := st.wantData()
  1291. if !df.StreamEnded() {
  1292. t.Error("expected DATA to have END_STREAM flag")
  1293. }
  1294. if got := string(df.Data()); got != msg {
  1295. t.Errorf("got DATA %q; want %q", got, msg)
  1296. }
  1297. })
  1298. }
  1299. func TestServer_Response_TransferEncoding_chunked(t *testing.T) {
  1300. const msg = "hi"
  1301. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1302. w.Header().Set("Transfer-Encoding", "chunked") // should be stripped
  1303. io.WriteString(w, msg)
  1304. return nil
  1305. }, func(st *serverTester) {
  1306. getSlash(st)
  1307. hf := st.wantHeaders()
  1308. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1309. wanth := [][2]string{
  1310. {":status", "200"},
  1311. {"content-type", "text/plain; charset=utf-8"},
  1312. {"content-length", strconv.Itoa(len(msg))},
  1313. }
  1314. if !reflect.DeepEqual(goth, wanth) {
  1315. t.Errorf("Got headers %v; want %v", goth, wanth)
  1316. }
  1317. })
  1318. }
  1319. // Header accessed only after the initial write.
  1320. func TestServer_Response_Data_IgnoreHeaderAfterWrite_After(t *testing.T) {
  1321. const msg = "<html>this is HTML."
  1322. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1323. io.WriteString(w, msg)
  1324. w.Header().Set("foo", "should be ignored")
  1325. return nil
  1326. }, func(st *serverTester) {
  1327. getSlash(st)
  1328. hf := st.wantHeaders()
  1329. if hf.StreamEnded() {
  1330. t.Fatal("unexpected END_STREAM")
  1331. }
  1332. if !hf.HeadersEnded() {
  1333. t.Fatal("want END_HEADERS flag")
  1334. }
  1335. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1336. wanth := [][2]string{
  1337. {":status", "200"},
  1338. {"content-type", "text/html; charset=utf-8"},
  1339. {"content-length", strconv.Itoa(len(msg))},
  1340. }
  1341. if !reflect.DeepEqual(goth, wanth) {
  1342. t.Errorf("Got headers %v; want %v", goth, wanth)
  1343. }
  1344. })
  1345. }
  1346. // Header accessed before the initial write and later mutated.
  1347. func TestServer_Response_Data_IgnoreHeaderAfterWrite_Overwrite(t *testing.T) {
  1348. const msg = "<html>this is HTML."
  1349. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1350. w.Header().Set("foo", "proper value")
  1351. io.WriteString(w, msg)
  1352. w.Header().Set("foo", "should be ignored")
  1353. return nil
  1354. }, func(st *serverTester) {
  1355. getSlash(st)
  1356. hf := st.wantHeaders()
  1357. if hf.StreamEnded() {
  1358. t.Fatal("unexpected END_STREAM")
  1359. }
  1360. if !hf.HeadersEnded() {
  1361. t.Fatal("want END_HEADERS flag")
  1362. }
  1363. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1364. wanth := [][2]string{
  1365. {":status", "200"},
  1366. {"foo", "proper value"},
  1367. {"content-type", "text/html; charset=utf-8"},
  1368. {"content-length", strconv.Itoa(len(msg))},
  1369. }
  1370. if !reflect.DeepEqual(goth, wanth) {
  1371. t.Errorf("Got headers %v; want %v", goth, wanth)
  1372. }
  1373. })
  1374. }
  1375. func TestServer_Response_Data_SniffLenType(t *testing.T) {
  1376. const msg = "<html>this is HTML."
  1377. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1378. io.WriteString(w, msg)
  1379. return nil
  1380. }, func(st *serverTester) {
  1381. getSlash(st)
  1382. hf := st.wantHeaders()
  1383. if hf.StreamEnded() {
  1384. t.Fatal("don't want END_STREAM, expecting data")
  1385. }
  1386. if !hf.HeadersEnded() {
  1387. t.Fatal("want END_HEADERS flag")
  1388. }
  1389. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1390. wanth := [][2]string{
  1391. {":status", "200"},
  1392. {"content-type", "text/html; charset=utf-8"},
  1393. {"content-length", strconv.Itoa(len(msg))},
  1394. }
  1395. if !reflect.DeepEqual(goth, wanth) {
  1396. t.Errorf("Got headers %v; want %v", goth, wanth)
  1397. }
  1398. df := st.wantData()
  1399. if !df.StreamEnded() {
  1400. t.Error("expected DATA to have END_STREAM flag")
  1401. }
  1402. if got := string(df.Data()); got != msg {
  1403. t.Errorf("got DATA %q; want %q", got, msg)
  1404. }
  1405. })
  1406. }
  1407. func TestServer_Response_Header_Flush_MidWrite(t *testing.T) {
  1408. const msg = "<html>this is HTML"
  1409. const msg2 = ", and this is the next chunk"
  1410. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1411. io.WriteString(w, msg)
  1412. w.(http.Flusher).Flush()
  1413. io.WriteString(w, msg2)
  1414. return nil
  1415. }, func(st *serverTester) {
  1416. getSlash(st)
  1417. hf := st.wantHeaders()
  1418. if hf.StreamEnded() {
  1419. t.Fatal("unexpected END_STREAM flag")
  1420. }
  1421. if !hf.HeadersEnded() {
  1422. t.Fatal("want END_HEADERS flag")
  1423. }
  1424. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1425. wanth := [][2]string{
  1426. {":status", "200"},
  1427. {"content-type", "text/html; charset=utf-8"}, // sniffed
  1428. // and no content-length
  1429. }
  1430. if !reflect.DeepEqual(goth, wanth) {
  1431. t.Errorf("Got headers %v; want %v", goth, wanth)
  1432. }
  1433. {
  1434. df := st.wantData()
  1435. if df.StreamEnded() {
  1436. t.Error("unexpected END_STREAM flag")
  1437. }
  1438. if got := string(df.Data()); got != msg {
  1439. t.Errorf("got DATA %q; want %q", got, msg)
  1440. }
  1441. }
  1442. {
  1443. df := st.wantData()
  1444. if !df.StreamEnded() {
  1445. t.Error("wanted END_STREAM flag on last data chunk")
  1446. }
  1447. if got := string(df.Data()); got != msg2 {
  1448. t.Errorf("got DATA %q; want %q", got, msg2)
  1449. }
  1450. }
  1451. })
  1452. }
  1453. func TestServer_Response_LargeWrite(t *testing.T) {
  1454. const size = 1 << 20
  1455. const maxFrameSize = 16 << 10
  1456. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1457. n, err := w.Write(bytes.Repeat([]byte("a"), size))
  1458. if err != nil {
  1459. return fmt.Errorf("Write error: %v", err)
  1460. }
  1461. if n != size {
  1462. return fmt.Errorf("wrong size %d from Write", n)
  1463. }
  1464. return nil
  1465. }, func(st *serverTester) {
  1466. if err := st.fr.WriteSettings(
  1467. Setting{SettingInitialWindowSize, 0},
  1468. Setting{SettingMaxFrameSize, maxFrameSize},
  1469. ); err != nil {
  1470. t.Fatal(err)
  1471. }
  1472. st.wantSettingsAck()
  1473. getSlash(st) // make the single request
  1474. // Give the handler quota to write:
  1475. if err := st.fr.WriteWindowUpdate(1, size); err != nil {
  1476. t.Fatal(err)
  1477. }
  1478. // Give the handler quota to write to connection-level
  1479. // window as well
  1480. if err := st.fr.WriteWindowUpdate(0, size); err != nil {
  1481. t.Fatal(err)
  1482. }
  1483. hf := st.wantHeaders()
  1484. if hf.StreamEnded() {
  1485. t.Fatal("unexpected END_STREAM flag")
  1486. }
  1487. if !hf.HeadersEnded() {
  1488. t.Fatal("want END_HEADERS flag")
  1489. }
  1490. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1491. wanth := [][2]string{
  1492. {":status", "200"},
  1493. {"content-type", "text/plain; charset=utf-8"}, // sniffed
  1494. // and no content-length
  1495. }
  1496. if !reflect.DeepEqual(goth, wanth) {
  1497. t.Errorf("Got headers %v; want %v", goth, wanth)
  1498. }
  1499. var bytes, frames int
  1500. for {
  1501. df := st.wantData()
  1502. bytes += len(df.Data())
  1503. frames++
  1504. for _, b := range df.Data() {
  1505. if b != 'a' {
  1506. t.Fatal("non-'a' byte seen in DATA")
  1507. }
  1508. }
  1509. if df.StreamEnded() {
  1510. break
  1511. }
  1512. }
  1513. if bytes != size {
  1514. t.Errorf("Got %d bytes; want %d", bytes, size)
  1515. }
  1516. if want := int(size / maxFrameSize); frames < want || frames > want*2 {
  1517. t.Errorf("Got %d frames; want %d", frames, size)
  1518. }
  1519. })
  1520. }
  1521. // Test that the handler can't write more than the client allows
  1522. func TestServer_Response_LargeWrite_FlowControlled(t *testing.T) {
  1523. const size = 1 << 20
  1524. const maxFrameSize = 16 << 10
  1525. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1526. w.(http.Flusher).Flush()
  1527. n, err := w.Write(bytes.Repeat([]byte("a"), size))
  1528. if err != nil {
  1529. return fmt.Errorf("Write error: %v", err)
  1530. }
  1531. if n != size {
  1532. return fmt.Errorf("wrong size %d from Write", n)
  1533. }
  1534. return nil
  1535. }, func(st *serverTester) {
  1536. // Set the window size to something explicit for this test.
  1537. // It's also how much initial data we expect.
  1538. const initWindowSize = 123
  1539. if err := st.fr.WriteSettings(
  1540. Setting{SettingInitialWindowSize, initWindowSize},
  1541. Setting{SettingMaxFrameSize, maxFrameSize},
  1542. ); err != nil {
  1543. t.Fatal(err)
  1544. }
  1545. st.wantSettingsAck()
  1546. getSlash(st) // make the single request
  1547. defer func() { st.fr.WriteRSTStream(1, ErrCodeCancel) }()
  1548. hf := st.wantHeaders()
  1549. if hf.StreamEnded() {
  1550. t.Fatal("unexpected END_STREAM flag")
  1551. }
  1552. if !hf.HeadersEnded() {
  1553. t.Fatal("want END_HEADERS flag")
  1554. }
  1555. df := st.wantData()
  1556. if got := len(df.Data()); got != initWindowSize {
  1557. t.Fatalf("Initial window size = %d but got DATA with %d bytes", initWindowSize, got)
  1558. }
  1559. for _, quota := range []int{1, 13, 127} {
  1560. if err := st.fr.WriteWindowUpdate(1, uint32(quota)); err != nil {
  1561. t.Fatal(err)
  1562. }
  1563. df := st.wantData()
  1564. if int(quota) != len(df.Data()) {
  1565. t.Fatalf("read %d bytes after giving %d quota", len(df.Data()), quota)
  1566. }
  1567. }
  1568. if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  1569. t.Fatal(err)
  1570. }
  1571. })
  1572. }
  1573. // Test that the handler blocked in a Write is unblocked if the server sends a RST_STREAM.
  1574. func TestServer_Response_RST_Unblocks_LargeWrite(t *testing.T) {
  1575. const size = 1 << 20
  1576. const maxFrameSize = 16 << 10
  1577. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1578. w.(http.Flusher).Flush()
  1579. errc := make(chan error, 1)
  1580. go func() {
  1581. _, err := w.Write(bytes.Repeat([]byte("a"), size))
  1582. errc <- err
  1583. }()
  1584. select {
  1585. case err := <-errc:
  1586. if err == nil {
  1587. return errors.New("unexpected nil error from Write in handler")
  1588. }
  1589. return nil
  1590. case <-time.After(2 * time.Second):
  1591. return errors.New("timeout waiting for Write in handler")
  1592. }
  1593. }, func(st *serverTester) {
  1594. if err := st.fr.WriteSettings(
  1595. Setting{SettingInitialWindowSize, 0},
  1596. Setting{SettingMaxFrameSize, maxFrameSize},
  1597. ); err != nil {
  1598. t.Fatal(err)
  1599. }
  1600. st.wantSettingsAck()
  1601. getSlash(st) // make the single request
  1602. hf := st.wantHeaders()
  1603. if hf.StreamEnded() {
  1604. t.Fatal("unexpected END_STREAM flag")
  1605. }
  1606. if !hf.HeadersEnded() {
  1607. t.Fatal("want END_HEADERS flag")
  1608. }
  1609. if err := st.fr.WriteRSTStream(1, ErrCodeCancel); err != nil {
  1610. t.Fatal(err)
  1611. }
  1612. })
  1613. }
  1614. func TestServer_Response_Empty_Data_Not_FlowControlled(t *testing.T) {
  1615. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1616. w.(http.Flusher).Flush()
  1617. // Nothing; send empty DATA
  1618. return nil
  1619. }, func(st *serverTester) {
  1620. // Handler gets no data quota:
  1621. if err := st.fr.WriteSettings(Setting{SettingInitialWindowSize, 0}); err != nil {
  1622. t.Fatal(err)
  1623. }
  1624. st.wantSettingsAck()
  1625. getSlash(st) // make the single request
  1626. hf := st.wantHeaders()
  1627. if hf.StreamEnded() {
  1628. t.Fatal("unexpected END_STREAM flag")
  1629. }
  1630. if !hf.HeadersEnded() {
  1631. t.Fatal("want END_HEADERS flag")
  1632. }
  1633. df := st.wantData()
  1634. if got := len(df.Data()); got != 0 {
  1635. t.Fatalf("unexpected %d DATA bytes; want 0", got)
  1636. }
  1637. if !df.StreamEnded() {
  1638. t.Fatal("DATA didn't have END_STREAM")
  1639. }
  1640. })
  1641. }
  1642. func TestServer_Response_Automatic100Continue(t *testing.T) {
  1643. const msg = "foo"
  1644. const reply = "bar"
  1645. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1646. if v := r.Header.Get("Expect"); v != "" {
  1647. t.Errorf("Expect header = %q; want empty", v)
  1648. }
  1649. buf := make([]byte, len(msg))
  1650. // This read should trigger the 100-continue being sent.
  1651. if n, err := io.ReadFull(r.Body, buf); err != nil || n != len(msg) || string(buf) != msg {
  1652. return fmt.Errorf("ReadFull = %q, %v; want %q, nil", buf[:n], err, msg)
  1653. }
  1654. _, err := io.WriteString(w, reply)
  1655. return err
  1656. }, func(st *serverTester) {
  1657. st.writeHeaders(HeadersFrameParam{
  1658. StreamID: 1, // clients send odd numbers
  1659. BlockFragment: st.encodeHeader(":method", "POST", "expect", "100-continue"),
  1660. EndStream: false,
  1661. EndHeaders: true,
  1662. })
  1663. hf := st.wantHeaders()
  1664. if hf.StreamEnded() {
  1665. t.Fatal("unexpected END_STREAM flag")
  1666. }
  1667. if !hf.HeadersEnded() {
  1668. t.Fatal("want END_HEADERS flag")
  1669. }
  1670. goth := decodeHeader(t, hf.HeaderBlockFragment())
  1671. wanth := [][2]string{
  1672. {":status", "100"},
  1673. }
  1674. if !reflect.DeepEqual(goth, wanth) {
  1675. t.Fatalf("Got headers %v; want %v", goth, wanth)
  1676. }
  1677. // Okay, they sent status 100, so we can send our
  1678. // gigantic and/or sensitive "foo" payload now.
  1679. st.writeData(1, true, []byte(msg))
  1680. st.wantWindowUpdate(0, uint32(len(msg)))
  1681. hf = st.wantHeaders()
  1682. if hf.StreamEnded() {
  1683. t.Fatal("expected data to follow")
  1684. }
  1685. if !hf.HeadersEnded() {
  1686. t.Fatal("want END_HEADERS flag")
  1687. }
  1688. goth = decodeHeader(t, hf.HeaderBlockFragment())
  1689. wanth = [][2]string{
  1690. {":status", "200"},
  1691. {"content-type", "text/plain; charset=utf-8"},
  1692. {"content-length", strconv.Itoa(len(reply))},
  1693. }
  1694. if !reflect.DeepEqual(goth, wanth) {
  1695. t.Errorf("Got headers %v; want %v", goth, wanth)
  1696. }
  1697. df := st.wantData()
  1698. if string(df.Data()) != reply {
  1699. t.Errorf("Client read %q; want %q", df.Data(), reply)
  1700. }
  1701. if !df.StreamEnded() {
  1702. t.Errorf("expect data stream end")
  1703. }
  1704. })
  1705. }
  1706. func TestServer_HandlerWriteErrorOnDisconnect(t *testing.T) {
  1707. errc := make(chan error, 1)
  1708. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1709. p := []byte("some data.\n")
  1710. for {
  1711. _, err := w.Write(p)
  1712. if err != nil {
  1713. errc <- err
  1714. return nil
  1715. }
  1716. }
  1717. }, func(st *serverTester) {
  1718. st.writeHeaders(HeadersFrameParam{
  1719. StreamID: 1,
  1720. BlockFragment: st.encodeHeader(),
  1721. EndStream: false,
  1722. EndHeaders: true,
  1723. })
  1724. hf := st.wantHeaders()
  1725. if hf.StreamEnded() {
  1726. t.Fatal("unexpected END_STREAM flag")
  1727. }
  1728. if !hf.HeadersEnded() {
  1729. t.Fatal("want END_HEADERS flag")
  1730. }
  1731. // Close the connection and wait for the handler to (hopefully) notice.
  1732. st.cc.Close()
  1733. select {
  1734. case <-errc:
  1735. case <-time.After(5 * time.Second):
  1736. t.Error("timeout")
  1737. }
  1738. })
  1739. }
  1740. func TestServer_Rejects_Too_Many_Streams(t *testing.T) {
  1741. const testPath = "/some/path"
  1742. inHandler := make(chan uint32)
  1743. leaveHandler := make(chan bool)
  1744. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1745. id := w.(*responseWriter).rws.stream.id
  1746. inHandler <- id
  1747. if id == 1+(defaultMaxStreams+1)*2 && r.URL.Path != testPath {
  1748. t.Errorf("decoded final path as %q; want %q", r.URL.Path, testPath)
  1749. }
  1750. <-leaveHandler
  1751. })
  1752. defer st.Close()
  1753. st.greet()
  1754. nextStreamID := uint32(1)
  1755. streamID := func() uint32 {
  1756. defer func() { nextStreamID += 2 }()
  1757. return nextStreamID
  1758. }
  1759. sendReq := func(id uint32, headers ...string) {
  1760. st.writeHeaders(HeadersFrameParam{
  1761. StreamID: id,
  1762. BlockFragment: st.encodeHeader(headers...),
  1763. EndStream: true,
  1764. EndHeaders: true,
  1765. })
  1766. }
  1767. for i := 0; i < defaultMaxStreams; i++ {
  1768. sendReq(streamID())
  1769. <-inHandler
  1770. }
  1771. defer func() {
  1772. for i := 0; i < defaultMaxStreams; i++ {
  1773. leaveHandler <- true
  1774. }
  1775. }()
  1776. // And this one should cross the limit:
  1777. // (It's also sent as a CONTINUATION, to verify we still track the decoder context,
  1778. // even if we're rejecting it)
  1779. rejectID := streamID()
  1780. headerBlock := st.encodeHeader(":path", testPath)
  1781. frag1, frag2 := headerBlock[:3], headerBlock[3:]
  1782. st.writeHeaders(HeadersFrameParam{
  1783. StreamID: rejectID,
  1784. BlockFragment: frag1,
  1785. EndStream: true,
  1786. EndHeaders: false, // CONTINUATION coming
  1787. })
  1788. if err := st.fr.WriteContinuation(rejectID, true, frag2); err != nil {
  1789. t.Fatal(err)
  1790. }
  1791. st.wantRSTStream(rejectID, ErrCodeProtocol)
  1792. // But let a handler finish:
  1793. leaveHandler <- true
  1794. st.wantHeaders()
  1795. // And now another stream should be able to start:
  1796. goodID := streamID()
  1797. sendReq(goodID, ":path", testPath)
  1798. select {
  1799. case got := <-inHandler:
  1800. if got != goodID {
  1801. t.Errorf("Got stream %d; want %d", got, goodID)
  1802. }
  1803. case <-time.After(3 * time.Second):
  1804. t.Error("timeout waiting for handler")
  1805. }
  1806. }
  1807. // So many response headers that the server needs to use CONTINUATION frames:
  1808. func TestServer_Response_ManyHeaders_With_Continuation(t *testing.T) {
  1809. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1810. h := w.Header()
  1811. for i := 0; i < 5000; i++ {
  1812. h.Set(fmt.Sprintf("x-header-%d", i), fmt.Sprintf("x-value-%d", i))
  1813. }
  1814. return nil
  1815. }, func(st *serverTester) {
  1816. getSlash(st)
  1817. hf := st.wantHeaders()
  1818. if hf.HeadersEnded() {
  1819. t.Fatal("got unwanted END_HEADERS flag")
  1820. }
  1821. n := 0
  1822. for {
  1823. n++
  1824. cf := st.wantContinuation()
  1825. if cf.HeadersEnded() {
  1826. break
  1827. }
  1828. }
  1829. if n < 5 {
  1830. t.Errorf("Only got %d CONTINUATION frames; expected 5+ (currently 6)", n)
  1831. }
  1832. })
  1833. }
  1834. // This previously crashed (reported by Mathieu Lonjaret as observed
  1835. // while using Camlistore) because we got a DATA frame from the client
  1836. // after the handler exited and our logic at the time was wrong,
  1837. // keeping a stream in the map in stateClosed, which tickled an
  1838. // invariant check later when we tried to remove that stream (via
  1839. // defer sc.closeAllStreamsOnConnClose) when the serverConn serve loop
  1840. // ended.
  1841. func TestServer_NoCrash_HandlerClose_Then_ClientClose(t *testing.T) {
  1842. testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
  1843. // nothing
  1844. return nil
  1845. }, func(st *serverTester) {
  1846. st.writeHeaders(HeadersFrameParam{
  1847. StreamID: 1,
  1848. BlockFragment: st.encodeHeader(),
  1849. EndStream: false, // DATA is coming
  1850. EndHeaders: true,
  1851. })
  1852. hf := st.wantHeaders()
  1853. if !hf.HeadersEnded() || !hf.StreamEnded() {
  1854. t.Fatalf("want END_HEADERS+END_STREAM, got %v", hf)
  1855. }
  1856. // Sent when the a Handler closes while a client has
  1857. // indicated it's still sending DATA:
  1858. st.wantRSTStream(1, ErrCodeCancel)
  1859. // Now the handler has ended, so it's ended its
  1860. // stream, but the client hasn't closed its side
  1861. // (stateClosedLocal). So send more data and verify
  1862. // it doesn't crash with an internal invariant panic, like
  1863. // it did before.
  1864. st.writeData(1, true, []byte("foo"))
  1865. // Sent after a peer sends data anyway (admittedly the
  1866. // previous RST_STREAM might've still been in-flight),
  1867. // but they'll get the more friendly 'cancel' code
  1868. // first.
  1869. st.wantRSTStream(1, ErrCodeStreamClosed)
  1870. // Set up a bunch of machinery to record the panic we saw
  1871. // previously.
  1872. var (
  1873. panMu sync.Mutex
  1874. panicVal interface{}
  1875. )
  1876. testHookOnPanicMu.Lock()
  1877. testHookOnPanic = func(sc *serverConn, pv interface{}) bool {
  1878. panMu.Lock()
  1879. panicVal = pv
  1880. panMu.Unlock()
  1881. return true
  1882. }
  1883. testHookOnPanicMu.Unlock()
  1884. // Now force the serve loop to end, via closing the connection.
  1885. st.cc.Close()
  1886. select {
  1887. case <-st.sc.doneServing:
  1888. // Loop has exited.
  1889. panMu.Lock()
  1890. got := panicVal
  1891. panMu.Unlock()
  1892. if got != nil {
  1893. t.Errorf("Got panic: %v", got)
  1894. }
  1895. case <-time.After(5 * time.Second):
  1896. t.Error("timeout")
  1897. }
  1898. })
  1899. }
  1900. func TestServer_Rejects_TLS10(t *testing.T) { testRejectTLS(t, tls.VersionTLS10) }
  1901. func TestServer_Rejects_TLS11(t *testing.T) { testRejectTLS(t, tls.VersionTLS11) }
  1902. func testRejectTLS(t *testing.T, max uint16) {
  1903. st := newServerTester(t, nil, func(c *tls.Config) {
  1904. c.MaxVersion = max
  1905. })
  1906. defer st.Close()
  1907. gf := st.wantGoAway()
  1908. if got, want := gf.ErrCode, ErrCodeInadequateSecurity; got != want {
  1909. t.Errorf("Got error code %v; want %v", got, want)
  1910. }
  1911. }
  1912. func TestServer_Rejects_TLSBadCipher(t *testing.T) {
  1913. st := newServerTester(t, nil, func(c *tls.Config) {
  1914. // Only list bad ones:
  1915. c.CipherSuites = []uint16{
  1916. tls.TLS_RSA_WITH_RC4_128_SHA,
  1917. tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  1918. tls.TLS_RSA_WITH_AES_128_CBC_SHA,
  1919. tls.TLS_RSA_WITH_AES_256_CBC_SHA,
  1920. tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
  1921. tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  1922. tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  1923. tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA,
  1924. tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
  1925. tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  1926. tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  1927. }
  1928. })
  1929. defer st.Close()
  1930. gf := st.wantGoAway()
  1931. if got, want := gf.ErrCode, ErrCodeInadequateSecurity; got != want {
  1932. t.Errorf("Got error code %v; want %v", got, want)
  1933. }
  1934. }
  1935. func TestServer_Advertises_Common_Cipher(t *testing.T) {
  1936. const requiredSuite = tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  1937. st := newServerTester(t, nil, func(c *tls.Config) {
  1938. // Have the client only support the one required by the spec.
  1939. c.CipherSuites = []uint16{requiredSuite}
  1940. }, func(ts *httptest.Server) {
  1941. var srv *http.Server = ts.Config
  1942. // Have the server configured with one specific cipher suite
  1943. // which is banned. This tests that ConfigureServer ends up
  1944. // adding the good one to this list.
  1945. srv.TLSConfig = &tls.Config{
  1946. CipherSuites: []uint16{tls.TLS_RSA_WITH_AES_128_CBC_SHA}, // just a banned one
  1947. }
  1948. })
  1949. defer st.Close()
  1950. st.greet()
  1951. }
  1952. // TODO: move this onto *serverTester, and re-use the same hpack
  1953. // decoding context throughout. We're just getting lucky here with
  1954. // creating a new decoder each time.
  1955. func decodeHeader(t *testing.T, headerBlock []byte) (pairs [][2]string) {
  1956. d := hpack.NewDecoder(initialHeaderTableSize, func(f hpack.HeaderField) {
  1957. pairs = append(pairs, [2]string{f.Name, f.Value})
  1958. })
  1959. if _, err := d.Write(headerBlock); err != nil {
  1960. t.Fatalf("hpack decoding error: %v", err)
  1961. }
  1962. if err := d.Close(); err != nil {
  1963. t.Fatalf("hpack decoding error: %v", err)
  1964. }
  1965. return
  1966. }
  1967. // testServerResponse sets up an idle HTTP/2 connection and lets you
  1968. // write a single request with writeReq, and then reply to it in some way with the provided handler,
  1969. // and then verify the output with the serverTester again (assuming the handler returns nil)
  1970. func testServerResponse(t testing.TB,
  1971. handler func(http.ResponseWriter, *http.Request) error,
  1972. client func(*serverTester),
  1973. ) {
  1974. errc := make(chan error, 1)
  1975. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  1976. if r.Body == nil {
  1977. t.Fatal("nil Body")
  1978. }
  1979. errc <- handler(w, r)
  1980. })
  1981. defer st.Close()
  1982. donec := make(chan bool)
  1983. go func() {
  1984. defer close(donec)
  1985. st.greet()
  1986. client(st)
  1987. }()
  1988. select {
  1989. case <-donec:
  1990. return
  1991. case <-time.After(5 * time.Second):
  1992. t.Fatal("timeout")
  1993. }
  1994. select {
  1995. case err := <-errc:
  1996. if err != nil {
  1997. t.Fatalf("Error in handler: %v", err)
  1998. }
  1999. case <-time.After(2 * time.Second):
  2000. t.Error("timeout waiting for handler to finish")
  2001. }
  2002. }
  2003. // readBodyHandler returns an http Handler func that reads len(want)
  2004. // bytes from r.Body and fails t if the contents read were not
  2005. // the value of want.
  2006. func readBodyHandler(t *testing.T, want string) func(w http.ResponseWriter, r *http.Request) {
  2007. return func(w http.ResponseWriter, r *http.Request) {
  2008. buf := make([]byte, len(want))
  2009. _, err := io.ReadFull(r.Body, buf)
  2010. if err != nil {
  2011. t.Error(err)
  2012. return
  2013. }
  2014. if string(buf) != want {
  2015. t.Errorf("read %q; want %q", buf, want)
  2016. }
  2017. }
  2018. }
  2019. // TestServerWithCurl currently fails, hence the LenientCipherSuites test. See:
  2020. // https://github.com/tatsuhiro-t/nghttp2/issues/140 &
  2021. // http://sourceforge.net/p/curl/bugs/1472/
  2022. func TestServerWithCurl(t *testing.T) { testServerWithCurl(t, false) }
  2023. func TestServerWithCurl_LenientCipherSuites(t *testing.T) { testServerWithCurl(t, true) }
  2024. func testServerWithCurl(t *testing.T, permitProhibitedCipherSuites bool) {
  2025. if runtime.GOOS != "linux" {
  2026. t.Skip("skipping Docker test when not on Linux; requires --net which won't work with boot2docker anyway")
  2027. }
  2028. requireCurl(t)
  2029. const msg = "Hello from curl!\n"
  2030. ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  2031. w.Header().Set("Foo", "Bar")
  2032. w.Header().Set("Client-Proto", r.Proto)
  2033. io.WriteString(w, msg)
  2034. }))
  2035. ConfigureServer(ts.Config, &Server{
  2036. PermitProhibitedCipherSuites: permitProhibitedCipherSuites,
  2037. })
  2038. ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config
  2039. ts.StartTLS()
  2040. defer ts.Close()
  2041. var gotConn int32
  2042. testHookOnConn = func() { atomic.StoreInt32(&gotConn, 1) }
  2043. t.Logf("Running test server for curl to hit at: %s", ts.URL)
  2044. container := curl(t, "--silent", "--http2", "--insecure", "-v", ts.URL)
  2045. defer kill(container)
  2046. resc := make(chan interface{}, 1)
  2047. go func() {
  2048. res, err := dockerLogs(container)
  2049. if err != nil {
  2050. resc <- err
  2051. } else {
  2052. resc <- res
  2053. }
  2054. }()
  2055. select {
  2056. case res := <-resc:
  2057. if err, ok := res.(error); ok {
  2058. t.Fatal(err)
  2059. }
  2060. if !strings.Contains(string(res.([]byte)), "foo: Bar") {
  2061. t.Errorf("didn't see foo: Bar header")
  2062. t.Logf("Got: %s", res)
  2063. }
  2064. if !strings.Contains(string(res.([]byte)), "client-proto: HTTP/2") {
  2065. t.Errorf("didn't see client-proto: HTTP/2 header")
  2066. t.Logf("Got: %s", res)
  2067. }
  2068. if !strings.Contains(string(res.([]byte)), msg) {
  2069. t.Errorf("didn't see %q content", msg)
  2070. t.Logf("Got: %s", res)
  2071. }
  2072. case <-time.After(3 * time.Second):
  2073. t.Errorf("timeout waiting for curl")
  2074. }
  2075. if atomic.LoadInt32(&gotConn) == 0 {
  2076. t.Error("never saw an http2 connection")
  2077. }
  2078. }
  2079. // Issue 12843
  2080. func TestServerDoS_MaxHeaderListSize(t *testing.T) {
  2081. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {})
  2082. defer st.Close()
  2083. // shake hands
  2084. st.writePreface()
  2085. st.writeInitialSettings()
  2086. frameSize := defaultMaxReadFrameSize
  2087. var advHeaderListSize *uint32
  2088. st.wantSettings().ForeachSetting(func(s Setting) error {
  2089. switch s.ID {
  2090. case SettingMaxFrameSize:
  2091. if s.Val < minMaxFrameSize {
  2092. frameSize = minMaxFrameSize
  2093. } else if s.Val > maxFrameSize {
  2094. frameSize = maxFrameSize
  2095. } else {
  2096. frameSize = int(s.Val)
  2097. }
  2098. case SettingMaxHeaderListSize:
  2099. advHeaderListSize = &s.Val
  2100. }
  2101. return nil
  2102. })
  2103. st.writeSettingsAck()
  2104. st.wantSettingsAck()
  2105. if advHeaderListSize == nil {
  2106. t.Errorf("server didn't advertise a max header list size")
  2107. } else if *advHeaderListSize == 0 {
  2108. t.Errorf("server advertised a max header list size of 0")
  2109. }
  2110. st.encodeHeaderField(":method", "GET")
  2111. st.encodeHeaderField(":path", "/")
  2112. st.encodeHeaderField(":scheme", "https")
  2113. cookie := strings.Repeat("*", 4058)
  2114. st.encodeHeaderField("cookie", cookie)
  2115. st.writeHeaders(HeadersFrameParam{
  2116. StreamID: 1,
  2117. BlockFragment: st.headerBuf.Bytes(),
  2118. EndStream: true,
  2119. EndHeaders: false,
  2120. })
  2121. // Capture the short encoding of a duplicate ~4K cookie, now
  2122. // that we've already sent it once.
  2123. st.headerBuf.Reset()
  2124. st.encodeHeaderField("cookie", cookie)
  2125. // Now send 1MB of it.
  2126. const size = 1 << 20
  2127. b := bytes.Repeat(st.headerBuf.Bytes(), size/st.headerBuf.Len())
  2128. for len(b) > 0 {
  2129. chunk := b
  2130. if len(chunk) > frameSize {
  2131. chunk = chunk[:frameSize]
  2132. }
  2133. b = b[len(chunk):]
  2134. st.fr.WriteContinuation(1, len(b) == 0, chunk)
  2135. }
  2136. h := st.wantHeaders()
  2137. if !h.HeadersEnded() {
  2138. t.Fatalf("Got HEADERS without END_HEADERS set: %v", h)
  2139. }
  2140. headers := decodeHeader(t, h.HeaderBlockFragment())
  2141. want := [][2]string{
  2142. {":status", "431"},
  2143. {"content-type", "text/html; charset=utf-8"},
  2144. {"content-length", "63"},
  2145. }
  2146. if !reflect.DeepEqual(headers, want) {
  2147. t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want)
  2148. }
  2149. }
  2150. func TestCompressionErrorOnWrite(t *testing.T) {
  2151. const maxStrLen = 8 << 10
  2152. var serverConfig *http.Server
  2153. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  2154. // No response body.
  2155. }, func(ts *httptest.Server) {
  2156. serverConfig = ts.Config
  2157. serverConfig.MaxHeaderBytes = maxStrLen
  2158. })
  2159. defer st.Close()
  2160. st.greet()
  2161. maxAllowed := st.sc.maxHeaderStringLen()
  2162. // Crank this up, now that we have a conn connected with the
  2163. // hpack.Decoder's max string length set has been initialized
  2164. // from the earlier low ~8K value. We want this higher so don't
  2165. // hit the max header list size. We only want to test hitting
  2166. // the max string size.
  2167. serverConfig.MaxHeaderBytes = 1 << 20
  2168. // First a request with a header that's exactly the max allowed size.
  2169. hbf := st.encodeHeader("foo", strings.Repeat("a", maxAllowed))
  2170. st.writeHeaders(HeadersFrameParam{
  2171. StreamID: 1,
  2172. BlockFragment: hbf,
  2173. EndStream: true,
  2174. EndHeaders: true,
  2175. })
  2176. h := st.wantHeaders()
  2177. if !h.HeadersEnded() || !h.StreamEnded() {
  2178. t.Errorf("Unexpected HEADER frame %v", h)
  2179. }
  2180. // And now send one that's just one byte too big.
  2181. hbf = st.encodeHeader("bar", strings.Repeat("b", maxAllowed+1))
  2182. st.writeHeaders(HeadersFrameParam{
  2183. StreamID: 3,
  2184. BlockFragment: hbf,
  2185. EndStream: true,
  2186. EndHeaders: true,
  2187. })
  2188. ga := st.wantGoAway()
  2189. if ga.ErrCode != ErrCodeCompression {
  2190. t.Errorf("GOAWAY err = %v; want ErrCodeCompression", ga.ErrCode)
  2191. }
  2192. }
  2193. func TestCompressionErrorOnClose(t *testing.T) {
  2194. st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
  2195. // No response body.
  2196. })
  2197. defer st.Close()
  2198. st.greet()
  2199. hbf := st.encodeHeader("foo", "bar")
  2200. hbf = hbf[:len(hbf)-1] // truncate one byte from the end, so hpack.Decoder.Close fails.
  2201. st.writeHeaders(HeadersFrameParam{
  2202. StreamID: 1,
  2203. BlockFragment: hbf,
  2204. EndStream: true,
  2205. EndHeaders: true,
  2206. })
  2207. ga := st.wantGoAway()
  2208. if ga.ErrCode != ErrCodeCompression {
  2209. t.Errorf("GOAWAY err = %v; want ErrCodeCompression", ga.ErrCode)
  2210. }
  2211. }
  2212. func BenchmarkServerGets(b *testing.B) {
  2213. b.ReportAllocs()
  2214. const msg = "Hello, world"
  2215. st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) {
  2216. io.WriteString(w, msg)
  2217. })
  2218. defer st.Close()
  2219. st.greet()
  2220. // Give the server quota to reply. (plus it has the the 64KB)
  2221. if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil {
  2222. b.Fatal(err)
  2223. }
  2224. for i := 0; i < b.N; i++ {
  2225. id := 1 + uint32(i)*2
  2226. st.writeHeaders(HeadersFrameParam{
  2227. StreamID: id,
  2228. BlockFragment: st.encodeHeader(),
  2229. EndStream: true,
  2230. EndHeaders: true,
  2231. })
  2232. st.wantHeaders()
  2233. df := st.wantData()
  2234. if !df.StreamEnded() {
  2235. b.Fatalf("DATA didn't have END_STREAM; got %v", df)
  2236. }
  2237. }
  2238. }
  2239. func BenchmarkServerPosts(b *testing.B) {
  2240. b.ReportAllocs()
  2241. const msg = "Hello, world"
  2242. st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) {
  2243. io.WriteString(w, msg)
  2244. })
  2245. defer st.Close()
  2246. st.greet()
  2247. // Give the server quota to reply. (plus it has the the 64KB)
  2248. if err := st.fr.WriteWindowUpdate(0, uint32(b.N*len(msg))); err != nil {
  2249. b.Fatal(err)
  2250. }
  2251. for i := 0; i < b.N; i++ {
  2252. id := 1 + uint32(i)*2
  2253. st.writeHeaders(HeadersFrameParam{
  2254. StreamID: id,
  2255. BlockFragment: st.encodeHeader(":method", "POST"),
  2256. EndStream: false,
  2257. EndHeaders: true,
  2258. })
  2259. st.writeData(id, true, nil)
  2260. st.wantHeaders()
  2261. df := st.wantData()
  2262. if !df.StreamEnded() {
  2263. b.Fatalf("DATA didn't have END_STREAM; got %v", df)
  2264. }
  2265. }
  2266. }
  2267. // go-fuzz bug, originally reported at https://github.com/bradfitz/http2/issues/53
  2268. // Verify we don't hang.
  2269. func TestIssue53(t *testing.T) {
  2270. const data = "PRI * HTTP/2.0\r\n\r\nSM" +
  2271. "\r\n\r\n\x00\x00\x00\x01\ainfinfin\ad"
  2272. s := &http.Server{
  2273. ErrorLog: log.New(io.MultiWriter(stderrv(), twriter{t: t}), "", log.LstdFlags),
  2274. }
  2275. s2 := &Server{MaxReadFrameSize: 1 << 16, PermitProhibitedCipherSuites: true}
  2276. c := &issue53Conn{[]byte(data), false, false}
  2277. s2.handleConn(s, c, http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
  2278. w.Write([]byte("hello"))
  2279. }))
  2280. if !c.closed {
  2281. t.Fatal("connection is not closed")
  2282. }
  2283. }
  2284. type issue53Conn struct {
  2285. data []byte
  2286. closed bool
  2287. written bool
  2288. }
  2289. func (c *issue53Conn) Read(b []byte) (n int, err error) {
  2290. if len(c.data) == 0 {
  2291. return 0, io.EOF
  2292. }
  2293. n = copy(b, c.data)
  2294. c.data = c.data[n:]
  2295. return
  2296. }
  2297. func (c *issue53Conn) Write(b []byte) (n int, err error) {
  2298. c.written = true
  2299. return len(b), nil
  2300. }
  2301. func (c *issue53Conn) Close() error {
  2302. c.closed = true
  2303. return nil
  2304. }
  2305. func (c *issue53Conn) LocalAddr() net.Addr { return &net.TCPAddr{net.IP{127, 0, 0, 1}, 49706, ""} }
  2306. func (c *issue53Conn) RemoteAddr() net.Addr { return &net.TCPAddr{net.IP{127, 0, 0, 1}, 49706, ""} }
  2307. func (c *issue53Conn) SetDeadline(t time.Time) error { return nil }
  2308. func (c *issue53Conn) SetReadDeadline(t time.Time) error { return nil }
  2309. func (c *issue53Conn) SetWriteDeadline(t time.Time) error { return nil }