gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

msgpack.go (32164B)


      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.
      3 
      4 /*
      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.
      8 
      9 For compatibility with behaviour of msgpack-c reference implementation:
     10   - Go intX (>0) and uintX
     11        IS ENCODED AS
     12     msgpack +ve fixnum, unsigned
     13   - Go intX (<0)
     14        IS ENCODED AS
     15     msgpack -ve fixnum, signed
     16 */
     17 
     18 package codec
     19 
     20 import (
     21 	"fmt"
     22 	"io"
     23 	"math"
     24 	"net/rpc"
     25 	"reflect"
     26 	"time"
     27 	"unicode/utf8"
     28 )
     29 
     30 const (
     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
     39 	mpNil          byte = 0xc0
     40 	_              byte = 0xc1
     41 	mpFalse        byte = 0xc2
     42 	mpTrue         byte = 0xc3
     43 	mpFloat        byte = 0xca
     44 	mpDouble       byte = 0xcb
     45 	mpUint8        byte = 0xcc
     46 	mpUint16       byte = 0xcd
     47 	mpUint32       byte = 0xce
     48 	mpUint64       byte = 0xcf
     49 	mpInt8         byte = 0xd0
     50 	mpInt16        byte = 0xd1
     51 	mpInt32        byte = 0xd2
     52 	mpInt64        byte = 0xd3
     53 
     54 	// extensions below
     55 	mpBin8     byte = 0xc4
     56 	mpBin16    byte = 0xc5
     57 	mpBin32    byte = 0xc6
     58 	mpExt8     byte = 0xc7
     59 	mpExt16    byte = 0xc8
     60 	mpExt32    byte = 0xc9
     61 	mpFixExt1  byte = 0xd4
     62 	mpFixExt2  byte = 0xd5
     63 	mpFixExt4  byte = 0xd6
     64 	mpFixExt8  byte = 0xd7
     65 	mpFixExt16 byte = 0xd8
     66 
     67 	mpStr8  byte = 0xd9 // new
     68 	mpStr16 byte = 0xda
     69 	mpStr32 byte = 0xdb
     70 
     71 	mpArray16 byte = 0xdc
     72 	mpArray32 byte = 0xdd
     73 
     74 	mpMap16 byte = 0xde
     75 	mpMap32 byte = 0xdf
     76 
     77 	mpNegFixNumMin byte = 0xe0
     78 	mpNegFixNumMax byte = 0xff
     79 )
     80 
     81 var mpTimeExtTag int8 = -1
     82 var mpTimeExtTagU = uint8(mpTimeExtTag)
     83 
     84 var mpdescNames = map[byte]string{
     85 	mpNil:    "nil",
     86 	mpFalse:  "false",
     87 	mpTrue:   "true",
     88 	mpFloat:  "float",
     89 	mpDouble: "float",
     90 	mpUint8:  "uuint",
     91 	mpUint16: "uint",
     92 	mpUint32: "uint",
     93 	mpUint64: "uint",
     94 	mpInt8:   "int",
     95 	mpInt16:  "int",
     96 	mpInt32:  "int",
     97 	mpInt64:  "int",
     98 
     99 	mpStr8:  "string|bytes",
    100 	mpStr16: "string|bytes",
    101 	mpStr32: "string|bytes",
    102 
    103 	mpBin8:  "bytes",
    104 	mpBin16: "bytes",
    105 	mpBin32: "bytes",
    106 
    107 	mpArray16: "array",
    108 	mpArray32: "array",
    109 
    110 	mpMap16: "map",
    111 	mpMap32: "map",
    112 }
    113 
    114 func mpdesc(bd byte) (s string) {
    115 	s = mpdescNames[bd]
    116 	if s == "" {
    117 		switch {
    118 		case bd >= mpPosFixNumMin && bd <= mpPosFixNumMax,
    119 			bd >= mpNegFixNumMin && bd <= mpNegFixNumMax:
    120 			s = "int"
    121 		case bd >= mpFixStrMin && bd <= mpFixStrMax:
    122 			s = "string|bytes"
    123 		case bd >= mpFixArrayMin && bd <= mpFixArrayMax:
    124 			s = "array"
    125 		case bd >= mpFixMapMin && bd <= mpFixMapMax:
    126 			s = "map"
    127 		case bd >= mpFixExt1 && bd <= mpFixExt16,
    128 			bd >= mpExt8 && bd <= mpExt32:
    129 			s = "ext"
    130 		default:
    131 			s = "unknown"
    132 		}
    133 	}
    134 	return
    135 }
    136 
    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.
    140 //
    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{}
    144 
    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
    149 }
    150 
    151 var (
    152 	msgpackContainerRawLegacy = msgpackContainerType{
    153 		32, mpFixStrMin, 0, mpStr16, mpStr32,
    154 	}
    155 	msgpackContainerStr = msgpackContainerType{
    156 		32, mpFixStrMin, mpStr8, mpStr16, mpStr32, // true, true, false,
    157 	}
    158 	msgpackContainerBin = msgpackContainerType{
    159 		0, 0, mpBin8, mpBin16, mpBin32, // false, true, true,
    160 	}
    161 	msgpackContainerList = msgpackContainerType{
    162 		16, mpFixArrayMin, 0, mpArray16, mpArray32, // true, false, false,
    163 	}
    164 	msgpackContainerMap = msgpackContainerType{
    165 		16, mpFixMapMin, 0, mpMap16, mpMap32, // true, false, false,
    166 	}
    167 )
    168 
    169 //---------------------------------------------
    170 
    171 type msgpackEncDriver struct {
    172 	noBuiltInTypes
    173 	encDriverNoopContainerWriter
    174 	encDriverNoState
    175 	h *MsgpackHandle
    176 	// x [8]byte
    177 	e Encoder
    178 }
    179 
    180 func (e *msgpackEncDriver) encoder() *Encoder {
    181 	return &e.e
    182 }
    183 
    184 func (e *msgpackEncDriver) EncodeNil() {
    185 	e.e.encWr.writen1(mpNil)
    186 }
    187 
    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))
    198 		} else {
    199 			e.e.encWr.writen1(mpInt64)
    200 			bigen.writeUint64(e.e.w(), uint64(i))
    201 		}
    202 	} else if i >= -32 {
    203 		if e.h.NoFixedNum {
    204 			e.e.encWr.writen2(mpInt8, byte(i))
    205 		} else {
    206 			e.e.encWr.writen1(byte(i))
    207 		}
    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))
    216 	} else {
    217 		e.e.encWr.writen1(mpInt64)
    218 		bigen.writeUint64(e.e.w(), uint64(i))
    219 	}
    220 }
    221 
    222 func (e *msgpackEncDriver) EncodeUint(i uint64) {
    223 	if i <= math.MaxInt8 {
    224 		if e.h.NoFixedNum {
    225 			e.e.encWr.writen2(mpUint8, byte(i))
    226 		} else {
    227 			e.e.encWr.writen1(byte(i))
    228 		}
    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))
    237 	} else {
    238 		e.e.encWr.writen1(mpUint64)
    239 		bigen.writeUint64(e.e.w(), uint64(i))
    240 	}
    241 }
    242 
    243 func (e *msgpackEncDriver) EncodeBool(b bool) {
    244 	if b {
    245 		e.e.encWr.writen1(mpTrue)
    246 	} else {
    247 		e.e.encWr.writen1(mpFalse)
    248 	}
    249 }
    250 
    251 func (e *msgpackEncDriver) EncodeFloat32(f float32) {
    252 	e.e.encWr.writen1(mpFloat)
    253 	bigen.writeUint32(e.e.w(), math.Float32bits(f))
    254 }
    255 
    256 func (e *msgpackEncDriver) EncodeFloat64(f float64) {
    257 	e.e.encWr.writen1(mpDouble)
    258 	bigen.writeUint64(e.e.w(), math.Float64bits(f))
    259 }
    260 
    261 func (e *msgpackEncDriver) EncodeTime(t time.Time) {
    262 	if t.IsZero() {
    263 		e.EncodeNil()
    264 		return
    265 	}
    266 	t = t.UTC()
    267 	sec, nsec := t.Unix(), uint64(t.Nanosecond())
    268 	var data64 uint64
    269 	var l = 4
    270 	if sec >= 0 && sec>>34 == 0 {
    271 		data64 = (nsec << 34) | uint64(sec)
    272 		if data64&0xffffffff00000000 != 0 {
    273 			l = 8
    274 		}
    275 	} else {
    276 		l = 12
    277 	}
    278 	if e.h.WriteExt {
    279 		e.encodeExtPreamble(mpTimeExtTagU, l)
    280 	} else {
    281 		e.writeContainerLen(msgpackContainerRawLegacy, l)
    282 	}
    283 	switch l {
    284 	case 4:
    285 		bigen.writeUint32(e.e.w(), uint32(data64))
    286 	case 8:
    287 		bigen.writeUint64(e.e.w(), data64)
    288 	case 12:
    289 		bigen.writeUint32(e.e.w(), uint32(nsec))
    290 		bigen.writeUint64(e.e.w(), uint64(sec))
    291 	}
    292 }
    293 
    294 func (e *msgpackEncDriver) EncodeExt(v interface{}, basetype reflect.Type, xtag uint64, ext Ext) {
    295 	var bs0, bs []byte
    296 	if ext == SelfExt {
    297 		bs0 = e.e.blist.get(1024)
    298 		bs = bs0
    299 		e.e.sideEncode(v, basetype, &bs)
    300 	} else {
    301 		bs = ext.WriteExt(v)
    302 	}
    303 	if bs == nil {
    304 		e.EncodeNil()
    305 		goto END
    306 	}
    307 	if e.h.WriteExt {
    308 		e.encodeExtPreamble(uint8(xtag), len(bs))
    309 		e.e.encWr.writeb(bs)
    310 	} else {
    311 		e.EncodeStringBytesRaw(bs)
    312 	}
    313 END:
    314 	if ext == SelfExt {
    315 		e.e.blist.put(bs)
    316 		if !byteSliceSameData(bs0, bs) {
    317 			e.e.blist.put(bs0)
    318 		}
    319 	}
    320 }
    321 
    322 func (e *msgpackEncDriver) EncodeRawExt(re *RawExt) {
    323 	e.encodeExtPreamble(uint8(re.Tag), len(re.Data))
    324 	e.e.encWr.writeb(re.Data)
    325 }
    326 
    327 func (e *msgpackEncDriver) encodeExtPreamble(xtag byte, l int) {
    328 	if l == 1 {
    329 		e.e.encWr.writen2(mpFixExt1, xtag)
    330 	} else if l == 2 {
    331 		e.e.encWr.writen2(mpFixExt2, xtag)
    332 	} else if l == 4 {
    333 		e.e.encWr.writen2(mpFixExt4, xtag)
    334 	} else if l == 8 {
    335 		e.e.encWr.writen2(mpFixExt8, xtag)
    336 	} else if l == 16 {
    337 		e.e.encWr.writen2(mpFixExt16, xtag)
    338 	} else if l < 256 {
    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)
    345 	} else {
    346 		e.e.encWr.writen1(mpExt32)
    347 		bigen.writeUint32(e.e.w(), uint32(l))
    348 		e.e.encWr.writen1(xtag)
    349 	}
    350 }
    351 
    352 func (e *msgpackEncDriver) WriteArrayStart(length int) {
    353 	e.writeContainerLen(msgpackContainerList, length)
    354 }
    355 
    356 func (e *msgpackEncDriver) WriteMapStart(length int) {
    357 	e.writeContainerLen(msgpackContainerMap, length)
    358 }
    359 
    360 func (e *msgpackEncDriver) EncodeString(s string) {
    361 	var ct msgpackContainerType
    362 	if e.h.WriteExt {
    363 		if e.h.StringToRaw {
    364 			ct = msgpackContainerBin
    365 		} else {
    366 			ct = msgpackContainerStr
    367 		}
    368 	} else {
    369 		ct = msgpackContainerRawLegacy
    370 	}
    371 	e.writeContainerLen(ct, len(s))
    372 	if len(s) > 0 {
    373 		e.e.encWr.writestr(s)
    374 	}
    375 }
    376 
    377 func (e *msgpackEncDriver) EncodeStringBytesRaw(bs []byte) {
    378 	if bs == nil {
    379 		e.EncodeNil()
    380 		return
    381 	}
    382 	if e.h.WriteExt {
    383 		e.writeContainerLen(msgpackContainerBin, len(bs))
    384 	} else {
    385 		e.writeContainerLen(msgpackContainerRawLegacy, len(bs))
    386 	}
    387 	if len(bs) > 0 {
    388 		e.e.encWr.writeb(bs)
    389 	}
    390 }
    391 
    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))
    400 	} else {
    401 		e.e.encWr.writen1(ct.b32)
    402 		bigen.writeUint32(e.e.w(), uint32(l))
    403 	}
    404 }
    405 
    406 //---------------------------------------------
    407 
    408 type msgpackDecDriver struct {
    409 	decDriverNoopContainerReader
    410 	decDriverNoopNumberHelper
    411 	h *MsgpackHandle
    412 	bdAndBdread
    413 	_ bool
    414 	noBuiltInTypes
    415 	d Decoder
    416 }
    417 
    418 func (d *msgpackDecDriver) decoder() *Decoder {
    419 	return &d.d
    420 }
    421 
    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() {
    428 	if !d.bdRead {
    429 		d.readNextBd()
    430 	}
    431 	bd := d.bd
    432 	n := d.d.naked()
    433 	var decodeFurther bool
    434 
    435 	switch bd {
    436 	case mpNil:
    437 		n.v = valueTypeNil
    438 		d.bdRead = false
    439 	case mpFalse:
    440 		n.v = valueTypeBool
    441 		n.b = false
    442 	case mpTrue:
    443 		n.v = valueTypeBool
    444 		n.b = true
    445 
    446 	case mpFloat:
    447 		n.v = valueTypeFloat
    448 		n.f = float64(math.Float32frombits(bigen.Uint32(d.d.decRd.readn4())))
    449 	case mpDouble:
    450 		n.v = valueTypeFloat
    451 		n.f = math.Float64frombits(bigen.Uint64(d.d.decRd.readn8()))
    452 
    453 	case mpUint8:
    454 		n.v = valueTypeUint
    455 		n.u = uint64(d.d.decRd.readn1())
    456 	case mpUint16:
    457 		n.v = valueTypeUint
    458 		n.u = uint64(bigen.Uint16(d.d.decRd.readn2()))
    459 	case mpUint32:
    460 		n.v = valueTypeUint
    461 		n.u = uint64(bigen.Uint32(d.d.decRd.readn4()))
    462 	case mpUint64:
    463 		n.v = valueTypeUint
    464 		n.u = uint64(bigen.Uint64(d.d.decRd.readn8()))
    465 
    466 	case mpInt8:
    467 		n.v = valueTypeInt
    468 		n.i = int64(int8(d.d.decRd.readn1()))
    469 	case mpInt16:
    470 		n.v = valueTypeInt
    471 		n.i = int64(int16(bigen.Uint16(d.d.decRd.readn2())))
    472 	case mpInt32:
    473 		n.v = valueTypeInt
    474 		n.i = int64(int32(bigen.Uint32(d.d.decRd.readn4())))
    475 	case mpInt64:
    476 		n.v = valueTypeInt
    477 		n.i = int64(int64(bigen.Uint64(d.d.decRd.readn8())))
    478 
    479 	default:
    480 		switch {
    481 		case bd >= mpPosFixNumMin && bd <= mpPosFixNumMax:
    482 			// positive fixnum (always signed)
    483 			n.v = valueTypeInt
    484 			n.i = int64(int8(bd))
    485 		case bd >= mpNegFixNumMin && bd <= mpNegFixNumMax:
    486 			// negative fixnum
    487 			n.v = valueTypeInt
    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())
    494 			// } else {
    495 			// 	n.v = valueTypeBytes
    496 			// 	n.l = d.DecodeBytes([]byte{})
    497 			// }
    498 		case bd == mpBin8, bd == mpBin16, bd == mpBin32:
    499 			d.d.fauxUnionReadRawBytes(false)
    500 		case bd == mpArray16, bd == mpArray32, bd >= mpFixArrayMin && bd <= mpFixArrayMax:
    501 			n.v = valueTypeArray
    502 			decodeFurther = true
    503 		case bd == mpMap16, bd == mpMap32, bd >= mpFixMapMin && bd <= mpFixMapMax:
    504 			n.v = valueTypeMap
    505 			decodeFurther = true
    506 		case bd >= mpFixExt1 && bd <= mpFixExt16, bd >= mpExt8 && bd <= mpExt32:
    507 			n.v = valueTypeExt
    508 			clen := d.readExtLen()
    509 			n.u = uint64(d.d.decRd.readn1())
    510 			if n.u == uint64(mpTimeExtTagU) {
    511 				n.v = valueTypeTime
    512 				n.t = d.decodeTime(clen)
    513 			} else if d.d.bytes {
    514 				n.l = d.d.decRd.rb.readx(uint(clen))
    515 			} else {
    516 				n.l = decByteSlice(d.d.r(), clen, d.d.h.MaxInitLen, d.d.b[:])
    517 			}
    518 		default:
    519 			d.d.errorf("cannot infer value: %s: Ox%x/%d/%s", msgBadDesc, bd, bd, mpdesc(bd))
    520 		}
    521 	}
    522 	if !decodeFurther {
    523 		d.bdRead = false
    524 	}
    525 	if n.v == valueTypeUint && d.h.SignedInteger {
    526 		n.v = valueTypeInt
    527 		n.i = int64(n.u)
    528 	}
    529 }
    530 
    531 func (d *msgpackDecDriver) nextValueBytes(v0 []byte) (v []byte) {
    532 	if !d.bdRead {
    533 		d.readNextBd()
    534 	}
    535 	v = v0
    536 	var h = decNextValueBytesHelper{d: &d.d}
    537 	var cursor = d.d.rb.c - 1
    538 	h.append1(&v, d.bd)
    539 	v = d.nextValueBytesBdReadR(v)
    540 	d.bdRead = false
    541 	h.bytesRdV(&v, cursor)
    542 	return
    543 }
    544 
    545 func (d *msgpackDecDriver) nextValueBytesR(v0 []byte) (v []byte) {
    546 	d.readNextBd()
    547 	v = v0
    548 	var h = decNextValueBytesHelper{d: &d.d}
    549 	h.append1(&v, d.bd)
    550 	return d.nextValueBytesBdReadR(v)
    551 }
    552 
    553 func (d *msgpackDecDriver) nextValueBytesBdReadR(v0 []byte) (v []byte) {
    554 	v = v0
    555 	var h = decNextValueBytesHelper{d: &d.d}
    556 
    557 	bd := d.bd
    558 
    559 	var clen uint
    560 
    561 	switch bd {
    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)...)
    571 	case mpStr8, mpBin8:
    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)...)
    585 	case mpFixExt1:
    586 		h.append1(&v, d.d.decRd.readn1()) // tag
    587 		h.append1(&v, d.d.decRd.readn1())
    588 	case mpFixExt2:
    589 		h.append1(&v, d.d.decRd.readn1()) // tag
    590 		h.appendN(&v, d.d.decRd.readx(2)...)
    591 	case mpFixExt4:
    592 		h.append1(&v, d.d.decRd.readn1()) // tag
    593 		h.appendN(&v, d.d.decRd.readx(4)...)
    594 	case mpFixExt8:
    595 		h.append1(&v, d.d.decRd.readn1()) // tag
    596 		h.appendN(&v, d.d.decRd.readx(8)...)
    597 	case mpFixExt16:
    598 		h.append1(&v, d.d.decRd.readn1()) // tag
    599 		h.appendN(&v, d.d.decRd.readx(16)...)
    600 	case mpExt8:
    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)...)
    605 	case mpExt16:
    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)...)
    611 	case mpExt32:
    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)...)
    617 	case mpArray16:
    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)
    623 		}
    624 	case mpArray32:
    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)
    630 		}
    631 	case mpMap16:
    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)
    638 		}
    639 	case mpMap32:
    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)
    646 		}
    647 	default:
    648 		switch {
    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)
    658 			}
    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)
    664 			}
    665 		default:
    666 			d.d.errorf("nextValueBytes: cannot infer value: %s: Ox%x/%d/%s", msgBadDesc, bd, bd, mpdesc(bd))
    667 		}
    668 	}
    669 	return
    670 }
    671 
    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)
    677 	}
    678 	return
    679 }
    680 
    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)
    686 	}
    687 	return
    688 }
    689 
    690 // int can be decoded from msgpack type: intXXX or uintXXX
    691 func (d *msgpackDecDriver) DecodeInt64() (i int64) {
    692 	if d.advanceNil() {
    693 		return
    694 	}
    695 	switch d.bd {
    696 	case mpUint8:
    697 		i = int64(uint64(d.d.decRd.readn1()))
    698 	case mpUint16:
    699 		i = int64(uint64(bigen.Uint16(d.d.decRd.readn2())))
    700 	case mpUint32:
    701 		i = int64(uint64(bigen.Uint32(d.d.decRd.readn4())))
    702 	case mpUint64:
    703 		i = int64(bigen.Uint64(d.d.decRd.readn8()))
    704 	case mpInt8:
    705 		i = int64(int8(d.d.decRd.readn1()))
    706 	case mpInt16:
    707 		i = int64(int16(bigen.Uint16(d.d.decRd.readn2())))
    708 	case mpInt32:
    709 		i = int64(int32(bigen.Uint32(d.d.decRd.readn4())))
    710 	case mpInt64:
    711 		i = int64(bigen.Uint64(d.d.decRd.readn8()))
    712 	case mpFloat:
    713 		i = int64(d.decFloat4Int32())
    714 	case mpDouble:
    715 		i = int64(d.decFloat4Int64())
    716 	default:
    717 		switch {
    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))
    722 		default:
    723 			d.d.errorf("cannot decode signed integer: %s: %x/%s", msgBadDesc, d.bd, mpdesc(d.bd))
    724 		}
    725 	}
    726 	d.bdRead = false
    727 	return
    728 }
    729 
    730 // uint can be decoded from msgpack type: intXXX or uintXXX
    731 func (d *msgpackDecDriver) DecodeUint64() (ui uint64) {
    732 	if d.advanceNil() {
    733 		return
    734 	}
    735 	switch d.bd {
    736 	case mpUint8:
    737 		ui = uint64(d.d.decRd.readn1())
    738 	case mpUint16:
    739 		ui = uint64(bigen.Uint16(d.d.decRd.readn2()))
    740 	case mpUint32:
    741 		ui = uint64(bigen.Uint32(d.d.decRd.readn4()))
    742 	case mpUint64:
    743 		ui = bigen.Uint64(d.d.decRd.readn8())
    744 	case mpInt8:
    745 		if i := int64(int8(d.d.decRd.readn1())); i >= 0 {
    746 			ui = uint64(i)
    747 		} else {
    748 			d.d.errorf("assigning negative signed value: %v, to unsigned type", i)
    749 		}
    750 	case mpInt16:
    751 		if i := int64(int16(bigen.Uint16(d.d.decRd.readn2()))); i >= 0 {
    752 			ui = uint64(i)
    753 		} else {
    754 			d.d.errorf("assigning negative signed value: %v, to unsigned type", i)
    755 		}
    756 	case mpInt32:
    757 		if i := int64(int32(bigen.Uint32(d.d.decRd.readn4()))); i >= 0 {
    758 			ui = uint64(i)
    759 		} else {
    760 			d.d.errorf("assigning negative signed value: %v, to unsigned type", i)
    761 		}
    762 	case mpInt64:
    763 		if i := int64(bigen.Uint64(d.d.decRd.readn8())); i >= 0 {
    764 			ui = uint64(i)
    765 		} else {
    766 			d.d.errorf("assigning negative signed value: %v, to unsigned type", i)
    767 		}
    768 	case mpFloat:
    769 		if f := d.decFloat4Int32(); f >= 0 {
    770 			ui = uint64(f)
    771 		} else {
    772 			d.d.errorf("assigning negative float value: %v, to unsigned type", f)
    773 		}
    774 	case mpDouble:
    775 		if f := d.decFloat4Int64(); f >= 0 {
    776 			ui = uint64(f)
    777 		} else {
    778 			d.d.errorf("assigning negative float value: %v, to unsigned type", f)
    779 		}
    780 	default:
    781 		switch {
    782 		case d.bd >= mpPosFixNumMin && d.bd <= mpPosFixNumMax:
    783 			ui = uint64(d.bd)
    784 		case d.bd >= mpNegFixNumMin && d.bd <= mpNegFixNumMax:
    785 			d.d.errorf("assigning negative signed value: %v, to unsigned type", int(d.bd))
    786 		default:
    787 			d.d.errorf("cannot decode unsigned integer: %s: %x/%s", msgBadDesc, d.bd, mpdesc(d.bd))
    788 		}
    789 	}
    790 	d.bdRead = false
    791 	return
    792 }
    793 
    794 // float can either be decoded from msgpack type: float, double or intX
    795 func (d *msgpackDecDriver) DecodeFloat64() (f float64) {
    796 	if d.advanceNil() {
    797 		return
    798 	}
    799 	if d.bd == mpFloat {
    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()))
    803 	} else {
    804 		f = float64(d.DecodeInt64())
    805 	}
    806 	d.bdRead = false
    807 	return
    808 }
    809 
    810 // bool can be decoded from bool, fixnum 0 or 1.
    811 func (d *msgpackDecDriver) DecodeBool() (b bool) {
    812 	if d.advanceNil() {
    813 		return
    814 	}
    815 	if d.bd == mpFalse || d.bd == 0 {
    816 		// b = false
    817 	} else if d.bd == mpTrue || d.bd == 1 {
    818 		b = true
    819 	} else {
    820 		d.d.errorf("cannot decode bool: %s: %x/%s", msgBadDesc, d.bd, mpdesc(d.bd))
    821 	}
    822 	d.bdRead = false
    823 	return
    824 }
    825 
    826 func (d *msgpackDecDriver) DecodeBytes(bs []byte) (bsOut []byte) {
    827 	d.d.decByteState = decByteStateNone
    828 	if d.advanceNil() {
    829 		return
    830 	}
    831 
    832 	bd := d.bd
    833 	var clen int
    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
    842 		if bs == nil {
    843 			d.d.decByteState = decByteStateReuseBuf
    844 			bs = d.d.b[:]
    845 		}
    846 		// bsOut, _ = fastpathTV.DecSliceUint8V(bs, true, d.d)
    847 		slen := d.ReadArrayStart()
    848 		var changed bool
    849 		if bs, changed = usableByteSlice(bs, slen); changed {
    850 			d.d.decByteState = decByteStateNone
    851 		}
    852 		for i := 0; i < len(bs); i++ {
    853 			bs[i] = uint8(chkOvf.UintV(d.DecodeUint64(), 8))
    854 		}
    855 		for i := len(bs); i < slen; i++ {
    856 			bs = append(bs, uint8(chkOvf.UintV(d.DecodeUint64(), 8)))
    857 		}
    858 		return bs
    859 	} else {
    860 		d.d.errorf("invalid byte descriptor for decoding bytes, got: 0x%x", d.bd)
    861 	}
    862 
    863 	d.bdRead = false
    864 	if d.d.zerocopy() {
    865 		d.d.decByteState = decByteStateZerocopy
    866 		return d.d.decRd.rb.readx(uint(clen))
    867 	}
    868 	if bs == nil {
    869 		d.d.decByteState = decByteStateReuseBuf
    870 		bs = d.d.b[:]
    871 	}
    872 	return decByteSlice(d.d.r(), clen, d.h.MaxInitLen, bs)
    873 }
    874 
    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)
    879 	}
    880 	return
    881 }
    882 
    883 func (d *msgpackDecDriver) descBd() string {
    884 	return sprintf("%v (%s)", d.bd, mpdesc(d.bd))
    885 }
    886 
    887 func (d *msgpackDecDriver) readNextBd() {
    888 	d.bd = d.d.decRd.readn1()
    889 	d.bdRead = true
    890 }
    891 
    892 func (d *msgpackDecDriver) advanceNil() (null bool) {
    893 	if !d.bdRead {
    894 		d.readNextBd()
    895 	}
    896 	if d.bd == mpNil {
    897 		d.bdRead = false
    898 		return true // null = true
    899 	}
    900 	return
    901 }
    902 
    903 func (d *msgpackDecDriver) TryNil() (v bool) {
    904 	return d.advanceNil()
    905 }
    906 
    907 func (d *msgpackDecDriver) ContainerType() (vt valueType) {
    908 	if !d.bdRead {
    909 		d.readNextBd()
    910 	}
    911 	bd := d.bd
    912 	if bd == mpNil {
    913 		d.bdRead = false
    914 		return valueTypeNil
    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
    921 		}
    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) {
    926 		return valueTypeMap
    927 	}
    928 	return valueTypeUnset
    929 }
    930 
    931 func (d *msgpackDecDriver) readContainerLen(ct msgpackContainerType) (clen int) {
    932 	bd := d.bd
    933 	if bd == ct.b8 {
    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)
    941 	} else {
    942 		d.d.errorf("cannot read container length: %s: hex: %x, decimal: %d", msgBadDesc, bd, bd)
    943 	}
    944 	d.bdRead = false
    945 	return
    946 }
    947 
    948 func (d *msgpackDecDriver) ReadMapStart() int {
    949 	if d.advanceNil() {
    950 		return containerLenNil
    951 	}
    952 	return d.readContainerLen(msgpackContainerMap)
    953 }
    954 
    955 func (d *msgpackDecDriver) ReadArrayStart() int {
    956 	if d.advanceNil() {
    957 		return containerLenNil
    958 	}
    959 	return d.readContainerLen(msgpackContainerList)
    960 }
    961 
    962 func (d *msgpackDecDriver) readExtLen() (clen int) {
    963 	switch d.bd {
    964 	case mpFixExt1:
    965 		clen = 1
    966 	case mpFixExt2:
    967 		clen = 2
    968 	case mpFixExt4:
    969 		clen = 4
    970 	case mpFixExt8:
    971 		clen = 8
    972 	case mpFixExt16:
    973 		clen = 16
    974 	case mpExt8:
    975 		clen = int(d.d.decRd.readn1())
    976 	case mpExt16:
    977 		clen = int(bigen.Uint16(d.d.decRd.readn2()))
    978 	case mpExt32:
    979 		clen = int(bigen.Uint32(d.d.decRd.readn4()))
    980 	default:
    981 		d.d.errorf("decoding ext bytes: found unexpected byte: %x", d.bd)
    982 	}
    983 	return
    984 }
    985 
    986 func (d *msgpackDecDriver) DecodeTime() (t time.Time) {
    987 	// decode time from string bytes or ext
    988 	if d.advanceNil() {
    989 		return
    990 	}
    991 	bd := d.bd
    992 	var clen int
    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
    998 	} else {
    999 		// expect to see mpFixExt4,-1 OR mpFixExt8,-1 OR mpExt8,12,-1
   1000 		d.bdRead = false
   1001 		b2 := d.d.decRd.readn1()
   1002 		if d.bd == mpFixExt4 && b2 == mpTimeExtTagU {
   1003 			clen = 4
   1004 		} else if d.bd == mpFixExt8 && b2 == mpTimeExtTagU {
   1005 			clen = 8
   1006 		} else if d.bd == mpExt8 && b2 == 12 && d.d.decRd.readn1() == mpTimeExtTagU {
   1007 			clen = 12
   1008 		} else {
   1009 			d.d.errorf("invalid stream for decoding time as extension: got 0x%x, 0x%x", d.bd, b2)
   1010 		}
   1011 	}
   1012 	return d.decodeTime(clen)
   1013 }
   1014 
   1015 func (d *msgpackDecDriver) decodeTime(clen int) (t time.Time) {
   1016 	d.bdRead = false
   1017 	switch clen {
   1018 	case 4:
   1019 		t = time.Unix(int64(bigen.Uint32(d.d.decRd.readn4())), 0).UTC()
   1020 	case 8:
   1021 		tv := bigen.Uint64(d.d.decRd.readn8())
   1022 		t = time.Unix(int64(tv&0x00000003ffffffff), int64(tv>>34)).UTC()
   1023 	case 12:
   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()
   1027 	default:
   1028 		d.d.errorf("invalid length of bytes for decoding time - expecting 4 or 8 or 12, got %d", clen)
   1029 	}
   1030 	return
   1031 }
   1032 
   1033 func (d *msgpackDecDriver) DecodeExt(rv interface{}, basetype reflect.Type, xtag uint64, ext Ext) {
   1034 	if xtag > 0xff {
   1035 		d.d.errorf("ext: tag must be <= 0xff; got: %v", xtag)
   1036 	}
   1037 	if d.advanceNil() {
   1038 		return
   1039 	}
   1040 	xbs, realxtag1, zerocopy := d.decodeExtV(ext != nil, uint8(xtag))
   1041 	realxtag := uint64(realxtag1)
   1042 	if ext == nil {
   1043 		re := rv.(*RawExt)
   1044 		re.Tag = realxtag
   1045 		re.setData(xbs, zerocopy)
   1046 	} else if ext == SelfExt {
   1047 		d.d.sideDecode(rv, basetype, xbs)
   1048 	} else {
   1049 		ext.ReadExt(rv, xbs)
   1050 	}
   1051 }
   1052 
   1053 func (d *msgpackDecDriver) decodeExtV(verifyTag bool, tag byte) (xbs []byte, xtag byte, zerocopy bool) {
   1054 	xbd := d.bd
   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()
   1060 	} else {
   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)
   1065 		}
   1066 		if d.d.bytes {
   1067 			xbs = d.d.decRd.rb.readx(uint(clen))
   1068 			zerocopy = true
   1069 		} else {
   1070 			xbs = decByteSlice(d.d.r(), clen, d.d.h.MaxInitLen, d.d.b[:])
   1071 		}
   1072 	}
   1073 	d.bdRead = false
   1074 	return
   1075 }
   1076 
   1077 //--------------------------------------------------
   1078 
   1079 // MsgpackHandle is a Handle for the Msgpack Schema-Free Encoding Format.
   1080 type MsgpackHandle struct {
   1081 	binaryEncodingType
   1082 	BasicHandle
   1083 
   1084 	// NoFixedNum says to output all signed integers as 2-bytes, never as 1-byte fixednum.
   1085 	NoFixedNum bool
   1086 
   1087 	// WriteExt controls whether the new spec is honored.
   1088 	//
   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.
   1092 	//
   1093 	// For compatibility with the old spec, set WriteExt=false.
   1094 	//
   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
   1098 	//    are not encoded.
   1099 	WriteExt bool
   1100 
   1101 	// PositiveIntUnsigned says to encode positive integers as unsigned.
   1102 	PositiveIntUnsigned bool
   1103 }
   1104 
   1105 // Name returns the name of the handle: msgpack
   1106 func (h *MsgpackHandle) Name() string { return "msgpack" }
   1107 
   1108 func (h *MsgpackHandle) desc(bd byte) string { return mpdesc(bd) }
   1109 
   1110 func (h *MsgpackHandle) newEncDriver() encDriver {
   1111 	var e = &msgpackEncDriver{h: h}
   1112 	e.e.e = e
   1113 	e.e.init(h)
   1114 	e.reset()
   1115 	return e
   1116 }
   1117 
   1118 func (h *MsgpackHandle) newDecDriver() decDriver {
   1119 	d := &msgpackDecDriver{h: h}
   1120 	d.d.d = d
   1121 	d.d.init(h)
   1122 	d.reset()
   1123 	return d
   1124 }
   1125 
   1126 //--------------------------------------------------
   1127 
   1128 type msgpackSpecRpcCodec struct {
   1129 	rpcCodec
   1130 }
   1131 
   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)
   1140 	} else {
   1141 		bodyArr = []interface{}{body}
   1142 	}
   1143 	r2 := []interface{}{0, uint32(r.Seq), r.ServiceMethod, bodyArr}
   1144 	return c.write(r2)
   1145 }
   1146 
   1147 func (c *msgpackSpecRpcCodec) WriteResponse(r *rpc.Response, body interface{}) error {
   1148 	var moe interface{}
   1149 	if r.Error != "" {
   1150 		moe = r.Error
   1151 	}
   1152 	if moe != nil && body != nil {
   1153 		body = nil
   1154 	}
   1155 	r2 := []interface{}{1, uint32(r.Seq), moe, body}
   1156 	return c.write(r2)
   1157 }
   1158 
   1159 func (c *msgpackSpecRpcCodec) ReadResponseHeader(r *rpc.Response) error {
   1160 	return c.parseCustomHeader(1, &r.Seq, &r.Error)
   1161 }
   1162 
   1163 func (c *msgpackSpecRpcCodec) ReadRequestHeader(r *rpc.Request) error {
   1164 	return c.parseCustomHeader(0, &r.Seq, &r.ServiceMethod)
   1165 }
   1166 
   1167 func (c *msgpackSpecRpcCodec) ReadRequestBody(body interface{}) error {
   1168 	if body == nil { // read and discard
   1169 		return c.read(nil)
   1170 	}
   1171 	bodyArr := []interface{}{body}
   1172 	return c.read(&bodyArr)
   1173 }
   1174 
   1175 func (c *msgpackSpecRpcCodec) parseCustomHeader(expectTypeByte byte, msgid *uint64, methodOrError *string) (err error) {
   1176 	if cls := c.cls.load(); cls.closed {
   1177 		return io.EOF
   1178 	}
   1179 
   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.
   1182 
   1183 	const fia byte = 0x94 //four item array descriptor value
   1184 
   1185 	var ba [1]byte
   1186 	var n int
   1187 	for {
   1188 		n, err = c.r.Read(ba[:])
   1189 		if err != nil {
   1190 			return
   1191 		}
   1192 		if n == 1 {
   1193 			break
   1194 		}
   1195 	}
   1196 
   1197 	var b = ba[0]
   1198 	if b != fia {
   1199 		err = fmt.Errorf("not array - %s %x/%s", msgBadDesc, b, mpdesc(b))
   1200 	} else {
   1201 		err = c.read(&b)
   1202 		if err == nil {
   1203 			if b != expectTypeByte {
   1204 				err = fmt.Errorf("%s - expecting %v but got %x/%s", msgBadDesc, expectTypeByte, b, mpdesc(b))
   1205 			} else {
   1206 				err = c.read(msgid)
   1207 				if err == nil {
   1208 					err = c.read(methodOrError)
   1209 				}
   1210 			}
   1211 		}
   1212 	}
   1213 	return
   1214 }
   1215 
   1216 //--------------------------------------------------
   1217 
   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{}
   1221 
   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 .
   1224 //
   1225 // See GoRpc documentation, for information on buffering for better performance.
   1226 var MsgpackSpecRpc msgpackSpecRpc
   1227 
   1228 func (x msgpackSpecRpc) ServerCodec(conn io.ReadWriteCloser, h Handle) rpc.ServerCodec {
   1229 	return &msgpackSpecRpcCodec{newRPCCodec(conn, h)}
   1230 }
   1231 
   1232 func (x msgpackSpecRpc) ClientCodec(conn io.ReadWriteCloser, h Handle) rpc.ClientCodec {
   1233 	return &msgpackSpecRpcCodec{newRPCCodec(conn, h)}
   1234 }
   1235 
   1236 var _ decDriver = (*msgpackDecDriver)(nil)
   1237 var _ encDriver = (*msgpackEncDriver)(nil)