read.go 8.6 KB

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