From 9d61f243878eeabd2042bb16fe22d4325e441da6 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Thu, 13 Feb 2014 03:10:51 +0900 Subject: Feed data from file before _unpack() --- msgpack/_unpacker.pyx | 10 ++++++++++ test/test_unpack_file.py | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 test/test_unpack_file.py diff --git a/msgpack/_unpacker.pyx b/msgpack/_unpacker.pyx index 732adef..16aca5c 100644 --- a/msgpack/_unpacker.pyx +++ b/msgpack/_unpacker.pyx @@ -327,8 +327,18 @@ cdef class Unpacker(object): cdef int ret cdef object obj cdef size_t prev_head + + if self.buf_head >= self.buf_tail and self.file_like is not None: + self.read_from_file() + while 1: prev_head = self.buf_head + if prev_head >= self.buf_tail: + if iter: + raise StopIteration("No more data to unpack.") + else: + raise OutOfData("No more data to unpack.") + ret = execute(&self.ctx, self.buf, self.buf_tail, &self.buf_head) if write_bytes is not None: write_bytes(PyBytes_FromStringAndSize(self.buf + prev_head, self.buf_head - prev_head)) diff --git a/test/test_unpack_file.py b/test/test_unpack_file.py new file mode 100644 index 0000000..1563008 --- /dev/null +++ b/test/test_unpack_file.py @@ -0,0 +1,19 @@ +from io import BytesIO +from msgpack import Unpacker, packb, OutOfData +from pytest import raises + + +def test_unpack_array_header_from_file(): + f = BytesIO(packb([1,2,3,4])) + unpacker = Unpacker(f) + assert unpacker.read_array_header() == 4 + assert unpacker.unpack() == 1 + assert unpacker.unpack() == 2 + assert unpacker.unpack() == 3 + assert unpacker.unpack() == 4 + with raises(OutOfData): + unpacker.unpack() + + +if __name__ == '__main__': + test_unpack_array_header_from_file() -- cgit v1.2.1