read.go 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. // Copyright 2011 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 spdy
  5. import (
  6. "compress/zlib"
  7. "encoding/binary"
  8. "io"
  9. "net/http"
  10. "strings"
  11. )
  12. func (frame *SynStreamFrame) read(h ControlFrameHeader, f *Framer) error {
  13. return f.readSynStreamFrame(h, frame)
  14. }
  15. func (frame *SynReplyFrame) read(h ControlFrameHeader, f *Framer) error {
  16. return f.readSynReplyFrame(h, frame)
  17. }
  18. func (frame *RstStreamFrame) read(h ControlFrameHeader, f *Framer) error {
  19. frame.CFHeader = h
  20. if err := binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil {
  21. return err
  22. }
  23. if err := binary.Read(f.r, binary.BigEndian, &frame.Status); err != nil {
  24. return err
  25. }
  26. if frame.Status == 0 {
  27. return &Error{InvalidControlFrame, frame.StreamId}
  28. }
  29. if frame.StreamId == 0 {
  30. return &Error{ZeroStreamId, 0}
  31. }
  32. return nil
  33. }
  34. func (frame *SettingsFrame) read(h ControlFrameHeader, f *Framer) error {
  35. frame.CFHeader = h
  36. var numSettings uint32
  37. if err := binary.Read(f.r, binary.BigEndian, &numSettings); err != nil {
  38. return err
  39. }
  40. frame.FlagIdValues = make([]SettingsFlagIdValue, numSettings)
  41. for i := uint32(0); i < numSettings; i++ {
  42. if err := binary.Read(f.r, binary.BigEndian, &frame.FlagIdValues[i].Id); err != nil {
  43. return err
  44. }
  45. frame.FlagIdValues[i].Flag = SettingsFlag((frame.FlagIdValues[i].Id & 0xff000000) >> 24)
  46. frame.FlagIdValues[i].Id &= 0xffffff
  47. if err := binary.Read(f.r, binary.BigEndian, &frame.FlagIdValues[i].Value); err != nil {
  48. return err
  49. }
  50. }
  51. return nil
  52. }
  53. func (frame *PingFrame) read(h ControlFrameHeader, f *Framer) error {
  54. frame.CFHeader = h
  55. if err := binary.Read(f.r, binary.BigEndian, &frame.Id); err != nil {
  56. return err
  57. }
  58. if frame.Id == 0 {
  59. return &Error{ZeroStreamId, 0}
  60. }
  61. if frame.CFHeader.Flags != 0 {
  62. return &Error{InvalidControlFrame, StreamId(frame.Id)}
  63. }
  64. return nil
  65. }
  66. func (frame *GoAwayFrame) read(h ControlFrameHeader, f *Framer) error {
  67. frame.CFHeader = h
  68. if err := binary.Read(f.r, binary.BigEndian, &frame.LastGoodStreamId); err != nil {
  69. return err
  70. }
  71. if frame.CFHeader.Flags != 0 {
  72. return &Error{InvalidControlFrame, frame.LastGoodStreamId}
  73. }
  74. if frame.CFHeader.length != 8 {
  75. return &Error{InvalidControlFrame, frame.LastGoodStreamId}
  76. }
  77. if err := binary.Read(f.r, binary.BigEndian, &frame.Status); err != nil {
  78. return err
  79. }
  80. return nil
  81. }
  82. func (frame *HeadersFrame) read(h ControlFrameHeader, f *Framer) error {
  83. return f.readHeadersFrame(h, frame)
  84. }
  85. func (frame *WindowUpdateFrame) read(h ControlFrameHeader, f *Framer) error {
  86. frame.CFHeader = h
  87. if err := binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil {
  88. return err
  89. }
  90. if frame.CFHeader.Flags != 0 {
  91. return &Error{InvalidControlFrame, frame.StreamId}
  92. }
  93. if frame.CFHeader.length != 8 {
  94. return &Error{InvalidControlFrame, frame.StreamId}
  95. }
  96. if err := binary.Read(f.r, binary.BigEndian, &frame.DeltaWindowSize); err != nil {
  97. return err
  98. }
  99. return nil
  100. }
  101. func newControlFrame(frameType ControlFrameType) (controlFrame, error) {
  102. ctor, ok := cframeCtor[frameType]
  103. if !ok {
  104. return nil, &Error{Err: InvalidControlFrame}
  105. }
  106. return ctor(), nil
  107. }
  108. var cframeCtor = map[ControlFrameType]func() controlFrame{
  109. TypeSynStream: func() controlFrame { return new(SynStreamFrame) },
  110. TypeSynReply: func() controlFrame { return new(SynReplyFrame) },
  111. TypeRstStream: func() controlFrame { return new(RstStreamFrame) },
  112. TypeSettings: func() controlFrame { return new(SettingsFrame) },
  113. TypePing: func() controlFrame { return new(PingFrame) },
  114. TypeGoAway: func() controlFrame { return new(GoAwayFrame) },
  115. TypeHeaders: func() controlFrame { return new(HeadersFrame) },
  116. TypeWindowUpdate: func() controlFrame { return new(WindowUpdateFrame) },
  117. }
  118. func (f *Framer) uncorkHeaderDecompressor(payloadSize int64) error {
  119. if f.headerDecompressor != nil {
  120. f.headerReader.N = payloadSize
  121. return nil
  122. }
  123. f.headerReader = io.LimitedReader{R: f.r, N: payloadSize}
  124. decompressor, err := zlib.NewReaderDict(&f.headerReader, []byte(headerDictionary))
  125. if err != nil {
  126. return err
  127. }
  128. f.headerDecompressor = decompressor
  129. return nil
  130. }
  131. // ReadFrame reads SPDY encoded data and returns a decompressed Frame.
  132. func (f *Framer) ReadFrame() (Frame, error) {
  133. var firstWord uint32
  134. if err := binary.Read(f.r, binary.BigEndian, &firstWord); err != nil {
  135. return nil, err
  136. }
  137. if firstWord&0x80000000 != 0 {
  138. frameType := ControlFrameType(firstWord & 0xffff)
  139. version := uint16(firstWord >> 16 & 0x7fff)
  140. return f.parseControlFrame(version, frameType)
  141. }
  142. return f.parseDataFrame(StreamId(firstWord & 0x7fffffff))
  143. }
  144. func (f *Framer) parseControlFrame(version uint16, frameType ControlFrameType) (Frame, error) {
  145. var length uint32
  146. if err := binary.Read(f.r, binary.BigEndian, &length); err != nil {
  147. return nil, err
  148. }
  149. flags := ControlFlags((length & 0xff000000) >> 24)
  150. length &= 0xffffff
  151. header := ControlFrameHeader{version, frameType, flags, length}
  152. cframe, err := newControlFrame(frameType)
  153. if err != nil {
  154. return nil, err
  155. }
  156. if err = cframe.read(header, f); err != nil {
  157. return nil, err
  158. }
  159. return cframe, nil
  160. }
  161. func parseHeaderValueBlock(r io.Reader, streamId StreamId) (http.Header, error) {
  162. var numHeaders uint32
  163. if err := binary.Read(r, binary.BigEndian, &numHeaders); err != nil {
  164. return nil, err
  165. }
  166. var e error
  167. h := make(http.Header, int(numHeaders))
  168. for i := 0; i < int(numHeaders); i++ {
  169. var length uint32
  170. if err := binary.Read(r, binary.BigEndian, &length); err != nil {
  171. return nil, err
  172. }
  173. nameBytes := make([]byte, length)
  174. if _, err := io.ReadFull(r, nameBytes); err != nil {
  175. return nil, err
  176. }
  177. name := string(nameBytes)
  178. if name != strings.ToLower(name) {
  179. e = &Error{UnlowercasedHeaderName, streamId}
  180. name = strings.ToLower(name)
  181. }
  182. if h[name] != nil {
  183. e = &Error{DuplicateHeaders, streamId}
  184. }
  185. if err := binary.Read(r, binary.BigEndian, &length); err != nil {
  186. return nil, err
  187. }
  188. value := make([]byte, length)
  189. if _, err := io.ReadFull(r, value); err != nil {
  190. return nil, err
  191. }
  192. valueList := strings.Split(string(value), headerValueSeparator)
  193. for _, v := range valueList {
  194. h.Add(name, v)
  195. }
  196. }
  197. if e != nil {
  198. return h, e
  199. }
  200. return h, nil
  201. }
  202. func (f *Framer) readSynStreamFrame(h ControlFrameHeader, frame *SynStreamFrame) error {
  203. frame.CFHeader = h
  204. var err error
  205. if err = binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil {
  206. return err
  207. }
  208. if err = binary.Read(f.r, binary.BigEndian, &frame.AssociatedToStreamId); err != nil {
  209. return err
  210. }
  211. if err = binary.Read(f.r, binary.BigEndian, &frame.Priority); err != nil {
  212. return err
  213. }
  214. frame.Priority >>= 5
  215. if err = binary.Read(f.r, binary.BigEndian, &frame.Slot); err != nil {
  216. return err
  217. }
  218. reader := f.r
  219. if !f.headerCompressionDisabled {
  220. err := f.uncorkHeaderDecompressor(int64(h.length - 10))
  221. if err != nil {
  222. return err
  223. }
  224. reader = f.headerDecompressor
  225. }
  226. frame.Headers, err = parseHeaderValueBlock(reader, frame.StreamId)
  227. if !f.headerCompressionDisabled && (err == io.EOF && f.headerReader.N == 0 || f.headerReader.N != 0) {
  228. err = &Error{WrongCompressedPayloadSize, 0}
  229. }
  230. if err != nil {
  231. return err
  232. }
  233. for h := range frame.Headers {
  234. if invalidReqHeaders[h] {
  235. return &Error{InvalidHeaderPresent, frame.StreamId}
  236. }
  237. }
  238. if frame.StreamId == 0 {
  239. return &Error{ZeroStreamId, 0}
  240. }
  241. return nil
  242. }
  243. func (f *Framer) readSynReplyFrame(h ControlFrameHeader, frame *SynReplyFrame) error {
  244. frame.CFHeader = h
  245. var err error
  246. if err = binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil {
  247. return err
  248. }
  249. reader := f.r
  250. if !f.headerCompressionDisabled {
  251. err := f.uncorkHeaderDecompressor(int64(h.length - 4))
  252. if err != nil {
  253. return err
  254. }
  255. reader = f.headerDecompressor
  256. }
  257. frame.Headers, err = parseHeaderValueBlock(reader, frame.StreamId)
  258. if !f.headerCompressionDisabled && (err == io.EOF && f.headerReader.N == 0 || f.headerReader.N != 0) {
  259. err = &Error{WrongCompressedPayloadSize, 0}
  260. }
  261. if err != nil {
  262. return err
  263. }
  264. for h := range frame.Headers {
  265. if invalidRespHeaders[h] {
  266. return &Error{InvalidHeaderPresent, frame.StreamId}
  267. }
  268. }
  269. if frame.StreamId == 0 {
  270. return &Error{ZeroStreamId, 0}
  271. }
  272. return nil
  273. }
  274. func (f *Framer) readHeadersFrame(h ControlFrameHeader, frame *HeadersFrame) error {
  275. frame.CFHeader = h
  276. var err error
  277. if err = binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil {
  278. return err
  279. }
  280. reader := f.r
  281. if !f.headerCompressionDisabled {
  282. err := f.uncorkHeaderDecompressor(int64(h.length - 4))
  283. if err != nil {
  284. return err
  285. }
  286. reader = f.headerDecompressor
  287. }
  288. frame.Headers, err = parseHeaderValueBlock(reader, frame.StreamId)
  289. if !f.headerCompressionDisabled && (err == io.EOF && f.headerReader.N == 0 || f.headerReader.N != 0) {
  290. err = &Error{WrongCompressedPayloadSize, 0}
  291. }
  292. if err != nil {
  293. return err
  294. }
  295. var invalidHeaders map[string]bool
  296. if frame.StreamId%2 == 0 {
  297. invalidHeaders = invalidReqHeaders
  298. } else {
  299. invalidHeaders = invalidRespHeaders
  300. }
  301. for h := range frame.Headers {
  302. if invalidHeaders[h] {
  303. return &Error{InvalidHeaderPresent, frame.StreamId}
  304. }
  305. }
  306. if frame.StreamId == 0 {
  307. return &Error{ZeroStreamId, 0}
  308. }
  309. return nil
  310. }
  311. func (f *Framer) parseDataFrame(streamId StreamId) (*DataFrame, error) {
  312. var length uint32
  313. if err := binary.Read(f.r, binary.BigEndian, &length); err != nil {
  314. return nil, err
  315. }
  316. var frame DataFrame
  317. frame.StreamId = streamId
  318. frame.Flags = DataFlags(length >> 24)
  319. length &= 0xffffff
  320. frame.Data = make([]byte, length)
  321. if _, err := io.ReadFull(f.r, frame.Data); err != nil {
  322. return nil, err
  323. }
  324. if frame.StreamId == 0 {
  325. return nil, &Error{ZeroStreamId, 0}
  326. }
  327. return &frame, nil
  328. }