4 "github.com/philhofer/fwd"
11 // where we keep old *Readers
12 var readerPool = sync.Pool{New: func() interface{} { return &Reader{} }}
14 // Type is a MessagePack wire type,
15 // including this package's built-in
21 // The zero value of Type
24 InvalidType Type = iota
26 // MessagePack built-in types
40 // pseudo-types provided
50 // String implements fmt.Stringer
51 func (t Type) String() string {
80 func freeR(m *Reader) {
84 // Unmarshaler is the interface fulfilled
85 // by objects that know how to unmarshal
86 // themselves from MessagePack.
87 // UnmarshalMsg unmarshals the object
88 // from binary, returing any leftover
89 // bytes and any errors encountered.
90 type Unmarshaler interface {
91 UnmarshalMsg([]byte) ([]byte, error)
94 // Decodable is the interface fulfilled
95 // by objects that know how to read
96 // themselves from a *Reader.
97 type Decodable interface {
98 DecodeMsg(*Reader) error
101 // Decode decodes 'd' from 'r'.
102 func Decode(r io.Reader, d Decodable) error {
104 err := d.DecodeMsg(rd)
109 // NewReader returns a *Reader that
110 // reads from the provided reader. The
111 // reader will be buffered.
112 func NewReader(r io.Reader) *Reader {
113 p := readerPool.Get().(*Reader)
115 p.r = fwd.NewReader(r)
122 // NewReaderSize returns a *Reader with a buffer of the given size.
123 // (This is vastly preferable to passing the decoder a reader that is already buffered.)
124 func NewReaderSize(r io.Reader, sz int) *Reader {
125 return &Reader{r: fwd.NewReaderSize(r, sz)}
128 // Reader wraps an io.Reader and provides
129 // methods to read MessagePack-encoded values
130 // from it. Readers are buffered.
136 // Read implements `io.Reader`
137 func (m *Reader) Read(p []byte) (int, error) {
141 // ReadFull implements `io.ReadFull`
142 func (m *Reader) ReadFull(p []byte) (int, error) {
143 return m.r.ReadFull(p)
146 // Reset resets the underlying reader.
147 func (m *Reader) Reset(r io.Reader) { m.r.Reset(r) }
149 // Buffered returns the number of bytes currently in the read buffer.
150 func (m *Reader) Buffered() int { return m.r.Buffered() }
152 // BufferSize returns the capacity of the read buffer.
153 func (m *Reader) BufferSize() int { return m.r.BufferSize() }
155 // NextType returns the next object type to be decoded.
156 func (m *Reader) NextType() (Type, error) {
157 p, err := m.r.Peek(1)
159 return InvalidType, err
162 if t == InvalidType {
163 return t, InvalidPrefixError(p[0])
165 if t == ExtensionType {
166 v, err := m.peekExtensionType()
168 return InvalidType, err
171 case Complex64Extension:
172 return Complex64Type, nil
173 case Complex128Extension:
174 return Complex128Type, nil
182 // IsNil returns whether or not
183 // the next byte is a null messagepack byte
184 func (m *Reader) IsNil() bool {
185 p, err := m.r.Peek(1)
186 return err == nil && p[0] == mnil
189 // returns (obj size, obj elements, error)
190 // only maps and arrays have non-zero obj elements
192 // use uintptr b/c it's guaranteed to be large enough
193 // to hold whatever we can fit in memory.
194 func getNextSize(r *fwd.Reader) (uintptr, uintptr, error) {
201 size, mode := spec.size, spec.extra
203 return 0, 0, InvalidPrefixError(lead)
206 return uintptr(size), uintptr(mode), nil
208 b, err = r.Peek(int(size))
214 return uintptr(size) + uintptr(b[1]), 0, nil
216 return uintptr(size) + uintptr(big.Uint16(b[1:])), 0, nil
218 return uintptr(size) + uintptr(big.Uint32(b[1:])), 0, nil
220 return uintptr(size), 2 * uintptr(big.Uint16(b[1:])), nil
222 return uintptr(size), 2 * uintptr(big.Uint32(b[1:])), nil
224 return uintptr(size), uintptr(big.Uint16(b[1:])), nil
226 return uintptr(size), uintptr(big.Uint32(b[1:])), nil
232 // Skip skips over the next object, regardless of
233 // its type. If it is an array or map, the whole array
234 // or map will be skipped.
235 func (m *Reader) Skip() error {
243 // we can use the faster
244 // method if we have enough
246 if m.r.Buffered() >= 5 {
251 v, o, err = getSize(p)
256 v, o, err = getNextSize(m.r)
262 // 'v' is always non-zero
264 _, err = m.r.Skip(int(v))
269 // for maps and slices, skip elements
270 for x := uintptr(0); x < o; x++ {
279 // ReadMapHeader reads the next object
280 // as a map header and returns the size
281 // of the map and the number of bytes written.
282 // It will return a TypeError{} if the next
283 // object is not a map.
284 func (m *Reader) ReadMapHeader() (sz uint32, err error) {
293 sz = uint32(rfixmap(lead))
303 sz = uint32(big.Uint16(p[1:]))
310 sz = big.Uint32(p[1:])
313 err = badPrefix(MapType, lead)
318 // ReadMapKey reads either a 'str' or 'bin' field from
319 // the reader and returns the value as a []byte. It uses
320 // scratch for storage if it is large enough.
321 func (m *Reader) ReadMapKey(scratch []byte) ([]byte, error) {
322 out, err := m.ReadStringAsBytes(scratch)
324 if tperr, ok := err.(TypeError); ok && tperr.Encoded == BinType {
325 return m.ReadBytes(scratch)
332 // MapKeyPtr returns a []byte pointing to the contents
333 // of a valid map key. The key cannot be empty, and it
334 // must be shorter than the total buffer size of the
335 // *Reader. Additionally, the returned slice is only
336 // valid until the next *Reader method call. Users
337 // should exercise extreme care when using this
338 // method; writing into the returned slice may
339 // corrupt future reads.
340 func (m *Reader) ReadMapKeyPtr() ([]byte, error) {
341 p, err := m.r.Peek(1)
348 read = int(rfixstr(lead))
364 read = int(big.Uint16(p[1:]))
370 read = int(big.Uint32(p[1:]))
372 return nil, badPrefix(StrType, lead)
376 return nil, ErrShortBytes
378 return m.r.Next(read)
381 // ReadArrayHeader reads the next object as an
382 // array header and returns the size of the array
383 // and the number of bytes read.
384 func (m *Reader) ReadArrayHeader() (sz uint32, err error) {
392 if isfixarray(lead) {
393 sz = uint32(rfixarray(lead))
403 sz = uint32(big.Uint16(p[1:]))
411 sz = big.Uint32(p[1:])
415 err = badPrefix(ArrayType, lead)
420 // ReadNil reads a 'nil' MessagePack byte from the reader
421 func (m *Reader) ReadNil() error {
422 p, err := m.r.Peek(1)
427 return badPrefix(NilType, p[0])
433 // ReadFloat64 reads a float64 from the reader.
434 // (If the value on the wire is encoded as a float32,
435 // it will be up-cast to a float64.)
436 func (m *Reader) ReadFloat64() (f float64, err error) {
440 // we'll allow a coversion from float32 to float64,
441 // since we don't lose any precision
442 if err == io.EOF && len(p) > 0 && p[0] == mfloat32 {
443 ef, err := m.ReadFloat32()
444 return float64(ef), err
448 if p[0] != mfloat64 {
450 if p[0] == mfloat32 {
451 ef, err := m.ReadFloat32()
452 return float64(ef), err
454 err = badPrefix(Float64Type, p[0])
457 f = math.Float64frombits(getMuint64(p))
462 // ReadFloat32 reads a float32 from the reader
463 func (m *Reader) ReadFloat32() (f float32, err error) {
469 if p[0] != mfloat32 {
470 err = badPrefix(Float32Type, p[0])
473 f = math.Float32frombits(getMuint32(p))
478 // ReadBool reads a bool from the reader
479 func (m *Reader) ReadBool() (b bool, err error) {
490 err = badPrefix(BoolType, p[0])
497 // ReadInt64 reads an int64 from the reader
498 func (m *Reader) ReadInt64() (i int64, err error) {
508 i = int64(rfixint(lead))
511 } else if isnfixint(lead) {
512 i = int64(rnfixint(lead))
523 i = int64(getMint8(p))
531 i = int64(getMint16(p))
539 i = int64(getMint32(p))
551 err = badPrefix(IntType, lead)
556 // ReadInt32 reads an int32 from the reader
557 func (m *Reader) ReadInt32() (i int32, err error) {
559 in, err = m.ReadInt64()
560 if in > math.MaxInt32 || in < math.MinInt32 {
561 err = IntOverflow{Value: in, FailedBitsize: 32}
568 // ReadInt16 reads an int16 from the reader
569 func (m *Reader) ReadInt16() (i int16, err error) {
571 in, err = m.ReadInt64()
572 if in > math.MaxInt16 || in < math.MinInt16 {
573 err = IntOverflow{Value: in, FailedBitsize: 16}
580 // ReadInt8 reads an int8 from the reader
581 func (m *Reader) ReadInt8() (i int8, err error) {
583 in, err = m.ReadInt64()
584 if in > math.MaxInt8 || in < math.MinInt8 {
585 err = IntOverflow{Value: in, FailedBitsize: 8}
592 // ReadInt reads an int from the reader
593 func (m *Reader) ReadInt() (i int, err error) {
596 in, err = m.ReadInt32()
601 in, err = m.ReadInt64()
606 // ReadUint64 reads a uint64 from the reader
607 func (m *Reader) ReadUint64() (u uint64, err error) {
616 u = uint64(rfixint(lead))
626 u = uint64(getMuint8(p))
634 u = uint64(getMuint16(p))
642 u = uint64(getMuint32(p))
654 err = badPrefix(UintType, lead)
660 // ReadUint32 reads a uint32 from the reader
661 func (m *Reader) ReadUint32() (u uint32, err error) {
663 in, err = m.ReadUint64()
664 if in > math.MaxUint32 {
665 err = UintOverflow{Value: in, FailedBitsize: 32}
672 // ReadUint16 reads a uint16 from the reader
673 func (m *Reader) ReadUint16() (u uint16, err error) {
675 in, err = m.ReadUint64()
676 if in > math.MaxUint16 {
677 err = UintOverflow{Value: in, FailedBitsize: 16}
684 // ReadUint8 reads a uint8 from the reader
685 func (m *Reader) ReadUint8() (u uint8, err error) {
687 in, err = m.ReadUint64()
688 if in > math.MaxUint8 {
689 err = UintOverflow{Value: in, FailedBitsize: 8}
696 // ReadUint reads a uint from the reader
697 func (m *Reader) ReadUint() (u uint, err error) {
700 un, err = m.ReadUint32()
705 un, err = m.ReadUint64()
710 func (m *Reader) ReadByte() (b byte, err error) {
712 in, err = m.ReadUint64()
713 if in > math.MaxUint8 {
714 err = UintOverflow{Value: in, FailedBitsize: 8}
721 // ReadBytes reads a MessagePack 'bin' object
722 // from the reader and returns its value. It may
723 // use 'scratch' for storage if it is non-nil.
724 func (m *Reader) ReadBytes(scratch []byte) (b []byte, err error) {
742 read = int64(big.Uint16(p[1:]))
748 read = int64(big.Uint32(p[1:]))
750 err = badPrefix(BinType, lead)
753 if int64(cap(scratch)) < read {
754 b = make([]byte, read)
758 _, err = m.r.ReadFull(b)
762 // ReadExactBytes reads a MessagePack 'bin'-encoded
763 // object off of the wire into the provided slice. An
764 // ArrayError will be returned if the object is not
765 // exactly the length of the input slice.
766 func (m *Reader) ReadExactBytes(into []byte) error {
767 p, err := m.r.Peek(2)
772 var read int64 // bytes to read
773 var skip int // prefix size to skip
783 read = int64(big.Uint16(p[1:]))
790 read = int64(big.Uint32(p[1:]))
793 return badPrefix(BinType, lead)
795 if read != int64(len(into)) {
796 return ArrayError{Wanted: uint32(len(into)), Got: uint32(read)}
799 _, err = m.r.ReadFull(into)
803 // ReadStringAsBytes reads a MessagePack 'str' (utf-8) string
804 // and returns its value as bytes. It may use 'scratch' for storage
806 func (m *Reader) ReadStringAsBytes(scratch []byte) (b []byte, err error) {
817 read = int64(rfixstr(lead))
828 read = int64(uint8(p[1]))
834 read = int64(big.Uint16(p[1:]))
840 read = int64(big.Uint32(p[1:]))
842 err = badPrefix(StrType, lead)
846 if int64(cap(scratch)) < read {
847 b = make([]byte, read)
851 _, err = m.r.ReadFull(b)
855 // ReadString reads a utf-8 string from the reader
856 func (m *Reader) ReadString() (s string, err error) {
867 read = int64(rfixstr(lead))
878 read = int64(uint8(p[1]))
884 read = int64(big.Uint16(p[1:]))
890 read = int64(big.Uint32(p[1:]))
892 err = badPrefix(StrType, lead)
900 // reading into the memory
901 // that will become the string
902 // itself has vastly superior
903 // worst-case performance, because
904 // the reader buffer doesn't have
905 // to be large enough to hold the string.
906 // the idea here is to make it more
907 // difficult for someone malicious
908 // to cause the system to run out of
909 // memory by sending very large strings.
911 // NOTE: this works because the argument
912 // passed to (*fwd.Reader).ReadFull escapes
913 // to the heap; its argument may, in turn,
914 // be passed to the underlying reader, and
915 // thus escape analysis *must* conclude that
917 out := make([]byte, read)
918 _, err = m.r.ReadFull(out)
922 s = UnsafeString(out)
926 // ReadComplex64 reads a complex64 from the reader
927 func (m *Reader) ReadComplex64() (f complex64, err error) {
929 p, err = m.r.Peek(10)
933 if p[0] != mfixext8 {
934 err = badPrefix(Complex64Type, p[0])
937 if int8(p[1]) != Complex64Extension {
938 err = errExt(int8(p[1]), Complex64Extension)
941 f = complex(math.Float32frombits(big.Uint32(p[2:])),
942 math.Float32frombits(big.Uint32(p[6:])))
943 _, err = m.r.Skip(10)
947 // ReadComplex128 reads a complex128 from the reader
948 func (m *Reader) ReadComplex128() (f complex128, err error) {
950 p, err = m.r.Peek(18)
954 if p[0] != mfixext16 {
955 err = badPrefix(Complex128Type, p[0])
958 if int8(p[1]) != Complex128Extension {
959 err = errExt(int8(p[1]), Complex128Extension)
962 f = complex(math.Float64frombits(big.Uint64(p[2:])),
963 math.Float64frombits(big.Uint64(p[10:])))
964 _, err = m.r.Skip(18)
968 // ReadMapStrIntf reads a MessagePack map into a map[string]interface{}.
969 // (You must pass a non-nil map into the function.)
970 func (m *Reader) ReadMapStrIntf(mp map[string]interface{}) (err error) {
972 sz, err = m.ReadMapHeader()
976 for key := range mp {
979 for i := uint32(0); i < sz; i++ {
982 key, err = m.ReadString()
986 val, err = m.ReadIntf()
995 // ReadTime reads a time.Time object from the reader.
996 // The returned time's location will be set to time.Local.
997 func (m *Reader) ReadTime() (t time.Time, err error) {
999 p, err = m.r.Peek(15)
1003 if p[0] != mext8 || p[1] != 12 {
1004 err = badPrefix(TimeType, p[0])
1007 if int8(p[2]) != TimeExtension {
1008 err = errExt(int8(p[2]), TimeExtension)
1011 sec, nsec := getUnix(p[3:])
1012 t = time.Unix(sec, int64(nsec)).Local()
1013 _, err = m.r.Skip(15)
1017 // ReadIntf reads out the next object as a raw interface{}.
1018 // Arrays are decoded as []interface{}, and maps are decoded
1019 // as map[string]interface{}. Integers are decoded as int64
1020 // and unsigned integers are decoded as uint64.
1021 func (m *Reader) ReadIntf() (i interface{}, err error) {
1023 t, err = m.NextType()
1029 i, err = m.ReadBool()
1033 i, err = m.ReadInt64()
1037 i, err = m.ReadUint64()
1041 i, err = m.ReadBytes(nil)
1045 i, err = m.ReadString()
1049 i, err = m.ReadComplex64()
1052 case Complex128Type:
1053 i, err = m.ReadComplex128()
1057 i, err = m.ReadTime()
1062 t, err = m.peekExtensionType()
1066 f, ok := extensionReg[t]
1069 err = m.ReadExtension(e)
1075 err = m.ReadExtension(&e)
1080 mp := make(map[string]interface{})
1081 err = m.ReadMapStrIntf(mp)
1091 i, err = m.ReadFloat32()
1095 i, err = m.ReadFloat64()
1100 sz, err = m.ReadArrayHeader()
1105 out := make([]interface{}, int(sz))
1106 for j := range out {
1107 out[j], err = m.ReadIntf()
1116 return nil, fatal // unreachable