File tree Expand file tree Collapse file tree 2 files changed +26
-0
lines changed
Expand file tree Collapse file tree 2 files changed +26
-0
lines changed Original file line number Diff line number Diff line change @@ -501,6 +501,16 @@ cdef class Unpacker(object):
501501 else :
502502 raise ValueError (" Unpack failed: error = %d " % (ret,))
503503
504+ def read_bytes (self , Py_ssize_t nbytes ):
505+ """ read a specified number of raw bytes from the stream"""
506+ cdef size_t nread
507+ nread = min (self .buf_tail - self .buf_head, nbytes)
508+ ret = PyBytes_FromStringAndSize(self .buf + self .buf_head, nread)
509+ self .buf_head += nread
510+ if len (ret) < nbytes and self .file_like is not None :
511+ ret += self .file_like.read(nbytes - len (ret))
512+ return ret
513+
504514 def unpack (self , object write_bytes = None ):
505515 """
506516 unpack one object
Original file line number Diff line number Diff line change 11#!/usr/bin/env python
22# coding: utf-8
33
4+ import six
45from msgpack import Unpacker , BufferFull
56import nose
67
@@ -56,5 +57,20 @@ def test_maxbuffersize():
5657 assert ord ('b' ) == next (unpacker )
5758
5859
60+ def test_readbytes ():
61+ unpacker = Unpacker (read_size = 3 )
62+ unpacker .feed (b'foobar' )
63+ assert unpacker .unpack () == ord (b'f' )
64+ assert unpacker .read_bytes (3 ) == b'oob'
65+ assert unpacker .unpack () == ord (b'a' )
66+ assert unpacker .unpack () == ord (b'r' )
67+
68+ # Test buffer refill
69+ unpacker = Unpacker (six .BytesIO (b'foobar' ), read_size = 3 )
70+ assert unpacker .unpack () == ord (b'f' )
71+ assert unpacker .read_bytes (3 ) == b'oob'
72+ assert unpacker .unpack () == ord (b'a' )
73+ assert unpacker .unpack () == ord (b'r' )
74+
5975if __name__ == '__main__' :
6076 nose .main ()
You can’t perform that action at this time.
0 commit comments