summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--msgpack/_msgpack.pyx24
-rw-r--r--msgpack/exceptions.py23
-rw-r--r--test/test_read_size.py6
-rw-r--r--test/test_sequnpack.py5
4 files changed, 45 insertions, 13 deletions
diff --git a/msgpack/_msgpack.pyx b/msgpack/_msgpack.pyx
index 5c202fc..da70f0d 100644
--- a/msgpack/_msgpack.pyx
+++ b/msgpack/_msgpack.pyx
@@ -38,8 +38,13 @@ cdef extern from "pack.h":
cdef int DEFAULT_RECURSE_LIMIT=511
-class BufferFull(Exception):
- pass
+from msgpack.exceptions import (
+ UnpackException,
+ BufferFull,
+ OutOfData,
+ UnpackValueError,
+ ExtraData,
+ )
cdef class Packer(object):
@@ -102,7 +107,7 @@ cdef class Packer(object):
cdef dict d
if nest_limit < 0:
- raise ValueError("Too deep.")
+ raise UnpackValueError("recursion limit exceeded.")
if o is None:
ret = msgpack_pack_nil(&self.pk)
@@ -296,7 +301,7 @@ def unpackb(object packed, object object_hook=None, object list_hook=None,
if ret == 1:
obj = template_data(&ctx)
if off < buf_len:
- raise ValueError("Extra data.")
+ raise ExtraData(obj, PyBytes_FromStringAndSize(buf+off, buf_len-off))
return obj
else:
return None
@@ -425,7 +430,7 @@ cdef class Unpacker(object):
cdef Py_ssize_t buf_len
if self.file_like is not None:
raise AssertionError(
- "unpacker.feed() is not be able to use with`file_like`.")
+ "unpacker.feed() is not be able to use with `file_like`.")
PyObject_AsReadBuffer(next_bytes, <const_void_ptr*>&buf, &buf_len)
self.append_buffer(buf, buf_len)
@@ -479,7 +484,7 @@ cdef class Unpacker(object):
else:
self.file_like = None
- cdef object _unpack(self, execute_fn execute, object write_bytes):
+ cdef object _unpack(self, execute_fn execute, object write_bytes, bint iter=0):
cdef int ret
cdef object obj
cdef size_t prev_head
@@ -497,7 +502,10 @@ cdef class Unpacker(object):
if self.file_like is not None:
self.read_from_file()
continue
- raise StopIteration("No more data to unpack.")
+ if iter:
+ raise StopIteration("No more data to unpack.")
+ else:
+ raise OutOfData("No more data to unpack.")
else:
raise ValueError("Unpack failed: error = %d" % (ret,))
@@ -539,7 +547,7 @@ cdef class Unpacker(object):
return self
def __next__(self):
- return self._unpack(template_construct, None)
+ return self._unpack(template_construct, None, 1)
# for debug.
#def _buf(self):
diff --git a/msgpack/exceptions.py b/msgpack/exceptions.py
new file mode 100644
index 0000000..0a75430
--- /dev/null
+++ b/msgpack/exceptions.py
@@ -0,0 +1,23 @@
+class UnpackException(Exception):
+ pass
+
+
+class BufferFull(UnpackException):
+ pass
+
+
+class OutOfData(UnpackException):
+ pass
+
+
+class UnpackValueError(UnpackException, ValueError):
+ pass
+
+
+class ExtraData(ValueError):
+ def __init__(self, unpacked, extra):
+ self.unpacked = unpacked
+ self.extra = extra
+
+ def __str__(self):
+ return "unpack(b) recieved extra data."
diff --git a/test/test_read_size.py b/test/test_read_size.py
index e130805..4e6c2b9 100644
--- a/test/test_read_size.py
+++ b/test/test_read_size.py
@@ -1,5 +1,5 @@
"""Test Unpacker's read_array_header and read_map_header methods"""
-from msgpack import packb, Unpacker
+from msgpack import packb, Unpacker, OutOfData
UnexpectedTypeException = ValueError
def test_read_array_header():
@@ -12,7 +12,7 @@ def test_read_array_header():
try:
unpacker.unpack()
assert 0, 'should raise exception'
- except StopIteration:
+ except OutOfData:
assert 1, 'okay'
@@ -25,7 +25,7 @@ def test_read_map_header():
try:
unpacker.unpack()
assert 0, 'should raise exception'
- except StopIteration:
+ except OutOfData:
assert 1, 'okay'
def test_incorrect_type_array():
diff --git a/test/test_sequnpack.py b/test/test_sequnpack.py
index 769f3ff..f767726 100644
--- a/test/test_sequnpack.py
+++ b/test/test_sequnpack.py
@@ -3,6 +3,7 @@
import six
from msgpack import Unpacker, BufferFull
+from msgpack.exceptions import OutOfData
import nose
def test_foobar():
@@ -17,7 +18,7 @@ def test_foobar():
try:
o = unpacker.unpack()
assert 0, "should raise exception"
- except StopIteration:
+ except OutOfData:
assert 1, "ok"
unpacker.feed(b'foo')
@@ -41,7 +42,7 @@ def test_foobar_skip():
try:
o = unpacker.unpack()
assert 0, "should raise exception"
- except StopIteration:
+ except OutOfData:
assert 1, "ok"
def test_maxbuffersize():