github.com/lheiskan/zebrapack@v4.1.1-0.20181107023619-e955d028f9bf+incompatible/msgp/read.go (about) 1 package msgp 2 3 import ( 4 "io" 5 "math" 6 "sync" 7 "time" 8 9 "github.com/philhofer/fwd" 10 ) 11 12 // PreSave will be called before EncodeMsg/MarshalMsg 13 // if you struct implements it. 14 type PreSave interface { 15 16 // PreSaveHook is called before msgp.MarshalMsg 17 // and msgp.EncodeMsg. It allows you to prep 18 // the struct for serialization. See 19 // PostLoadHook for the complimentary hook 20 // called after deserialization. 21 PreSaveHook() 22 } 23 24 // PostLoad will be called after DecodeMsg/UnmarshalMsg, 25 // if you struct implements it. 26 type PostLoad interface { 27 28 // PostLoadHook is called after 29 // msgp.UnmarshalMsg and msgp.DecodeMsg. 30 // The opposite of PreSaveHook, it allows 31 // one to add a custom finishing step 32 // after basic deserialization has 33 // completed. 34 PostLoadHook() 35 } 36 37 type ConcreteFactory interface { 38 NewValueAsInterface(zid int64, typename string) interface{} 39 } 40 41 // where we keep old *Readers 42 var readerPool = sync.Pool{New: func() interface{} { return &Reader{} }} 43 44 // Type is a MessagePack wire type, 45 // including this package's built-in 46 // extension types. 47 type Type byte 48 49 // MessagePack Types 50 // 51 // The zero value of Type 52 // is InvalidType. 53 const ( 54 InvalidType Type = iota 55 56 // MessagePack built-in types 57 58 StrType 59 BinType 60 MapType 61 ArrayType 62 Float64Type 63 Float32Type 64 BoolType 65 IntType 66 UintType 67 NilType 68 ExtensionType 69 70 // pseudo-types provided 71 // by extensions 72 73 Complex64Type 74 Complex128Type 75 TimeType 76 77 _maxtype 78 ) 79 80 // String implements fmt.Stringer 81 func (t Type) String() string { 82 switch t { 83 case StrType: 84 return "str" 85 case BinType: 86 return "bin" 87 case MapType: 88 return "map" 89 case ArrayType: 90 return "array" 91 case Float64Type: 92 return "float64" 93 case Float32Type: 94 return "float32" 95 case BoolType: 96 return "bool" 97 case UintType: 98 return "uint" 99 case IntType: 100 return "int" 101 case ExtensionType: 102 return "ext" 103 case NilType: 104 return "nil" 105 default: 106 return "<invalid>" 107 } 108 } 109 110 func freeR(m *Reader) { 111 readerPool.Put(m) 112 } 113 114 // Unmarshaler is the interface fulfilled 115 // by objects that know how to unmarshal 116 // themselves from MessagePack. 117 // UnmarshalMsg unmarshals the object 118 // from binary, returing any leftover 119 // bytes and any errors encountered. 120 type Unmarshaler interface { 121 UnmarshalMsg([]byte) ([]byte, error) 122 } 123 124 // Decodable is the interface fulfilled 125 // by objects that know how to read 126 // themselves from a *Reader. 127 type Decodable interface { 128 DecodeMsg(*Reader) error 129 } 130 131 // Decode decodes 'd' from 'r'. 132 func Decode(r io.Reader, d Decodable) error { 133 rd := NewReader(r) 134 err := d.DecodeMsg(rd) 135 freeR(rd) 136 return err 137 } 138 139 // NewReader returns a *Reader that 140 // reads from the provided reader. The 141 // reader will be buffered. 142 func NewReader(r io.Reader) *Reader { 143 p := readerPool.Get().(*Reader) 144 if p.R == nil { 145 p.R = fwd.NewReader(r) 146 } else { 147 p.R.Reset(r) 148 } 149 return p 150 } 151 152 // NewReaderSize returns a *Reader with a buffer of the given size. 153 // (This is vastly preferable to passing the decoder a reader that is already buffered.) 154 func NewReaderSize(r io.Reader, sz int) *Reader { 155 return &Reader{R: fwd.NewReaderSize(r, sz)} 156 } 157 158 // Reader wraps an io.Reader and provides 159 // methods to read MessagePack-encoded values 160 // from it. Readers are buffered. 161 type Reader struct { 162 // R is the buffered reader 163 // that the Reader uses 164 // to decode MessagePack. 165 // The Reader itself 166 // is stateless; all the 167 // buffering is done 168 // within R. 169 R *fwd.Reader 170 scratch []byte 171 172 NilTracker 173 } 174 175 // NilTracker maintains a stack to assit 176 // DecodeMsg methods when deserializing 177 // from nil fields. 178 type NilTracker struct { 179 // simulate getting nils on the wire 180 AlwaysNil bool 181 LifoAlwaysNil []bool 182 } 183 184 // AlwaysNilString returns a string representation 185 // of the internal state of the stack for 186 // debugging purposes. 187 func (r *NilTracker) AlwaysNilString() string { 188 s := "bottom: " 189 for _, v := range r.LifoAlwaysNil { 190 if v { 191 s += "T" 192 } else { 193 s += "f" 194 } 195 } 196 return s 197 } 198 199 // PushAlwaysNil will set r.AlwaysNil to true 200 // and store the previous value of r.AlwaysNil 201 // on the internal stack. 202 func (r *NilTracker) PushAlwaysNil() { 203 // save current state 204 r.LifoAlwaysNil = append(r.LifoAlwaysNil, r.AlwaysNil) 205 // set reader r to always return nils 206 r.AlwaysNil = true 207 } 208 209 // PopAlwaysNil pops the last entry off the 210 // internal stack and uses it to set 211 // r.AlwaysNil. 212 func (r *NilTracker) PopAlwaysNil() { 213 n := len(r.LifoAlwaysNil) 214 //fmt.Printf("\n Reader.PopAlwaysNil() called! qlen = %d, '%s'\n", 215 // n, r.AlwaysNilString()) 216 if n == 0 { 217 panic("PopAlwaysNil called on empty lifo") 218 return 219 } 220 a := r.LifoAlwaysNil[n-1] 221 r.LifoAlwaysNil = r.LifoAlwaysNil[:n-1] 222 r.AlwaysNil = a 223 } 224 225 // Read implements `io.Reader` 226 func (m *Reader) Read(p []byte) (int, error) { 227 if m.AlwaysNil { 228 return 0, nil 229 } 230 return m.R.Read(p) 231 } 232 233 // ReadFull implements `io.ReadFull` 234 func (m *Reader) ReadFull(p []byte) (int, error) { 235 if m.AlwaysNil { 236 return 0, nil 237 } 238 239 return m.R.ReadFull(p) 240 } 241 242 // Reset resets the underlying reader. 243 func (m *Reader) Reset(r io.Reader) { m.R.Reset(r) } 244 245 // Buffered returns the number of bytes currently in the read buffer. 246 func (m *Reader) Buffered() int { return m.R.Buffered() } 247 248 // BufferSize returns the capacity of the read buffer. 249 func (m *Reader) BufferSize() int { return m.R.BufferSize() } 250 251 // NextStructName inspects the next time, assuming it is a 252 // struct (map) for its (-1: name) key-value pair, and returns the name 253 // or empty string if not found. Also empty string if not 254 // a map type. 255 func (m *Reader) NextStructName() string { 256 ty, err := m.NextType() 257 if err != nil { 258 return "" 259 } 260 if ty != MapType { 261 return "" 262 } 263 264 // map header can be of varying size 265 hdsz := 1 266 var p []byte 267 var lead byte 268 p, err = m.R.Peek(2) 269 if err != nil { 270 return "" 271 } 272 lead = p[0] 273 if isfixmap(lead) { 274 hdsz = 1 275 } else { 276 switch lead { 277 case mmap16: 278 hdsz = 3 279 case mmap32: 280 hdsz = 5 281 default: 282 //err = badPrefix(MapType, lead) 283 return "" 284 } 285 } 286 287 // now we've got the map header out of the 288 // way in hdsz bytes 289 p, err = m.R.Peek(hdsz + 3) 290 if err != nil { 291 return "" 292 } 293 keystart := p[hdsz:] 294 if keystart[0] != 0xff { 295 return "" // not the -1 key with value the struct name 296 } 297 298 valstart := hdsz + 1 299 valTypeBytes := 1 300 skip := valstart + valTypeBytes 301 lead = p[valstart] 302 var read int 303 if isfixstr(lead) { 304 // lead is a fixstr, good 305 read = int(rfixstr(lead)) 306 } else { 307 switch lead { 308 case mstr8, mbin8: 309 valTypeBytes = 2 310 skip = valstart + valTypeBytes 311 p, err = m.R.Peek(skip) 312 if err != nil { 313 return "" 314 } 315 read = int(p[valstart+1]) 316 case mstr16, mbin16: 317 valTypeBytes = 3 318 skip = valstart + valTypeBytes 319 p, err = m.R.Peek(skip) 320 if err != nil { 321 return "" 322 } 323 read = int(big.Uint16(p[valstart+1:])) 324 case mstr32, mbin32: 325 valTypeBytes = 5 326 skip = valstart + valTypeBytes 327 p, err = m.R.Peek(skip) 328 if err != nil { 329 return "" 330 } 331 read = int(big.Uint32(p[valstart+1:])) 332 default: 333 return "" // not a string 334 } 335 } 336 // read string strictly through peaking! 337 if read == 0 { 338 return "" 339 } 340 p, err = m.R.Peek(skip + read) 341 if err != nil { 342 return "" 343 } 344 //_, _ = m.R.Skip(skip + read) 345 return string(p[skip:]) 346 } 347 348 // NextType returns the next object type to be decoded. 349 func (m *Reader) NextType() (Type, error) { 350 if m.AlwaysNil { 351 return NilType, nil 352 } 353 354 p, err := m.R.Peek(1) 355 if err != nil { 356 return InvalidType, err 357 } 358 t := getType(p[0]) 359 if t == InvalidType { 360 return t, InvalidPrefixError(p[0]) 361 } 362 if t == ExtensionType { 363 v, err := m.peekExtensionType() 364 if err != nil { 365 return InvalidType, err 366 } 367 switch v { 368 case Complex64Extension: 369 return Complex64Type, nil 370 case Complex128Extension: 371 return Complex128Type, nil 372 case TimeExtension: 373 return TimeType, nil 374 } 375 } 376 return t, nil 377 } 378 379 // IsNil returns whether or not 380 // the next byte is a null messagepack byte 381 func (m *Reader) IsNil() bool { 382 if m.AlwaysNil { 383 return true 384 } 385 p, err := m.R.Peek(1) 386 return err == nil && p[0] == mnil 387 } 388 389 func (m *Reader) peekNil() bool { 390 p, err := m.R.Peek(1) 391 return err == nil && p[0] == mnil 392 } 393 394 // returns (obj size, obj elements, error) 395 // only maps and arrays have non-zero obj elements 396 // 397 // use uintptr b/c it's guaranteed to be large enough 398 // to hold whatever we can fit in memory. 399 func getNextSize(r *fwd.Reader) (uintptr, uintptr, error) { 400 b, err := r.Peek(1) 401 if err != nil { 402 return 0, 0, err 403 } 404 lead := b[0] 405 spec := &sizes[lead] 406 size, mode := spec.size, spec.extra 407 if size == 0 { 408 return 0, 0, InvalidPrefixError(lead) 409 } 410 if mode >= 0 { 411 return uintptr(size), uintptr(mode), nil 412 } 413 b, err = r.Peek(int(size)) 414 if err != nil { 415 return 0, 0, err 416 } 417 switch mode { 418 case extra8: 419 return uintptr(size) + uintptr(b[1]), 0, nil 420 case extra16: 421 return uintptr(size) + uintptr(big.Uint16(b[1:])), 0, nil 422 case extra32: 423 return uintptr(size) + uintptr(big.Uint32(b[1:])), 0, nil 424 case map16v: 425 return uintptr(size), 2 * uintptr(big.Uint16(b[1:])), nil 426 case map32v: 427 return uintptr(size), 2 * uintptr(big.Uint32(b[1:])), nil 428 case array16v: 429 return uintptr(size), uintptr(big.Uint16(b[1:])), nil 430 case array32v: 431 return uintptr(size), uintptr(big.Uint32(b[1:])), nil 432 default: 433 return 0, 0, fatal 434 } 435 } 436 437 // Skip skips over the next object, regardless of 438 // its type. If it is an array or map, the whole array 439 // or map will be skipped. 440 func (m *Reader) Skip() error { 441 var ( 442 v uintptr // bytes 443 o uintptr // objects 444 err error 445 p []byte 446 ) 447 448 // we can use the faster 449 // method if we have enough 450 // buffered data 451 if m.R.Buffered() >= 5 { 452 p, err = m.R.Peek(5) 453 if err != nil { 454 return err 455 } 456 v, o, err = getSize(p) 457 if err != nil { 458 return err 459 } 460 } else { 461 v, o, err = getNextSize(m.R) 462 if err != nil { 463 return err 464 } 465 } 466 467 // 'v' is always non-zero 468 // if err == nil 469 _, err = m.R.Skip(int(v)) 470 if err != nil { 471 return err 472 } 473 474 // for maps and slices, skip elements 475 for x := uintptr(0); x < o; x++ { 476 err = m.Skip() 477 if err != nil { 478 return err 479 } 480 } 481 return nil 482 } 483 484 // ReadMapHeader reads the next object 485 // as a map header and returns the size 486 // of the map and the number of bytes written. 487 // It will return a TypeError{} if the next 488 // object is not a map. 489 func (m *Reader) ReadMapHeader() (sz uint32, err error) { 490 if m.checkAndConsumeNil() { 491 return 0, nil 492 } 493 var p []byte 494 var lead byte 495 p, err = m.R.Peek(1) 496 if err != nil { 497 return 498 } 499 lead = p[0] 500 if isfixmap(lead) { 501 sz = uint32(rfixmap(lead)) 502 _, err = m.R.Skip(1) 503 return 504 } 505 switch lead { 506 case mmap16: 507 p, err = m.R.Next(3) 508 if err != nil { 509 return 510 } 511 sz = uint32(big.Uint16(p[1:])) 512 return 513 case mmap32: 514 p, err = m.R.Next(5) 515 if err != nil { 516 return 517 } 518 sz = big.Uint32(p[1:]) 519 return 520 default: 521 err = badPrefix(MapType, lead) 522 return 523 } 524 } 525 526 // ReadMapKey reads either a 'str' or 'bin' field from 527 // the reader and returns the value as a []byte. It uses 528 // scratch for storage if it is large enough. 529 func (m *Reader) ReadMapKey(scratch []byte) ([]byte, error) { 530 if m.checkAndConsumeNil() { 531 return nil, nil 532 } 533 534 out, err := m.ReadStringAsBytes(scratch) 535 if err != nil { 536 if tperr, ok := err.(TypeError); ok && tperr.Encoded == BinType { 537 return m.ReadBytes(scratch) 538 } 539 return nil, err 540 } 541 return out, nil 542 } 543 544 // MapKeyPtr returns a []byte pointing to the contents 545 // of a valid map key. The key cannot be empty, and it 546 // must be shorter than the total buffer size of the 547 // *Reader. Additionally, the returned slice is only 548 // valid until the next *Reader method call. Users 549 // should exercise extreme care when using this 550 // method; writing into the returned slice may 551 // corrupt future reads. 552 func (m *Reader) ReadMapKeyPtr() ([]byte, error) { 553 if m.checkAndConsumeNil() { 554 return nil, nil 555 } 556 557 p, err := m.R.Peek(1) 558 if err != nil { 559 return nil, err 560 } 561 lead := p[0] 562 var read int 563 if isfixstr(lead) { 564 read = int(rfixstr(lead)) 565 m.R.Skip(1) 566 goto fill 567 } 568 switch lead { 569 case mstr8, mbin8: 570 p, err = m.R.Next(2) 571 if err != nil { 572 return nil, err 573 } 574 read = int(p[1]) 575 case mstr16, mbin16: 576 p, err = m.R.Next(3) 577 if err != nil { 578 return nil, err 579 } 580 read = int(big.Uint16(p[1:])) 581 case mstr32, mbin32: 582 p, err = m.R.Next(5) 583 if err != nil { 584 return nil, err 585 } 586 read = int(big.Uint32(p[1:])) 587 default: 588 return nil, badPrefix(StrType, lead) 589 } 590 fill: 591 if read == 0 { 592 return nil, ErrShortBytes 593 } 594 return m.R.Next(read) 595 } 596 597 // ReadArrayHeader reads the next object as an 598 // array header and returns the size of the array 599 // and the number of bytes read. 600 func (m *Reader) ReadArrayHeader() (sz uint32, err error) { 601 if m.checkAndConsumeNil() { 602 return 0, nil 603 } 604 605 var lead byte 606 var p []byte 607 p, err = m.R.Peek(1) 608 if err != nil { 609 return 610 } 611 lead = p[0] 612 if isfixarray(lead) { 613 sz = uint32(rfixarray(lead)) 614 _, err = m.R.Skip(1) 615 return 616 } 617 switch lead { 618 case marray16: 619 p, err = m.R.Next(3) 620 if err != nil { 621 return 622 } 623 sz = uint32(big.Uint16(p[1:])) 624 return 625 626 case marray32: 627 p, err = m.R.Next(5) 628 if err != nil { 629 return 630 } 631 sz = big.Uint32(p[1:]) 632 return 633 634 default: 635 err = badPrefix(ArrayType, lead) 636 return 637 } 638 } 639 640 // ReadNil reads a 'nil' MessagePack byte from the reader 641 func (m *Reader) ReadNil() error { 642 if m.AlwaysNil { 643 return nil 644 } 645 p, err := m.R.Peek(1) 646 if err != nil { 647 return err 648 } 649 if p[0] != mnil { 650 return badPrefix(NilType, p[0]) 651 } 652 _, err = m.R.Skip(1) 653 return err 654 } 655 656 // checkAndConsumeNil returns true, nil if the 657 // m.AlwaysNil flag is true. 658 // 659 // Otherwise, checkAndConsumeNil returns true if the next byte 660 // was nil and we consumed it. We only consume 661 // the next byte if it was a nil. We return 662 // false if the next byte was not a nil. The 663 // error return value provides diagnostics. 664 func (m *Reader) checkAndConsumeNil() bool { 665 if m.AlwaysNil { 666 return true 667 } 668 p, err := m.R.Peek(1) 669 if err != nil { 670 return false 671 } 672 if p[0] != mnil { 673 return false //, badPrefix(NilType, p[0]) 674 } 675 _, _ = m.R.Skip(1) 676 return true 677 } 678 679 // ReadFloat64 reads a float64 from the reader. 680 // (If the value on the wire is encoded as a float32, 681 // it will be up-cast to a float64.) 682 func (m *Reader) ReadFloat64() (f float64, err error) { 683 if m.checkAndConsumeNil() { 684 return 0, nil 685 } 686 var p []byte 687 p, err = m.R.Peek(9) 688 if err != nil { 689 // we'll allow a coversion from float32 to float64, 690 // since we don't lose any precision 691 if err == io.EOF && len(p) > 0 && p[0] == mfloat32 { 692 ef, err := m.ReadFloat32() 693 return float64(ef), err 694 } 695 return 696 } 697 if p[0] != mfloat64 { 698 // see above 699 if p[0] == mfloat32 { 700 ef, err := m.ReadFloat32() 701 return float64(ef), err 702 } 703 err = badPrefix(Float64Type, p[0]) 704 return 705 } 706 f = math.Float64frombits(getMuint64(p)) 707 _, err = m.R.Skip(9) 708 return 709 } 710 711 // ReadFloat32 reads a float32 from the reader 712 func (m *Reader) ReadFloat32() (f float32, err error) { 713 if m.checkAndConsumeNil() { 714 return 0, nil 715 } 716 717 var p []byte 718 p, err = m.R.Peek(5) 719 if err != nil { 720 return 721 } 722 if p[0] != mfloat32 { 723 err = badPrefix(Float32Type, p[0]) 724 return 725 } 726 f = math.Float32frombits(getMuint32(p)) 727 _, err = m.R.Skip(5) 728 return 729 } 730 731 // ReadBool reads a bool from the reader 732 func (m *Reader) ReadBool() (b bool, err error) { 733 if m.checkAndConsumeNil() { 734 return false, nil 735 } 736 var p []byte 737 p, err = m.R.Peek(1) 738 if err != nil { 739 return 740 } 741 switch p[0] { 742 case mtrue: 743 b = true 744 case mfalse: 745 default: 746 err = badPrefix(BoolType, p[0]) 747 return 748 } 749 _, err = m.R.Skip(1) 750 return 751 } 752 753 // ReadInt64 reads an int64 from the reader 754 func (m *Reader) ReadInt64() (i int64, err error) { 755 if m.checkAndConsumeNil() { 756 return 0, nil 757 } 758 var p []byte 759 var lead byte 760 p, err = m.R.Peek(1) 761 if err != nil { 762 return 763 } 764 lead = p[0] 765 766 if isfixint(lead) { 767 i = int64(rfixint(lead)) 768 _, err = m.R.Skip(1) 769 return 770 } else if isnfixint(lead) { 771 i = int64(rnfixint(lead)) 772 _, err = m.R.Skip(1) 773 return 774 } 775 776 switch lead { 777 case mint8: 778 p, err = m.R.Next(2) 779 if err != nil { 780 return 781 } 782 i = int64(getMint8(p)) 783 return 784 785 case mint16: 786 p, err = m.R.Next(3) 787 if err != nil { 788 return 789 } 790 i = int64(getMint16(p)) 791 return 792 793 case mint32: 794 p, err = m.R.Next(5) 795 if err != nil { 796 return 797 } 798 i = int64(getMint32(p)) 799 return 800 801 case mint64: 802 p, err = m.R.Next(9) 803 if err != nil { 804 return 805 } 806 i = getMint64(p) 807 return 808 809 default: 810 err = badPrefix(IntType, lead) 811 return 812 } 813 } 814 815 // ReadInt32 reads an int32 from the reader 816 func (m *Reader) ReadInt32() (i int32, err error) { 817 if m.checkAndConsumeNil() { 818 return 0, nil 819 } 820 var in int64 821 in, err = m.ReadInt64() 822 if in > math.MaxInt32 || in < math.MinInt32 { 823 err = IntOverflow{Value: in, FailedBitsize: 32} 824 return 825 } 826 i = int32(in) 827 return 828 } 829 830 // ReadInt16 reads an int16 from the reader 831 func (m *Reader) ReadInt16() (i int16, err error) { 832 if m.checkAndConsumeNil() { 833 return 0, nil 834 } 835 var in int64 836 in, err = m.ReadInt64() 837 if in > math.MaxInt16 || in < math.MinInt16 { 838 err = IntOverflow{Value: in, FailedBitsize: 16} 839 return 840 } 841 i = int16(in) 842 return 843 } 844 845 // ReadInt8 reads an int8 from the reader 846 func (m *Reader) ReadInt8() (i int8, err error) { 847 if m.checkAndConsumeNil() { 848 return 0, nil 849 } 850 var in int64 851 in, err = m.ReadInt64() 852 if in > math.MaxInt8 || in < math.MinInt8 { 853 err = IntOverflow{Value: in, FailedBitsize: 8} 854 return 855 } 856 i = int8(in) 857 return 858 } 859 860 // ReadInt reads an int from the reader 861 func (m *Reader) ReadInt() (i int, err error) { 862 if m.checkAndConsumeNil() { 863 return 0, nil 864 } 865 if smallint { 866 var in int32 867 in, err = m.ReadInt32() 868 i = int(in) 869 return 870 } 871 var in int64 872 in, err = m.ReadInt64() 873 i = int(in) 874 return 875 } 876 877 // ReadUint64 reads a uint64 from the reader 878 func (m *Reader) ReadUint64() (u uint64, err error) { 879 if m.checkAndConsumeNil() { 880 return 0, nil 881 } 882 var p []byte 883 var lead byte 884 p, err = m.R.Peek(1) 885 if err != nil { 886 return 887 } 888 lead = p[0] 889 if isfixint(lead) { 890 u = uint64(rfixint(lead)) 891 _, err = m.R.Skip(1) 892 return 893 } 894 switch lead { 895 case muint8: 896 p, err = m.R.Next(2) 897 if err != nil { 898 return 899 } 900 u = uint64(getMuint8(p)) 901 return 902 903 case muint16: 904 p, err = m.R.Next(3) 905 if err != nil { 906 return 907 } 908 u = uint64(getMuint16(p)) 909 return 910 911 case muint32: 912 p, err = m.R.Next(5) 913 if err != nil { 914 return 915 } 916 u = uint64(getMuint32(p)) 917 return 918 919 case muint64: 920 p, err = m.R.Next(9) 921 if err != nil { 922 return 923 } 924 u = getMuint64(p) 925 return 926 927 default: 928 err = badPrefix(UintType, lead) 929 return 930 931 } 932 } 933 934 // ReadUint32 reads a uint32 from the reader 935 func (m *Reader) ReadUint32() (u uint32, err error) { 936 if m.checkAndConsumeNil() { 937 return 0, nil 938 } 939 var in uint64 940 in, err = m.ReadUint64() 941 if in > math.MaxUint32 { 942 err = UintOverflow{Value: in, FailedBitsize: 32} 943 return 944 } 945 u = uint32(in) 946 return 947 } 948 949 // ReadUint16 reads a uint16 from the reader 950 func (m *Reader) ReadUint16() (u uint16, err error) { 951 if m.checkAndConsumeNil() { 952 return 0, nil 953 } 954 var in uint64 955 in, err = m.ReadUint64() 956 if in > math.MaxUint16 { 957 err = UintOverflow{Value: in, FailedBitsize: 16} 958 return 959 } 960 u = uint16(in) 961 return 962 } 963 964 // ReadUint8 reads a uint8 from the reader 965 func (m *Reader) ReadUint8() (u uint8, err error) { 966 if m.checkAndConsumeNil() { 967 return 0, nil 968 } 969 var in uint64 970 in, err = m.ReadUint64() 971 if in > math.MaxUint8 { 972 err = UintOverflow{Value: in, FailedBitsize: 8} 973 return 974 } 975 u = uint8(in) 976 return 977 } 978 979 // ReadUint reads a uint from the reader 980 func (m *Reader) ReadUint() (u uint, err error) { 981 if m.checkAndConsumeNil() { 982 return 0, nil 983 } 984 if smallint { 985 var un uint32 986 un, err = m.ReadUint32() 987 u = uint(un) 988 return 989 } 990 var un uint64 991 un, err = m.ReadUint64() 992 u = uint(un) 993 return 994 } 995 996 // ReadByte is analogous to ReadUint8. 997 // 998 // NOTE: this is *not* an implementation 999 // of io.ByteReader. 1000 func (m *Reader) ReadByte() (b byte, err error) { 1001 if m.checkAndConsumeNil() { 1002 return 0, nil 1003 } 1004 var in uint64 1005 in, err = m.ReadUint64() 1006 if in > math.MaxUint8 { 1007 err = UintOverflow{Value: in, FailedBitsize: 8} 1008 return 1009 } 1010 b = byte(in) 1011 return 1012 } 1013 1014 // ReadBytes reads a MessagePack 'bin' object 1015 // from the reader and returns its value. It may 1016 // use 'scratch' for storage if it is non-nil. 1017 func (m *Reader) ReadBytes(scratch []byte) (b []byte, err error) { 1018 if m.checkAndConsumeNil() { 1019 return nil, nil 1020 } 1021 var p []byte 1022 var lead byte 1023 p, err = m.R.Peek(2) 1024 if err != nil { 1025 return 1026 } 1027 lead = p[0] 1028 var read int64 1029 switch lead { 1030 case mbin8: 1031 read = int64(p[1]) 1032 m.R.Skip(2) 1033 case mbin16: 1034 p, err = m.R.Next(3) 1035 if err != nil { 1036 return 1037 } 1038 read = int64(big.Uint16(p[1:])) 1039 case mbin32: 1040 p, err = m.R.Next(5) 1041 if err != nil { 1042 return 1043 } 1044 read = int64(big.Uint32(p[1:])) 1045 default: 1046 err = badPrefix(BinType, lead) 1047 return 1048 } 1049 if int64(cap(scratch)) < read { 1050 b = make([]byte, read) 1051 } else { 1052 b = scratch[0:read] 1053 } 1054 _, err = m.R.ReadFull(b) 1055 return 1056 } 1057 1058 // ReadBytesHeader reads the size header 1059 // of a MessagePack 'bin' object. The user 1060 // is responsible for dealing with the next 1061 // 'sz' bytes from the reader in an application-specific 1062 // way. 1063 func (m *Reader) ReadBytesHeader() (sz uint32, err error) { 1064 if m.checkAndConsumeNil() { 1065 return 0, nil 1066 } 1067 1068 var p []byte 1069 p, err = m.R.Peek(1) 1070 if err != nil { 1071 return 1072 } 1073 switch p[0] { 1074 case mbin8: 1075 p, err = m.R.Next(2) 1076 if err != nil { 1077 return 1078 } 1079 sz = uint32(p[1]) 1080 return 1081 case mbin16: 1082 p, err = m.R.Next(3) 1083 if err != nil { 1084 return 1085 } 1086 sz = uint32(big.Uint16(p[1:])) 1087 return 1088 case mbin32: 1089 p, err = m.R.Next(5) 1090 if err != nil { 1091 return 1092 } 1093 sz = uint32(big.Uint32(p[1:])) 1094 return 1095 default: 1096 err = badPrefix(BinType, p[0]) 1097 return 1098 } 1099 } 1100 1101 // ReadExactBytes reads a MessagePack 'bin'-encoded 1102 // object off of the wire into the provided slice. An 1103 // ArrayError will be returned if the object is not 1104 // exactly the length of the input slice. 1105 func (m *Reader) ReadExactBytes(into []byte) error { 1106 if m.checkAndConsumeNil() { 1107 for i := range into { 1108 into[i] = 0 1109 } 1110 return nil 1111 } 1112 1113 p, err := m.R.Peek(2) 1114 if err != nil { 1115 return err 1116 } 1117 lead := p[0] 1118 var read int64 // bytes to read 1119 var skip int // prefix size to skip 1120 switch lead { 1121 case mbin8: 1122 read = int64(p[1]) 1123 skip = 2 1124 case mbin16: 1125 p, err = m.R.Peek(3) 1126 if err != nil { 1127 return err 1128 } 1129 read = int64(big.Uint16(p[1:])) 1130 skip = 3 1131 case mbin32: 1132 p, err = m.R.Peek(5) 1133 if err != nil { 1134 return err 1135 } 1136 read = int64(big.Uint32(p[1:])) 1137 skip = 5 1138 default: 1139 return badPrefix(BinType, lead) 1140 } 1141 if read != int64(len(into)) { 1142 return ArrayError{Wanted: uint32(len(into)), Got: uint32(read)} 1143 } 1144 m.R.Skip(skip) 1145 _, err = m.R.ReadFull(into) 1146 return err 1147 } 1148 1149 // ReadStringAsBytes reads a MessagePack 'str' (utf-8) string 1150 // and returns its value as bytes. It may use 'scratch' for storage 1151 // if it is non-nil. 1152 func (m *Reader) ReadStringAsBytes(scratch []byte) (b []byte, err error) { 1153 if m.checkAndConsumeNil() { 1154 return nil, nil 1155 } 1156 1157 var p []byte 1158 var lead byte 1159 p, err = m.R.Peek(1) 1160 if err != nil { 1161 return 1162 } 1163 lead = p[0] 1164 var read int64 1165 1166 if isfixstr(lead) { 1167 read = int64(rfixstr(lead)) 1168 m.R.Skip(1) 1169 goto fill 1170 } 1171 1172 switch lead { 1173 case mstr8: 1174 p, err = m.R.Next(2) 1175 if err != nil { 1176 return 1177 } 1178 read = int64(uint8(p[1])) 1179 case mstr16: 1180 p, err = m.R.Next(3) 1181 if err != nil { 1182 return 1183 } 1184 read = int64(big.Uint16(p[1:])) 1185 case mstr32: 1186 p, err = m.R.Next(5) 1187 if err != nil { 1188 return 1189 } 1190 read = int64(big.Uint32(p[1:])) 1191 default: 1192 err = badPrefix(StrType, lead) 1193 return 1194 } 1195 fill: 1196 if int64(cap(scratch)) < read { 1197 b = make([]byte, read) 1198 } else { 1199 b = scratch[0:read] 1200 } 1201 _, err = m.R.ReadFull(b) 1202 return 1203 } 1204 1205 // ReadStringHeader reads a string header 1206 // off of the wire. The user is then responsible 1207 // for dealing with the next 'sz' bytes from 1208 // the reader in an application-specific manner. 1209 func (m *Reader) ReadStringHeader() (sz uint32, err error) { 1210 if m.checkAndConsumeNil() { 1211 return 0, nil 1212 } 1213 1214 var p []byte 1215 p, err = m.R.Peek(1) 1216 if err != nil { 1217 return 1218 } 1219 lead := p[0] 1220 if isfixstr(lead) { 1221 sz = uint32(rfixstr(lead)) 1222 m.R.Skip(1) 1223 return 1224 } 1225 switch lead { 1226 case mstr8: 1227 p, err = m.R.Next(2) 1228 if err != nil { 1229 return 1230 } 1231 sz = uint32(p[1]) 1232 return 1233 case mstr16: 1234 p, err = m.R.Next(3) 1235 if err != nil { 1236 return 1237 } 1238 sz = uint32(big.Uint16(p[1:])) 1239 return 1240 case mstr32: 1241 p, err = m.R.Next(5) 1242 if err != nil { 1243 return 1244 } 1245 sz = big.Uint32(p[1:]) 1246 return 1247 default: 1248 err = badPrefix(StrType, lead) 1249 return 1250 } 1251 } 1252 1253 // ReadString reads a utf-8 string from the reader 1254 func (m *Reader) ReadString() (s string, err error) { 1255 if m.checkAndConsumeNil() { 1256 return "", nil 1257 } 1258 1259 var p []byte 1260 var lead byte 1261 var read int64 1262 p, err = m.R.Peek(1) 1263 if err != nil { 1264 return 1265 } 1266 lead = p[0] 1267 1268 if isfixstr(lead) { 1269 read = int64(rfixstr(lead)) 1270 m.R.Skip(1) 1271 goto fill 1272 } 1273 1274 switch lead { 1275 case mstr8: 1276 p, err = m.R.Next(2) 1277 if err != nil { 1278 return 1279 } 1280 read = int64(uint8(p[1])) 1281 case mstr16: 1282 p, err = m.R.Next(3) 1283 if err != nil { 1284 return 1285 } 1286 read = int64(big.Uint16(p[1:])) 1287 case mstr32: 1288 p, err = m.R.Next(5) 1289 if err != nil { 1290 return 1291 } 1292 read = int64(big.Uint32(p[1:])) 1293 default: 1294 err = badPrefix(StrType, lead) 1295 return 1296 } 1297 fill: 1298 if read == 0 { 1299 s, err = "", nil 1300 return 1301 } 1302 // reading into the memory 1303 // that will become the string 1304 // itself has vastly superior 1305 // worst-case performance, because 1306 // the reader buffer doesn't have 1307 // to be large enough to hold the string. 1308 // the idea here is to make it more 1309 // difficult for someone malicious 1310 // to cause the system to run out of 1311 // memory by sending very large strings. 1312 // 1313 // NOTE: this works because the argument 1314 // passed to (*fwd.Reader).ReadFull escapes 1315 // to the heap; its argument may, in turn, 1316 // be passed to the underlying reader, and 1317 // thus escape analysis *must* conclude that 1318 // 'out' escapes. 1319 out := make([]byte, read) 1320 _, err = m.R.ReadFull(out) 1321 if err != nil { 1322 return 1323 } 1324 s = UnsafeString(out) 1325 return 1326 } 1327 1328 // ReadComplex64 reads a complex64 from the reader 1329 func (m *Reader) ReadComplex64() (f complex64, err error) { 1330 if m.checkAndConsumeNil() { 1331 return 0, nil 1332 } 1333 var p []byte 1334 p, err = m.R.Peek(10) 1335 if err != nil { 1336 return 1337 } 1338 if p[0] != mfixext8 { 1339 err = badPrefix(Complex64Type, p[0]) 1340 return 1341 } 1342 if int8(p[1]) != Complex64Extension { 1343 err = errExt(int8(p[1]), Complex64Extension) 1344 return 1345 } 1346 f = complex(math.Float32frombits(big.Uint32(p[2:])), 1347 math.Float32frombits(big.Uint32(p[6:]))) 1348 _, err = m.R.Skip(10) 1349 return 1350 } 1351 1352 // ReadComplex128 reads a complex128 from the reader 1353 func (m *Reader) ReadComplex128() (f complex128, err error) { 1354 if m.checkAndConsumeNil() { 1355 return 0, nil 1356 } 1357 1358 var p []byte 1359 p, err = m.R.Peek(18) 1360 if err != nil { 1361 return 1362 } 1363 if p[0] != mfixext16 { 1364 err = badPrefix(Complex128Type, p[0]) 1365 return 1366 } 1367 if int8(p[1]) != Complex128Extension { 1368 err = errExt(int8(p[1]), Complex128Extension) 1369 return 1370 } 1371 f = complex(math.Float64frombits(big.Uint64(p[2:])), 1372 math.Float64frombits(big.Uint64(p[10:]))) 1373 _, err = m.R.Skip(18) 1374 return 1375 } 1376 1377 // ReadMapStrIntf reads a MessagePack map into a map[string]interface{}. 1378 // (You must pass a non-nil map into the function.) 1379 func (m *Reader) ReadMapStrIntf(mp map[string]interface{}) (err error) { 1380 if m.checkAndConsumeNil() { 1381 return nil 1382 } 1383 1384 var sz uint32 1385 sz, err = m.ReadMapHeader() 1386 if err != nil { 1387 return 1388 } 1389 for key := range mp { 1390 delete(mp, key) 1391 } 1392 for i := uint32(0); i < sz; i++ { 1393 var key string 1394 var val interface{} 1395 key, err = m.ReadString() 1396 if err != nil { 1397 return 1398 } 1399 val, err = m.ReadIntf() 1400 if err != nil { 1401 return 1402 } 1403 mp[key] = val 1404 } 1405 return 1406 } 1407 1408 // ReadTime reads a time.Time object from the reader. 1409 // The returned time's location will be set to time.Local. 1410 func (m *Reader) ReadTime() (t time.Time, err error) { 1411 if m.checkAndConsumeNil() { 1412 return time.Time{}, nil 1413 } 1414 var p []byte 1415 p, err = m.R.Peek(15) 1416 if err != nil { 1417 return 1418 } 1419 if p[0] != mext8 || p[1] != 12 { 1420 err = badPrefix(TimeType, p[0]) 1421 return 1422 } 1423 if int8(p[2]) != TimeExtension { 1424 err = errExt(int8(p[2]), TimeExtension) 1425 return 1426 } 1427 sec, nsec := getUnix(p[3:]) 1428 t = time.Unix(sec, int64(nsec)).Local() 1429 _, err = m.R.Skip(15) 1430 return 1431 } 1432 1433 // ReadIntf reads out the next object as a raw interface{}. 1434 // Arrays are decoded as []interface{}, and maps are decoded 1435 // as map[string]interface{}. Integers are decoded as int64 1436 // and unsigned integers are decoded as uint64. 1437 func (m *Reader) ReadIntf() (i interface{}, err error) { 1438 if m.checkAndConsumeNil() { 1439 return 1440 } 1441 var t Type 1442 t, err = m.NextType() 1443 if err != nil { 1444 return 1445 } 1446 switch t { 1447 case BoolType: 1448 i, err = m.ReadBool() 1449 return 1450 1451 case IntType: 1452 i, err = m.ReadInt64() 1453 return 1454 1455 case UintType: 1456 i, err = m.ReadUint64() 1457 return 1458 1459 case BinType: 1460 i, err = m.ReadBytes(nil) 1461 return 1462 1463 case StrType: 1464 i, err = m.ReadString() 1465 return 1466 1467 case Complex64Type: 1468 i, err = m.ReadComplex64() 1469 return 1470 1471 case Complex128Type: 1472 i, err = m.ReadComplex128() 1473 return 1474 1475 case TimeType: 1476 i, err = m.ReadTime() 1477 return 1478 1479 case ExtensionType: 1480 var t int8 1481 t, err = m.peekExtensionType() 1482 if err != nil { 1483 return 1484 } 1485 f, ok := extensionReg[t] 1486 if ok { 1487 e := f() 1488 err = m.ReadExtension(e) 1489 i = e 1490 return 1491 } 1492 var e RawExtension 1493 e.Type = t 1494 err = m.ReadExtension(&e) 1495 i = &e 1496 return 1497 1498 case MapType: 1499 mp := make(map[string]interface{}) 1500 err = m.ReadMapStrIntf(mp) 1501 i = mp 1502 return 1503 1504 case NilType: 1505 err = m.ReadNil() 1506 i = nil 1507 return 1508 1509 case Float32Type: 1510 i, err = m.ReadFloat32() 1511 return 1512 1513 case Float64Type: 1514 i, err = m.ReadFloat64() 1515 return 1516 1517 case ArrayType: 1518 var sz uint32 1519 sz, err = m.ReadArrayHeader() 1520 1521 if err != nil { 1522 return 1523 } 1524 out := make([]interface{}, int(sz)) 1525 for j := range out { 1526 out[j], err = m.ReadIntf() 1527 if err != nil { 1528 return 1529 } 1530 } 1531 i = out 1532 return 1533 1534 default: 1535 return nil, fatal // unreachable 1536 } 1537 }