1
// Copyright (c) 2012-2020 Ugorji Nwoke. All rights reserved.
2
// Use of this source code is governed by a MIT license found in the LICENSE file.
5
Msgpack-c implementation powers the c, c++, python, ruby, etc libraries.
6
We need to maintain compatibility with it and how it encodes integer values
7
without caring about the type.
9
For compatibility with behaviour of msgpack-c reference implementation:
10
- Go intX (>0) and uintX
12
msgpack +ve fixnum, unsigned
15
msgpack -ve fixnum, signed
31
mpPosFixNumMin byte = 0x00
32
mpPosFixNumMax byte = 0x7f
33
mpFixMapMin byte = 0x80
34
mpFixMapMax byte = 0x8f
35
mpFixArrayMin byte = 0x90
36
mpFixArrayMax byte = 0x9f
37
mpFixStrMin byte = 0xa0
38
mpFixStrMax byte = 0xbf
65
mpFixExt16 byte = 0xd8
67
mpStr8 byte = 0xd9 // new
77
mpNegFixNumMin byte = 0xe0
78
mpNegFixNumMax byte = 0xff
81
var mpTimeExtTag int8 = -1
82
var mpTimeExtTagU = uint8(mpTimeExtTag)
84
var mpdescNames = map[byte]string{
99
mpStr8: "string|bytes",
100
mpStr16: "string|bytes",
101
mpStr32: "string|bytes",
114
func mpdesc(bd byte) (s string) {
118
case bd >= mpPosFixNumMin && bd <= mpPosFixNumMax,
119
bd >= mpNegFixNumMin && bd <= mpNegFixNumMax:
121
case bd >= mpFixStrMin && bd <= mpFixStrMax:
123
case bd >= mpFixArrayMin && bd <= mpFixArrayMax:
125
case bd >= mpFixMapMin && bd <= mpFixMapMax:
127
case bd >= mpFixExt1 && bd <= mpFixExt16,
128
bd >= mpExt8 && bd <= mpExt32:
137
// MsgpackSpecRpcMultiArgs is a special type which signifies to the MsgpackSpecRpcCodec
138
// that the backend RPC service takes multiple arguments, which have been arranged
139
// in sequence in the slice.
141
// The Codec then passes it AS-IS to the rpc service (without wrapping it in an
142
// array of 1 element).
143
type MsgpackSpecRpcMultiArgs []interface{}
145
// A MsgpackContainer type specifies the different types of msgpackContainers.
146
type msgpackContainerType struct {
147
fixCutoff, bFixMin, b8, b16, b32 byte
148
// hasFixMin, has8, has8Always bool
152
msgpackContainerRawLegacy = msgpackContainerType{
153
32, mpFixStrMin, 0, mpStr16, mpStr32,
155
msgpackContainerStr = msgpackContainerType{
156
32, mpFixStrMin, mpStr8, mpStr16, mpStr32, // true, true, false,
158
msgpackContainerBin = msgpackContainerType{
159
0, 0, mpBin8, mpBin16, mpBin32, // false, true, true,
161
msgpackContainerList = msgpackContainerType{
162
16, mpFixArrayMin, 0, mpArray16, mpArray32, // true, false, false,
164
msgpackContainerMap = msgpackContainerType{
165
16, mpFixMapMin, 0, mpMap16, mpMap32, // true, false, false,
169
//---------------------------------------------
171
type msgpackEncDriver struct {
173
encDriverNoopContainerWriter
180
func (e *msgpackEncDriver) encoder() *Encoder {
184
func (e *msgpackEncDriver) EncodeNil() {
185
e.e.encWr.writen1(mpNil)
188
func (e *msgpackEncDriver) EncodeInt(i int64) {
189
if e.h.PositiveIntUnsigned && i >= 0 {
190
e.EncodeUint(uint64(i))
191
} else if i > math.MaxInt8 {
192
if i <= math.MaxInt16 {
193
e.e.encWr.writen1(mpInt16)
194
bigen.writeUint16(e.e.w(), uint16(i))
195
} else if i <= math.MaxInt32 {
196
e.e.encWr.writen1(mpInt32)
197
bigen.writeUint32(e.e.w(), uint32(i))
199
e.e.encWr.writen1(mpInt64)
200
bigen.writeUint64(e.e.w(), uint64(i))
204
e.e.encWr.writen2(mpInt8, byte(i))
206
e.e.encWr.writen1(byte(i))
208
} else if i >= math.MinInt8 {
209
e.e.encWr.writen2(mpInt8, byte(i))
210
} else if i >= math.MinInt16 {
211
e.e.encWr.writen1(mpInt16)
212
bigen.writeUint16(e.e.w(), uint16(i))
213
} else if i >= math.MinInt32 {
214
e.e.encWr.writen1(mpInt32)
215
bigen.writeUint32(e.e.w(), uint32(i))
217
e.e.encWr.writen1(mpInt64)
218
bigen.writeUint64(e.e.w(), uint64(i))
222
func (e *msgpackEncDriver) EncodeUint(i uint64) {
223
if i <= math.MaxInt8 {
225
e.e.encWr.writen2(mpUint8, byte(i))
227
e.e.encWr.writen1(byte(i))
229
} else if i <= math.MaxUint8 {
230
e.e.encWr.writen2(mpUint8, byte(i))
231
} else if i <= math.MaxUint16 {
232
e.e.encWr.writen1(mpUint16)
233
bigen.writeUint16(e.e.w(), uint16(i))
234
} else if i <= math.MaxUint32 {
235
e.e.encWr.writen1(mpUint32)
236
bigen.writeUint32(e.e.w(), uint32(i))
238
e.e.encWr.writen1(mpUint64)
239
bigen.writeUint64(e.e.w(), uint64(i))
243
func (e *msgpackEncDriver) EncodeBool(b bool) {
245
e.e.encWr.writen1(mpTrue)
247
e.e.encWr.writen1(mpFalse)
251
func (e *msgpackEncDriver) EncodeFloat32(f float32) {
252
e.e.encWr.writen1(mpFloat)
253
bigen.writeUint32(e.e.w(), math.Float32bits(f))
256
func (e *msgpackEncDriver) EncodeFloat64(f float64) {
257
e.e.encWr.writen1(mpDouble)
258
bigen.writeUint64(e.e.w(), math.Float64bits(f))
261
func (e *msgpackEncDriver) EncodeTime(t time.Time) {
267
sec, nsec := t.Unix(), uint64(t.Nanosecond())
270
if sec >= 0 && sec>>34 == 0 {
271
data64 = (nsec << 34) | uint64(sec)
272
if data64&0xffffffff00000000 != 0 {
279
e.encodeExtPreamble(mpTimeExtTagU, l)
281
e.writeContainerLen(msgpackContainerRawLegacy, l)
285
bigen.writeUint32(e.e.w(), uint32(data64))
287
bigen.writeUint64(e.e.w(), data64)
289
bigen.writeUint32(e.e.w(), uint32(nsec))
290
bigen.writeUint64(e.e.w(), uint64(sec))
294
func (e *msgpackEncDriver) EncodeExt(v interface{}, basetype reflect.Type, xtag uint64, ext Ext) {
297
bs0 = e.e.blist.get(1024)
299
e.e.sideEncode(v, basetype, &bs)
308
e.encodeExtPreamble(uint8(xtag), len(bs))
311
e.EncodeStringBytesRaw(bs)
316
if !byteSliceSameData(bs0, bs) {
322
func (e *msgpackEncDriver) EncodeRawExt(re *RawExt) {
323
e.encodeExtPreamble(uint8(re.Tag), len(re.Data))
324
e.e.encWr.writeb(re.Data)
327
func (e *msgpackEncDriver) encodeExtPreamble(xtag byte, l int) {
329
e.e.encWr.writen2(mpFixExt1, xtag)
331
e.e.encWr.writen2(mpFixExt2, xtag)
333
e.e.encWr.writen2(mpFixExt4, xtag)
335
e.e.encWr.writen2(mpFixExt8, xtag)
337
e.e.encWr.writen2(mpFixExt16, xtag)
339
e.e.encWr.writen2(mpExt8, byte(l))
340
e.e.encWr.writen1(xtag)
341
} else if l < 65536 {
342
e.e.encWr.writen1(mpExt16)
343
bigen.writeUint16(e.e.w(), uint16(l))
344
e.e.encWr.writen1(xtag)
346
e.e.encWr.writen1(mpExt32)
347
bigen.writeUint32(e.e.w(), uint32(l))
348
e.e.encWr.writen1(xtag)
352
func (e *msgpackEncDriver) WriteArrayStart(length int) {
353
e.writeContainerLen(msgpackContainerList, length)
356
func (e *msgpackEncDriver) WriteMapStart(length int) {
357
e.writeContainerLen(msgpackContainerMap, length)
360
func (e *msgpackEncDriver) EncodeString(s string) {
361
var ct msgpackContainerType
364
ct = msgpackContainerBin
366
ct = msgpackContainerStr
369
ct = msgpackContainerRawLegacy
371
e.writeContainerLen(ct, len(s))
373
e.e.encWr.writestr(s)
377
func (e *msgpackEncDriver) EncodeStringBytesRaw(bs []byte) {
383
e.writeContainerLen(msgpackContainerBin, len(bs))
385
e.writeContainerLen(msgpackContainerRawLegacy, len(bs))
392
func (e *msgpackEncDriver) writeContainerLen(ct msgpackContainerType, l int) {
393
if ct.fixCutoff > 0 && l < int(ct.fixCutoff) {
394
e.e.encWr.writen1(ct.bFixMin | byte(l))
395
} else if ct.b8 > 0 && l < 256 {
396
e.e.encWr.writen2(ct.b8, uint8(l))
397
} else if l < 65536 {
398
e.e.encWr.writen1(ct.b16)
399
bigen.writeUint16(e.e.w(), uint16(l))
401
e.e.encWr.writen1(ct.b32)
402
bigen.writeUint32(e.e.w(), uint32(l))
406
//---------------------------------------------
408
type msgpackDecDriver struct {
409
decDriverNoopContainerReader
410
decDriverNoopNumberHelper
418
func (d *msgpackDecDriver) decoder() *Decoder {
422
// Note: This returns either a primitive (int, bool, etc) for non-containers,
423
// or a containerType, or a specific type denoting nil or extension.
424
// It is called when a nil interface{} is passed, leaving it up to the DecDriver
425
// to introspect the stream and decide how best to decode.
426
// It deciphers the value by looking at the stream first.
427
func (d *msgpackDecDriver) DecodeNaked() {
433
var decodeFurther bool
448
n.f = float64(math.Float32frombits(bigen.Uint32(d.d.decRd.readn4())))
451
n.f = math.Float64frombits(bigen.Uint64(d.d.decRd.readn8()))
455
n.u = uint64(d.d.decRd.readn1())
458
n.u = uint64(bigen.Uint16(d.d.decRd.readn2()))
461
n.u = uint64(bigen.Uint32(d.d.decRd.readn4()))
464
n.u = uint64(bigen.Uint64(d.d.decRd.readn8()))
468
n.i = int64(int8(d.d.decRd.readn1()))
471
n.i = int64(int16(bigen.Uint16(d.d.decRd.readn2())))
474
n.i = int64(int32(bigen.Uint32(d.d.decRd.readn4())))
477
n.i = int64(int64(bigen.Uint64(d.d.decRd.readn8())))
481
case bd >= mpPosFixNumMin && bd <= mpPosFixNumMax:
482
// positive fixnum (always signed)
484
n.i = int64(int8(bd))
485
case bd >= mpNegFixNumMin && bd <= mpNegFixNumMax:
488
n.i = int64(int8(bd))
489
case bd == mpStr8, bd == mpStr16, bd == mpStr32, bd >= mpFixStrMin && bd <= mpFixStrMax:
490
d.d.fauxUnionReadRawBytes(d.h.WriteExt)
491
// if d.h.WriteExt || d.h.RawToString {
492
// n.v = valueTypeString
493
// n.s = d.d.stringZC(d.DecodeStringAsBytes())
495
// n.v = valueTypeBytes
496
// n.l = d.DecodeBytes([]byte{})
498
case bd == mpBin8, bd == mpBin16, bd == mpBin32:
499
d.d.fauxUnionReadRawBytes(false)
500
case bd == mpArray16, bd == mpArray32, bd >= mpFixArrayMin && bd <= mpFixArrayMax:
503
case bd == mpMap16, bd == mpMap32, bd >= mpFixMapMin && bd <= mpFixMapMax:
506
case bd >= mpFixExt1 && bd <= mpFixExt16, bd >= mpExt8 && bd <= mpExt32:
508
clen := d.readExtLen()
509
n.u = uint64(d.d.decRd.readn1())
510
if n.u == uint64(mpTimeExtTagU) {
512
n.t = d.decodeTime(clen)
513
} else if d.d.bytes {
514
n.l = d.d.decRd.rb.readx(uint(clen))
516
n.l = decByteSlice(d.d.r(), clen, d.d.h.MaxInitLen, d.d.b[:])
519
d.d.errorf("cannot infer value: %s: Ox%x/%d/%s", msgBadDesc, bd, bd, mpdesc(bd))
525
if n.v == valueTypeUint && d.h.SignedInteger {
531
func (d *msgpackDecDriver) nextValueBytes(v0 []byte) (v []byte) {
536
var h = decNextValueBytesHelper{d: &d.d}
537
var cursor = d.d.rb.c - 1
539
v = d.nextValueBytesBdReadR(v)
541
h.bytesRdV(&v, cursor)
545
func (d *msgpackDecDriver) nextValueBytesR(v0 []byte) (v []byte) {
548
var h = decNextValueBytesHelper{d: &d.d}
550
return d.nextValueBytesBdReadR(v)
553
func (d *msgpackDecDriver) nextValueBytesBdReadR(v0 []byte) (v []byte) {
555
var h = decNextValueBytesHelper{d: &d.d}
562
case mpNil, mpFalse, mpTrue: // pass
563
case mpUint8, mpInt8:
564
h.append1(&v, d.d.decRd.readn1())
565
case mpUint16, mpInt16:
566
h.appendN(&v, d.d.decRd.readx(2)...)
567
case mpFloat, mpUint32, mpInt32:
568
h.appendN(&v, d.d.decRd.readx(4)...)
569
case mpDouble, mpUint64, mpInt64:
570
h.appendN(&v, d.d.decRd.readx(8)...)
572
clen = uint(d.d.decRd.readn1())
573
h.append1(&v, byte(clen))
574
h.appendN(&v, d.d.decRd.readx(clen)...)
575
case mpStr16, mpBin16:
576
x := d.d.decRd.readn2()
577
h.appendN(&v, x[:]...)
578
clen = uint(bigen.Uint16(x))
579
h.appendN(&v, d.d.decRd.readx(clen)...)
580
case mpStr32, mpBin32:
581
x := d.d.decRd.readn4()
582
h.appendN(&v, x[:]...)
583
clen = uint(bigen.Uint32(x))
584
h.appendN(&v, d.d.decRd.readx(clen)...)
586
h.append1(&v, d.d.decRd.readn1()) // tag
587
h.append1(&v, d.d.decRd.readn1())
589
h.append1(&v, d.d.decRd.readn1()) // tag
590
h.appendN(&v, d.d.decRd.readx(2)...)
592
h.append1(&v, d.d.decRd.readn1()) // tag
593
h.appendN(&v, d.d.decRd.readx(4)...)
595
h.append1(&v, d.d.decRd.readn1()) // tag
596
h.appendN(&v, d.d.decRd.readx(8)...)
598
h.append1(&v, d.d.decRd.readn1()) // tag
599
h.appendN(&v, d.d.decRd.readx(16)...)
601
clen = uint(d.d.decRd.readn1())
602
h.append1(&v, uint8(clen))
603
h.append1(&v, d.d.decRd.readn1()) // tag
604
h.appendN(&v, d.d.decRd.readx(clen)...)
606
x := d.d.decRd.readn2()
607
clen = uint(bigen.Uint16(x))
608
h.appendN(&v, x[:]...)
609
h.append1(&v, d.d.decRd.readn1()) // tag
610
h.appendN(&v, d.d.decRd.readx(clen)...)
612
x := d.d.decRd.readn4()
613
clen = uint(bigen.Uint32(x))
614
h.appendN(&v, x[:]...)
615
h.append1(&v, d.d.decRd.readn1()) // tag
616
h.appendN(&v, d.d.decRd.readx(clen)...)
618
x := d.d.decRd.readn2()
619
clen = uint(bigen.Uint16(x))
620
h.appendN(&v, x[:]...)
621
for i := uint(0); i < clen; i++ {
622
v = d.nextValueBytesR(v)
625
x := d.d.decRd.readn4()
626
clen = uint(bigen.Uint32(x))
627
h.appendN(&v, x[:]...)
628
for i := uint(0); i < clen; i++ {
629
v = d.nextValueBytesR(v)
632
x := d.d.decRd.readn2()
633
clen = uint(bigen.Uint16(x))
634
h.appendN(&v, x[:]...)
635
for i := uint(0); i < clen; i++ {
636
v = d.nextValueBytesR(v)
637
v = d.nextValueBytesR(v)
640
x := d.d.decRd.readn4()
641
clen = uint(bigen.Uint32(x))
642
h.appendN(&v, x[:]...)
643
for i := uint(0); i < clen; i++ {
644
v = d.nextValueBytesR(v)
645
v = d.nextValueBytesR(v)
649
case bd >= mpPosFixNumMin && bd <= mpPosFixNumMax: // pass
650
case bd >= mpNegFixNumMin && bd <= mpNegFixNumMax: // pass
651
case bd >= mpFixStrMin && bd <= mpFixStrMax:
652
clen = uint(mpFixStrMin ^ bd)
653
h.appendN(&v, d.d.decRd.readx(clen)...)
654
case bd >= mpFixArrayMin && bd <= mpFixArrayMax:
655
clen = uint(mpFixArrayMin ^ bd)
656
for i := uint(0); i < clen; i++ {
657
v = d.nextValueBytesR(v)
659
case bd >= mpFixMapMin && bd <= mpFixMapMax:
660
clen = uint(mpFixMapMin ^ bd)
661
for i := uint(0); i < clen; i++ {
662
v = d.nextValueBytesR(v)
663
v = d.nextValueBytesR(v)
666
d.d.errorf("nextValueBytes: cannot infer value: %s: Ox%x/%d/%s", msgBadDesc, bd, bd, mpdesc(bd))
672
func (d *msgpackDecDriver) decFloat4Int32() (f float32) {
673
fbits := bigen.Uint32(d.d.decRd.readn4())
674
f = math.Float32frombits(fbits)
675
if !noFrac32(fbits) {
676
d.d.errorf("assigning integer value from float32 with a fraction: %v", f)
681
func (d *msgpackDecDriver) decFloat4Int64() (f float64) {
682
fbits := bigen.Uint64(d.d.decRd.readn8())
683
f = math.Float64frombits(fbits)
684
if !noFrac64(fbits) {
685
d.d.errorf("assigning integer value from float64 with a fraction: %v", f)
690
// int can be decoded from msgpack type: intXXX or uintXXX
691
func (d *msgpackDecDriver) DecodeInt64() (i int64) {
697
i = int64(uint64(d.d.decRd.readn1()))
699
i = int64(uint64(bigen.Uint16(d.d.decRd.readn2())))
701
i = int64(uint64(bigen.Uint32(d.d.decRd.readn4())))
703
i = int64(bigen.Uint64(d.d.decRd.readn8()))
705
i = int64(int8(d.d.decRd.readn1()))
707
i = int64(int16(bigen.Uint16(d.d.decRd.readn2())))
709
i = int64(int32(bigen.Uint32(d.d.decRd.readn4())))
711
i = int64(bigen.Uint64(d.d.decRd.readn8()))
713
i = int64(d.decFloat4Int32())
715
i = int64(d.decFloat4Int64())
718
case d.bd >= mpPosFixNumMin && d.bd <= mpPosFixNumMax:
719
i = int64(int8(d.bd))
720
case d.bd >= mpNegFixNumMin && d.bd <= mpNegFixNumMax:
721
i = int64(int8(d.bd))
723
d.d.errorf("cannot decode signed integer: %s: %x/%s", msgBadDesc, d.bd, mpdesc(d.bd))
730
// uint can be decoded from msgpack type: intXXX or uintXXX
731
func (d *msgpackDecDriver) DecodeUint64() (ui uint64) {
737
ui = uint64(d.d.decRd.readn1())
739
ui = uint64(bigen.Uint16(d.d.decRd.readn2()))
741
ui = uint64(bigen.Uint32(d.d.decRd.readn4()))
743
ui = bigen.Uint64(d.d.decRd.readn8())
745
if i := int64(int8(d.d.decRd.readn1())); i >= 0 {
748
d.d.errorf("assigning negative signed value: %v, to unsigned type", i)
751
if i := int64(int16(bigen.Uint16(d.d.decRd.readn2()))); i >= 0 {
754
d.d.errorf("assigning negative signed value: %v, to unsigned type", i)
757
if i := int64(int32(bigen.Uint32(d.d.decRd.readn4()))); i >= 0 {
760
d.d.errorf("assigning negative signed value: %v, to unsigned type", i)
763
if i := int64(bigen.Uint64(d.d.decRd.readn8())); i >= 0 {
766
d.d.errorf("assigning negative signed value: %v, to unsigned type", i)
769
if f := d.decFloat4Int32(); f >= 0 {
772
d.d.errorf("assigning negative float value: %v, to unsigned type", f)
775
if f := d.decFloat4Int64(); f >= 0 {
778
d.d.errorf("assigning negative float value: %v, to unsigned type", f)
782
case d.bd >= mpPosFixNumMin && d.bd <= mpPosFixNumMax:
784
case d.bd >= mpNegFixNumMin && d.bd <= mpNegFixNumMax:
785
d.d.errorf("assigning negative signed value: %v, to unsigned type", int(d.bd))
787
d.d.errorf("cannot decode unsigned integer: %s: %x/%s", msgBadDesc, d.bd, mpdesc(d.bd))
794
// float can either be decoded from msgpack type: float, double or intX
795
func (d *msgpackDecDriver) DecodeFloat64() (f float64) {
800
f = float64(math.Float32frombits(bigen.Uint32(d.d.decRd.readn4())))
801
} else if d.bd == mpDouble {
802
f = math.Float64frombits(bigen.Uint64(d.d.decRd.readn8()))
804
f = float64(d.DecodeInt64())
810
// bool can be decoded from bool, fixnum 0 or 1.
811
func (d *msgpackDecDriver) DecodeBool() (b bool) {
815
if d.bd == mpFalse || d.bd == 0 {
817
} else if d.bd == mpTrue || d.bd == 1 {
820
d.d.errorf("cannot decode bool: %s: %x/%s", msgBadDesc, d.bd, mpdesc(d.bd))
826
func (d *msgpackDecDriver) DecodeBytes(bs []byte) (bsOut []byte) {
827
d.d.decByteState = decByteStateNone
834
if bd == mpBin8 || bd == mpBin16 || bd == mpBin32 {
835
clen = d.readContainerLen(msgpackContainerBin) // binary
836
} else if bd == mpStr8 || bd == mpStr16 || bd == mpStr32 ||
837
(bd >= mpFixStrMin && bd <= mpFixStrMax) {
838
clen = d.readContainerLen(msgpackContainerStr) // string/raw
839
} else if bd == mpArray16 || bd == mpArray32 ||
840
(bd >= mpFixArrayMin && bd <= mpFixArrayMax) {
841
// check if an "array" of uint8's
843
d.d.decByteState = decByteStateReuseBuf
846
// bsOut, _ = fastpathTV.DecSliceUint8V(bs, true, d.d)
847
slen := d.ReadArrayStart()
849
if bs, changed = usableByteSlice(bs, slen); changed {
850
d.d.decByteState = decByteStateNone
852
for i := 0; i < len(bs); i++ {
853
bs[i] = uint8(chkOvf.UintV(d.DecodeUint64(), 8))
855
for i := len(bs); i < slen; i++ {
856
bs = append(bs, uint8(chkOvf.UintV(d.DecodeUint64(), 8)))
860
d.d.errorf("invalid byte descriptor for decoding bytes, got: 0x%x", d.bd)
865
d.d.decByteState = decByteStateZerocopy
866
return d.d.decRd.rb.readx(uint(clen))
869
d.d.decByteState = decByteStateReuseBuf
872
return decByteSlice(d.d.r(), clen, d.h.MaxInitLen, bs)
875
func (d *msgpackDecDriver) DecodeStringAsBytes() (s []byte) {
876
s = d.DecodeBytes(nil)
877
if d.h.ValidateUnicode && !utf8.Valid(s) {
878
d.d.errorf("DecodeStringAsBytes: invalid UTF-8: %s", s)
883
func (d *msgpackDecDriver) descBd() string {
884
return sprintf("%v (%s)", d.bd, mpdesc(d.bd))
887
func (d *msgpackDecDriver) readNextBd() {
888
d.bd = d.d.decRd.readn1()
892
func (d *msgpackDecDriver) advanceNil() (null bool) {
898
return true // null = true
903
func (d *msgpackDecDriver) TryNil() (v bool) {
904
return d.advanceNil()
907
func (d *msgpackDecDriver) ContainerType() (vt valueType) {
915
} else if bd == mpBin8 || bd == mpBin16 || bd == mpBin32 {
916
return valueTypeBytes
917
} else if bd == mpStr8 || bd == mpStr16 || bd == mpStr32 ||
918
(bd >= mpFixStrMin && bd <= mpFixStrMax) {
919
if d.h.WriteExt || d.h.RawToString { // UTF-8 string (new spec)
920
return valueTypeString
922
return valueTypeBytes // raw (old spec)
923
} else if bd == mpArray16 || bd == mpArray32 || (bd >= mpFixArrayMin && bd <= mpFixArrayMax) {
924
return valueTypeArray
925
} else if bd == mpMap16 || bd == mpMap32 || (bd >= mpFixMapMin && bd <= mpFixMapMax) {
928
return valueTypeUnset
931
func (d *msgpackDecDriver) readContainerLen(ct msgpackContainerType) (clen int) {
934
clen = int(d.d.decRd.readn1())
935
} else if bd == ct.b16 {
936
clen = int(bigen.Uint16(d.d.decRd.readn2()))
937
} else if bd == ct.b32 {
938
clen = int(bigen.Uint32(d.d.decRd.readn4()))
939
} else if (ct.bFixMin & bd) == ct.bFixMin {
940
clen = int(ct.bFixMin ^ bd)
942
d.d.errorf("cannot read container length: %s: hex: %x, decimal: %d", msgBadDesc, bd, bd)
948
func (d *msgpackDecDriver) ReadMapStart() int {
950
return containerLenNil
952
return d.readContainerLen(msgpackContainerMap)
955
func (d *msgpackDecDriver) ReadArrayStart() int {
957
return containerLenNil
959
return d.readContainerLen(msgpackContainerList)
962
func (d *msgpackDecDriver) readExtLen() (clen int) {
975
clen = int(d.d.decRd.readn1())
977
clen = int(bigen.Uint16(d.d.decRd.readn2()))
979
clen = int(bigen.Uint32(d.d.decRd.readn4()))
981
d.d.errorf("decoding ext bytes: found unexpected byte: %x", d.bd)
986
func (d *msgpackDecDriver) DecodeTime() (t time.Time) {
987
// decode time from string bytes or ext
993
if bd == mpBin8 || bd == mpBin16 || bd == mpBin32 {
994
clen = d.readContainerLen(msgpackContainerBin) // binary
995
} else if bd == mpStr8 || bd == mpStr16 || bd == mpStr32 ||
996
(bd >= mpFixStrMin && bd <= mpFixStrMax) {
997
clen = d.readContainerLen(msgpackContainerStr) // string/raw
999
// expect to see mpFixExt4,-1 OR mpFixExt8,-1 OR mpExt8,12,-1
1001
b2 := d.d.decRd.readn1()
1002
if d.bd == mpFixExt4 && b2 == mpTimeExtTagU {
1004
} else if d.bd == mpFixExt8 && b2 == mpTimeExtTagU {
1006
} else if d.bd == mpExt8 && b2 == 12 && d.d.decRd.readn1() == mpTimeExtTagU {
1009
d.d.errorf("invalid stream for decoding time as extension: got 0x%x, 0x%x", d.bd, b2)
1012
return d.decodeTime(clen)
1015
func (d *msgpackDecDriver) decodeTime(clen int) (t time.Time) {
1019
t = time.Unix(int64(bigen.Uint32(d.d.decRd.readn4())), 0).UTC()
1021
tv := bigen.Uint64(d.d.decRd.readn8())
1022
t = time.Unix(int64(tv&0x00000003ffffffff), int64(tv>>34)).UTC()
1024
nsec := bigen.Uint32(d.d.decRd.readn4())
1025
sec := bigen.Uint64(d.d.decRd.readn8())
1026
t = time.Unix(int64(sec), int64(nsec)).UTC()
1028
d.d.errorf("invalid length of bytes for decoding time - expecting 4 or 8 or 12, got %d", clen)
1033
func (d *msgpackDecDriver) DecodeExt(rv interface{}, basetype reflect.Type, xtag uint64, ext Ext) {
1035
d.d.errorf("ext: tag must be <= 0xff; got: %v", xtag)
1040
xbs, realxtag1, zerocopy := d.decodeExtV(ext != nil, uint8(xtag))
1041
realxtag := uint64(realxtag1)
1045
re.setData(xbs, zerocopy)
1046
} else if ext == SelfExt {
1047
d.d.sideDecode(rv, basetype, xbs)
1049
ext.ReadExt(rv, xbs)
1053
func (d *msgpackDecDriver) decodeExtV(verifyTag bool, tag byte) (xbs []byte, xtag byte, zerocopy bool) {
1055
if xbd == mpBin8 || xbd == mpBin16 || xbd == mpBin32 {
1056
xbs = d.DecodeBytes(nil)
1057
} else if xbd == mpStr8 || xbd == mpStr16 || xbd == mpStr32 ||
1058
(xbd >= mpFixStrMin && xbd <= mpFixStrMax) {
1059
xbs = d.DecodeStringAsBytes()
1061
clen := d.readExtLen()
1062
xtag = d.d.decRd.readn1()
1063
if verifyTag && xtag != tag {
1064
d.d.errorf("wrong extension tag - got %b, expecting %v", xtag, tag)
1067
xbs = d.d.decRd.rb.readx(uint(clen))
1070
xbs = decByteSlice(d.d.r(), clen, d.d.h.MaxInitLen, d.d.b[:])
1077
//--------------------------------------------------
1079
// MsgpackHandle is a Handle for the Msgpack Schema-Free Encoding Format.
1080
type MsgpackHandle struct {
1084
// NoFixedNum says to output all signed integers as 2-bytes, never as 1-byte fixednum.
1087
// WriteExt controls whether the new spec is honored.
1089
// With WriteExt=true, we can encode configured extensions with extension tags
1090
// and encode string/[]byte/extensions in a way compatible with the new spec
1091
// but incompatible with the old spec.
1093
// For compatibility with the old spec, set WriteExt=false.
1095
// With WriteExt=false:
1096
// configured extensions are serialized as raw bytes (not msgpack extensions).
1097
// reserved byte descriptors like Str8 and those enabling the new msgpack Binary type
1101
// PositiveIntUnsigned says to encode positive integers as unsigned.
1102
PositiveIntUnsigned bool
1105
// Name returns the name of the handle: msgpack
1106
func (h *MsgpackHandle) Name() string { return "msgpack" }
1108
func (h *MsgpackHandle) desc(bd byte) string { return mpdesc(bd) }
1110
func (h *MsgpackHandle) newEncDriver() encDriver {
1111
var e = &msgpackEncDriver{h: h}
1118
func (h *MsgpackHandle) newDecDriver() decDriver {
1119
d := &msgpackDecDriver{h: h}
1126
//--------------------------------------------------
1128
type msgpackSpecRpcCodec struct {
1132
// /////////////// Spec RPC Codec ///////////////////
1133
func (c *msgpackSpecRpcCodec) WriteRequest(r *rpc.Request, body interface{}) error {
1134
// WriteRequest can write to both a Go service, and other services that do
1135
// not abide by the 1 argument rule of a Go service.
1136
// We discriminate based on if the body is a MsgpackSpecRpcMultiArgs
1137
var bodyArr []interface{}
1138
if m, ok := body.(MsgpackSpecRpcMultiArgs); ok {
1139
bodyArr = ([]interface{})(m)
1141
bodyArr = []interface{}{body}
1143
r2 := []interface{}{0, uint32(r.Seq), r.ServiceMethod, bodyArr}
1147
func (c *msgpackSpecRpcCodec) WriteResponse(r *rpc.Response, body interface{}) error {
1152
if moe != nil && body != nil {
1155
r2 := []interface{}{1, uint32(r.Seq), moe, body}
1159
func (c *msgpackSpecRpcCodec) ReadResponseHeader(r *rpc.Response) error {
1160
return c.parseCustomHeader(1, &r.Seq, &r.Error)
1163
func (c *msgpackSpecRpcCodec) ReadRequestHeader(r *rpc.Request) error {
1164
return c.parseCustomHeader(0, &r.Seq, &r.ServiceMethod)
1167
func (c *msgpackSpecRpcCodec) ReadRequestBody(body interface{}) error {
1168
if body == nil { // read and discard
1171
bodyArr := []interface{}{body}
1172
return c.read(&bodyArr)
1175
func (c *msgpackSpecRpcCodec) parseCustomHeader(expectTypeByte byte, msgid *uint64, methodOrError *string) (err error) {
1176
if cls := c.cls.load(); cls.closed {
1177
return io.ErrUnexpectedEOF
1180
// We read the response header by hand
1181
// so that the body can be decoded on its own from the stream at a later time.
1183
const fia byte = 0x94 //four item array descriptor value
1188
n, err = c.r.Read(ba[:])
1199
err = fmt.Errorf("not array - %s %x/%s", msgBadDesc, b, mpdesc(b))
1203
if b != expectTypeByte {
1204
err = fmt.Errorf("%s - expecting %v but got %x/%s", msgBadDesc, expectTypeByte, b, mpdesc(b))
1208
err = c.read(methodOrError)
1216
//--------------------------------------------------
1218
// msgpackSpecRpc is the implementation of Rpc that uses custom communication protocol
1219
// as defined in the msgpack spec at https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md
1220
type msgpackSpecRpc struct{}
1222
// MsgpackSpecRpc implements Rpc using the communication protocol defined in
1223
// the msgpack spec at https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md .
1225
// See GoRpc documentation, for information on buffering for better performance.
1226
var MsgpackSpecRpc msgpackSpecRpc
1228
func (x msgpackSpecRpc) ServerCodec(conn io.ReadWriteCloser, h Handle) rpc.ServerCodec {
1229
return &msgpackSpecRpcCodec{newRPCCodec(conn, h)}
1232
func (x msgpackSpecRpc) ClientCodec(conn io.ReadWriteCloser, h Handle) rpc.ClientCodec {
1233
return &msgpackSpecRpcCodec{newRPCCodec(conn, h)}
1236
var _ decDriver = (*msgpackDecDriver)(nil)
1237
var _ encDriver = (*msgpackEncDriver)(nil)