decoder.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. package qpack
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "sync"
  7. "golang.org/x/net/http2/hpack"
  8. )
  9. // A decodingError is something the spec defines as a decoding error.
  10. type decodingError struct {
  11. err error
  12. }
  13. func (de decodingError) Error() string {
  14. return fmt.Sprintf("decoding error: %v", de.err)
  15. }
  16. // An invalidIndexError is returned when an encoder references a table
  17. // entry before the static table or after the end of the dynamic table.
  18. type invalidIndexError int
  19. func (e invalidIndexError) Error() string {
  20. return fmt.Sprintf("invalid indexed representation index %d", int(e))
  21. }
  22. var errNoDynamicTable = decodingError{errors.New("no dynamic table")}
  23. // errNeedMore is an internal sentinel error value that means the
  24. // buffer is truncated and we need to read more data before we can
  25. // continue parsing.
  26. var errNeedMore = errors.New("need more data")
  27. // A Decoder is the decoding context for incremental processing of
  28. // header blocks.
  29. type Decoder struct {
  30. mutex sync.Mutex
  31. emitFunc func(f HeaderField)
  32. readRequiredInsertCount bool
  33. readDeltaBase bool
  34. // buf is the unparsed buffer. It's only written to
  35. // saveBuf if it was truncated in the middle of a header
  36. // block. Because it's usually not owned, we can only
  37. // process it under Write.
  38. buf []byte // not owned; only valid during Write
  39. // saveBuf is previous data passed to Write which we weren't able
  40. // to fully parse before. Unlike buf, we own this data.
  41. saveBuf bytes.Buffer
  42. }
  43. // NewDecoder returns a new decoder
  44. // The emitFunc will be called for each valid field parsed,
  45. // in the same goroutine as calls to Write, before Write returns.
  46. func NewDecoder(emitFunc func(f HeaderField)) *Decoder {
  47. return &Decoder{emitFunc: emitFunc}
  48. }
  49. func (d *Decoder) Write(p []byte) (int, error) {
  50. if len(p) == 0 {
  51. return 0, nil
  52. }
  53. d.mutex.Lock()
  54. n, err := d.writeLocked(p)
  55. d.mutex.Unlock()
  56. return n, err
  57. }
  58. func (d *Decoder) writeLocked(p []byte) (int, error) {
  59. // Only copy the data if we have to. Optimistically assume
  60. // that p will contain a complete header block.
  61. if d.saveBuf.Len() == 0 {
  62. d.buf = p
  63. } else {
  64. d.saveBuf.Write(p)
  65. d.buf = d.saveBuf.Bytes()
  66. d.saveBuf.Reset()
  67. }
  68. if err := d.decode(); err != nil {
  69. if err != errNeedMore {
  70. return 0, err
  71. }
  72. // TODO: limit the size of the buffer
  73. d.saveBuf.Write(d.buf)
  74. }
  75. return len(p), nil
  76. }
  77. // DecodeFull decodes an entire block.
  78. func (d *Decoder) DecodeFull(p []byte) ([]HeaderField, error) {
  79. if len(p) == 0 {
  80. return []HeaderField{}, nil
  81. }
  82. d.mutex.Lock()
  83. defer d.mutex.Unlock()
  84. saveFunc := d.emitFunc
  85. defer func() { d.emitFunc = saveFunc }()
  86. var hf []HeaderField
  87. d.emitFunc = func(f HeaderField) { hf = append(hf, f) }
  88. if _, err := d.writeLocked(p); err != nil {
  89. return nil, err
  90. }
  91. if err := d.Close(); err != nil {
  92. return nil, err
  93. }
  94. return hf, nil
  95. }
  96. // Close declares that the decoding is complete and resets the Decoder
  97. // to be reused again for a new header block. If there is any remaining
  98. // data in the decoder's buffer, Close returns an error.
  99. func (d *Decoder) Close() error {
  100. if d.saveBuf.Len() > 0 {
  101. d.saveBuf.Reset()
  102. return decodingError{errors.New("truncated headers")}
  103. }
  104. d.readRequiredInsertCount = false
  105. d.readDeltaBase = false
  106. return nil
  107. }
  108. func (d *Decoder) decode() error {
  109. if !d.readRequiredInsertCount {
  110. requiredInsertCount, rest, err := readVarInt(8, d.buf)
  111. if err != nil {
  112. return err
  113. }
  114. d.readRequiredInsertCount = true
  115. if requiredInsertCount != 0 {
  116. return decodingError{errors.New("expected Required Insert Count to be zero")}
  117. }
  118. d.buf = rest
  119. }
  120. if !d.readDeltaBase {
  121. base, rest, err := readVarInt(7, d.buf)
  122. if err != nil {
  123. return err
  124. }
  125. d.readDeltaBase = true
  126. if base != 0 {
  127. return decodingError{errors.New("expected Base to be zero")}
  128. }
  129. d.buf = rest
  130. }
  131. if len(d.buf) == 0 {
  132. return errNeedMore
  133. }
  134. for len(d.buf) > 0 {
  135. b := d.buf[0]
  136. var err error
  137. switch {
  138. case b&0x80 > 0: // 1xxxxxxx
  139. err = d.parseIndexedHeaderField()
  140. case b&0xc0 == 0x40: // 01xxxxxx
  141. err = d.parseLiteralHeaderField()
  142. case b&0xe0 == 0x20: // 001xxxxx
  143. err = d.parseLiteralHeaderFieldWithoutNameReference()
  144. default:
  145. err = fmt.Errorf("unexpected type byte: %#x", b)
  146. }
  147. if err != nil {
  148. return err
  149. }
  150. }
  151. return nil
  152. }
  153. func (d *Decoder) parseIndexedHeaderField() error {
  154. buf := d.buf
  155. if buf[0]&0x40 == 0 {
  156. return errNoDynamicTable
  157. }
  158. index, buf, err := readVarInt(6, buf)
  159. if err != nil {
  160. return err
  161. }
  162. hf, ok := d.at(index)
  163. if !ok {
  164. return decodingError{invalidIndexError(index)}
  165. }
  166. d.emitFunc(hf)
  167. d.buf = buf
  168. return nil
  169. }
  170. func (d *Decoder) parseLiteralHeaderField() error {
  171. buf := d.buf
  172. if buf[0]&0x20 > 0 || buf[0]&0x10 == 0 {
  173. return errNoDynamicTable
  174. }
  175. index, buf, err := readVarInt(4, buf)
  176. if err != nil {
  177. return err
  178. }
  179. hf, ok := d.at(index)
  180. if !ok {
  181. return decodingError{invalidIndexError(index)}
  182. }
  183. if len(buf) == 0 {
  184. return errNeedMore
  185. }
  186. usesHuffman := buf[0]&0x80 > 0
  187. val, buf, err := d.readString(buf, 7, usesHuffman)
  188. if err != nil {
  189. return err
  190. }
  191. hf.Value = val
  192. d.emitFunc(hf)
  193. d.buf = buf
  194. return nil
  195. }
  196. func (d *Decoder) parseLiteralHeaderFieldWithoutNameReference() error {
  197. buf := d.buf
  198. usesHuffmanForName := buf[0]&0x8 > 0
  199. name, buf, err := d.readString(buf, 3, usesHuffmanForName)
  200. if err != nil {
  201. return err
  202. }
  203. if len(buf) == 0 {
  204. return errNeedMore
  205. }
  206. usesHuffmanForVal := buf[0]&0x80 > 0
  207. val, buf, err := d.readString(buf, 7, usesHuffmanForVal)
  208. if err != nil {
  209. return err
  210. }
  211. d.emitFunc(HeaderField{Name: name, Value: val})
  212. d.buf = buf
  213. return nil
  214. }
  215. func (d *Decoder) readString(buf []byte, n uint8, usesHuffman bool) (string, []byte, error) {
  216. l, buf, err := readVarInt(n, buf)
  217. if err != nil {
  218. return "", nil, err
  219. }
  220. if uint64(len(buf)) < l {
  221. return "", nil, errNeedMore
  222. }
  223. var val string
  224. if usesHuffman {
  225. var err error
  226. val, err = hpack.HuffmanDecodeToString(buf[:l])
  227. if err != nil {
  228. return "", nil, err
  229. }
  230. } else {
  231. val = string(buf[:l])
  232. }
  233. buf = buf[l:]
  234. return val, buf, nil
  235. }
  236. func (d *Decoder) at(i uint64) (hf HeaderField, ok bool) {
  237. if i >= uint64(len(staticTableEntries)) {
  238. return
  239. }
  240. return staticTableEntries[i], true
  241. }