File tree Expand file tree Collapse file tree 2 files changed +21
-7
lines changed
Expand file tree Collapse file tree 2 files changed +21
-7
lines changed Original file line number Diff line number Diff line change @@ -458,13 +458,11 @@ cdef class Unpacker(object):
458458 def read_bytes (self , Py_ssize_t nbytes ):
459459 """ read a specified number of raw bytes from the stream"""
460460 cdef size_t nread
461- ret = ' '
462- while len (ret) < nbytes and self .file_like is not None :
463- if self .buf_head == self .buf_tail:
464- self .fill_buffer()
465- nread = min (self .buf_tail - self .buf_head, nbytes - len (ret))
466- ret += PyBytes_FromStringAndSize(self .buf + self .buf_head, nread)
467- self .buf_head += nread
461+ nread = min (self .buf_tail - self .buf_head, nbytes)
462+ ret = PyBytes_FromStringAndSize(self .buf + self .buf_head, nread)
463+ self .buf_head += nread
464+ if len (ret) < nbytes and self .file_like is not None :
465+ ret += self .file_like.read(nbytes - len (ret))
468466 return ret
469467
470468 def __iter__ (self ):
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
@@ -42,5 +43,20 @@ def test_maxbuffersize():
4243 assert ord ('b' ) == next (unpacker )
4344
4445
46+ def test_readbytes ():
47+ unpacker = Unpacker (read_size = 3 )
48+ unpacker .feed (b'foobar' )
49+ assert unpacker .unpack () == ord (b'f' )
50+ assert unpacker .read_bytes (3 ) == b'oob'
51+ assert unpacker .unpack () == ord (b'a' )
52+ assert unpacker .unpack () == ord (b'r' )
53+
54+ # Test buffer refill
55+ unpacker = Unpacker (six .BytesIO (b'foobar' ), read_size = 3 )
56+ assert unpacker .unpack () == ord (b'f' )
57+ assert unpacker .read_bytes (3 ) == b'oob'
58+ assert unpacker .unpack () == ord (b'a' )
59+ assert unpacker .unpack () == ord (b'r' )
60+
4561if __name__ == '__main__' :
4662 nose .main ()
You can’t perform that action at this time.
0 commit comments