podman

Форк
0
1237 строк · 31.4 Кб
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.ErrUnexpectedEOF
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)
1238

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.