read.go 9.1 KB

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