stream.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. // Copyright (c) Faye Amacker. All rights reserved.
  2. // Licensed under the MIT License. See LICENSE in the project root for license information.
  3. package cbor
  4. import (
  5. "bytes"
  6. "errors"
  7. "io"
  8. "reflect"
  9. )
  10. // Decoder reads and decodes CBOR values from io.Reader.
  11. type Decoder struct {
  12. r io.Reader
  13. d decoder
  14. buf []byte
  15. off int // next read offset in buf
  16. bytesRead int
  17. }
  18. // NewDecoder returns a new decoder that reads and decodes from r using
  19. // the default decoding options.
  20. func NewDecoder(r io.Reader) *Decoder {
  21. return defaultDecMode.NewDecoder(r)
  22. }
  23. // Decode reads CBOR value and decodes it into the value pointed to by v.
  24. func (dec *Decoder) Decode(v any) error {
  25. _, err := dec.readNext()
  26. if err != nil {
  27. // Return validation error or read error.
  28. return err
  29. }
  30. dec.d.reset(dec.buf[dec.off:])
  31. err = dec.d.value(v)
  32. // Increment dec.off even if decoding err is not nil because
  33. // dec.d.off points to the next CBOR data item if current
  34. // CBOR data item is valid but failed to be decoded into v.
  35. // This allows next CBOR data item to be decoded in next
  36. // call to this function.
  37. dec.off += dec.d.off
  38. dec.bytesRead += dec.d.off
  39. return err
  40. }
  41. // Skip skips to the next CBOR data item (if there is any),
  42. // otherwise it returns error such as io.EOF, io.UnexpectedEOF, etc.
  43. func (dec *Decoder) Skip() error {
  44. n, err := dec.readNext()
  45. if err != nil {
  46. // Return validation error or read error.
  47. return err
  48. }
  49. dec.off += n
  50. dec.bytesRead += n
  51. return nil
  52. }
  53. // NumBytesRead returns the number of bytes read.
  54. func (dec *Decoder) NumBytesRead() int {
  55. return dec.bytesRead
  56. }
  57. // Buffered returns a reader for data remaining in Decoder's buffer.
  58. // Returned reader is valid until the next call to Decode or Skip.
  59. func (dec *Decoder) Buffered() io.Reader {
  60. return bytes.NewReader(dec.buf[dec.off:])
  61. }
  62. // readNext() reads next CBOR data item from Reader to buffer.
  63. // It returns the size of next CBOR data item.
  64. // It also returns validation error or read error if any.
  65. func (dec *Decoder) readNext() (int, error) {
  66. var readErr error
  67. var validErr error
  68. for {
  69. // Process any unread data in dec.buf.
  70. if dec.off < len(dec.buf) {
  71. dec.d.reset(dec.buf[dec.off:])
  72. off := dec.off // Save offset before data validation
  73. validErr = dec.d.wellformed(true, false)
  74. dec.off = off // Restore offset
  75. if validErr == nil {
  76. return dec.d.off, nil
  77. }
  78. if validErr != io.ErrUnexpectedEOF {
  79. return 0, validErr
  80. }
  81. // Process last read error on io.ErrUnexpectedEOF.
  82. if readErr != nil {
  83. if readErr == io.EOF {
  84. // current CBOR data item is incomplete.
  85. return 0, io.ErrUnexpectedEOF
  86. }
  87. return 0, readErr
  88. }
  89. }
  90. // More data is needed and there was no read error.
  91. var n int
  92. for n == 0 {
  93. n, readErr = dec.read()
  94. if n == 0 && readErr != nil {
  95. // No more data can be read and read error is encountered.
  96. // At this point, validErr is either nil or io.ErrUnexpectedEOF.
  97. if readErr == io.EOF {
  98. if validErr == io.ErrUnexpectedEOF {
  99. // current CBOR data item is incomplete.
  100. return 0, io.ErrUnexpectedEOF
  101. }
  102. }
  103. return 0, readErr
  104. }
  105. }
  106. // At this point, dec.buf contains new data from last read (n > 0).
  107. }
  108. }
  109. // read() reads data from Reader to buffer.
  110. // It returns number of bytes read and any read error encountered.
  111. // Postconditions:
  112. // - dec.buf contains previously unread data and new data.
  113. // - dec.off is 0.
  114. func (dec *Decoder) read() (int, error) {
  115. // Grow buf if needed.
  116. const minRead = 512
  117. if cap(dec.buf)-len(dec.buf)+dec.off < minRead {
  118. oldUnreadBuf := dec.buf[dec.off:]
  119. dec.buf = make([]byte, len(dec.buf)-dec.off, 2*cap(dec.buf)+minRead)
  120. dec.overwriteBuf(oldUnreadBuf)
  121. }
  122. // Copy unread data over read data and reset off to 0.
  123. if dec.off > 0 {
  124. dec.overwriteBuf(dec.buf[dec.off:])
  125. }
  126. // Read from reader and reslice buf.
  127. n, err := dec.r.Read(dec.buf[len(dec.buf):cap(dec.buf)])
  128. dec.buf = dec.buf[0 : len(dec.buf)+n]
  129. return n, err
  130. }
  131. func (dec *Decoder) overwriteBuf(newBuf []byte) {
  132. n := copy(dec.buf, newBuf)
  133. dec.buf = dec.buf[:n]
  134. dec.off = 0
  135. }
  136. // Encoder writes CBOR values to io.Writer.
  137. type Encoder struct {
  138. w io.Writer
  139. em *encMode
  140. indefTypes []cborType
  141. }
  142. // NewEncoder returns a new encoder that writes to w using the default encoding options.
  143. func NewEncoder(w io.Writer) *Encoder {
  144. return defaultEncMode.NewEncoder(w)
  145. }
  146. // Encode writes the CBOR encoding of v.
  147. func (enc *Encoder) Encode(v any) error {
  148. if len(enc.indefTypes) > 0 && v != nil {
  149. indefType := enc.indefTypes[len(enc.indefTypes)-1]
  150. if indefType == cborTypeTextString {
  151. k := reflect.TypeOf(v).Kind()
  152. if k != reflect.String {
  153. return errors.New("cbor: cannot encode item type " + k.String() + " for indefinite-length text string")
  154. }
  155. } else if indefType == cborTypeByteString {
  156. t := reflect.TypeOf(v)
  157. k := t.Kind()
  158. if (k != reflect.Array && k != reflect.Slice) || t.Elem().Kind() != reflect.Uint8 {
  159. return errors.New("cbor: cannot encode item type " + k.String() + " for indefinite-length byte string")
  160. }
  161. }
  162. }
  163. buf := getEncodeBuffer()
  164. err := encode(buf, enc.em, reflect.ValueOf(v))
  165. if err == nil {
  166. _, err = enc.w.Write(buf.Bytes())
  167. }
  168. putEncodeBuffer(buf)
  169. return err
  170. }
  171. // StartIndefiniteByteString starts byte string encoding of indefinite length.
  172. // Subsequent calls of (*Encoder).Encode() encodes definite length byte strings
  173. // ("chunks") as one contiguous string until EndIndefinite is called.
  174. func (enc *Encoder) StartIndefiniteByteString() error {
  175. return enc.startIndefinite(cborTypeByteString)
  176. }
  177. // StartIndefiniteTextString starts text string encoding of indefinite length.
  178. // Subsequent calls of (*Encoder).Encode() encodes definite length text strings
  179. // ("chunks") as one contiguous string until EndIndefinite is called.
  180. func (enc *Encoder) StartIndefiniteTextString() error {
  181. return enc.startIndefinite(cborTypeTextString)
  182. }
  183. // StartIndefiniteArray starts array encoding of indefinite length.
  184. // Subsequent calls of (*Encoder).Encode() encodes elements of the array
  185. // until EndIndefinite is called.
  186. func (enc *Encoder) StartIndefiniteArray() error {
  187. return enc.startIndefinite(cborTypeArray)
  188. }
  189. // StartIndefiniteMap starts array encoding of indefinite length.
  190. // Subsequent calls of (*Encoder).Encode() encodes elements of the map
  191. // until EndIndefinite is called.
  192. func (enc *Encoder) StartIndefiniteMap() error {
  193. return enc.startIndefinite(cborTypeMap)
  194. }
  195. // EndIndefinite closes last opened indefinite length value.
  196. func (enc *Encoder) EndIndefinite() error {
  197. if len(enc.indefTypes) == 0 {
  198. return errors.New("cbor: cannot encode \"break\" code outside indefinite length values")
  199. }
  200. _, err := enc.w.Write([]byte{cborBreakFlag})
  201. if err == nil {
  202. enc.indefTypes = enc.indefTypes[:len(enc.indefTypes)-1]
  203. }
  204. return err
  205. }
  206. var cborIndefHeader = map[cborType][]byte{
  207. cborTypeByteString: {cborByteStringWithIndefiniteLengthHead},
  208. cborTypeTextString: {cborTextStringWithIndefiniteLengthHead},
  209. cborTypeArray: {cborArrayWithIndefiniteLengthHead},
  210. cborTypeMap: {cborMapWithIndefiniteLengthHead},
  211. }
  212. func (enc *Encoder) startIndefinite(typ cborType) error {
  213. if enc.em.indefLength == IndefLengthForbidden {
  214. return &IndefiniteLengthError{typ}
  215. }
  216. _, err := enc.w.Write(cborIndefHeader[typ])
  217. if err == nil {
  218. enc.indefTypes = append(enc.indefTypes, typ)
  219. }
  220. return err
  221. }
  222. // RawMessage is a raw encoded CBOR value.
  223. type RawMessage []byte
  224. // MarshalCBOR returns m or CBOR nil if m is nil.
  225. func (m RawMessage) MarshalCBOR() ([]byte, error) {
  226. if len(m) == 0 {
  227. return cborNil, nil
  228. }
  229. return m, nil
  230. }
  231. // UnmarshalCBOR creates a copy of data and saves to *m.
  232. func (m *RawMessage) UnmarshalCBOR(data []byte) error {
  233. if m == nil {
  234. return errors.New("cbor.RawMessage: UnmarshalCBOR on nil pointer")
  235. }
  236. *m = append((*m)[0:0], data...)
  237. return nil
  238. }