diff --git a/minijson.pyx b/minijson.pyx index 44ba8c6791c9b91e11431230c4cb78df50b793f7..4fde182c10eeffaed9f0037f2e335c7ff60c8245 100644 --- a/minijson.pyx +++ b/minijson.pyx @@ -408,13 +408,10 @@ cpdef int dump(object data, cio: io.BytesIO) except -1: cio.write(b'\x12') cio.write(STRUCT_L.pack(length)) length = 5 - try: - for field_name, elem in data.items(): - cio.write(bytearray([len(field_name)])) - cio.write(field_name.encode('utf-8')) - length += dump(elem, cio) - except TypeError as e: - raise EncodingError('Keys have to be strings!') from e + for field_name, elem in data.items(): + cio.write(bytearray([len(field_name)])) + cio.write(field_name.encode('utf-8')) + length += dump(elem, cio) return length else: if length <= 0xF: @@ -432,7 +429,7 @@ cpdef int dump(object data, cio: io.BytesIO) except -1: cio.write(STRUCT_L.pack(length)) offset = 5 else: - raise EncodingError('Too long of a string!') + raise EncodingError('Too long of a sdict!') for key, value in data.items(): offset += dump(key, cio) diff --git a/tests/test_minijson.py b/tests/test_minijson.py index 8e78e3c6fae88a41f7c8c1f4778c6afcb4c34e7c..8181d05ef0f1af95be072d76edb06360ae468ea6 100644 --- a/tests/test_minijson.py +++ b/tests/test_minijson.py @@ -50,6 +50,13 @@ class TestMiniJSON(unittest.TestCase): self.assertSameAfterDumpsAndLoads(c) self.assertSameAfterDumpsAndLoads(d) + def test_too_long_string(self): + class Test(str): + def __len__(self): + return 0x1FFFFFFFF + + self.assertRaises(EncodingError, lambda: dumps(Test())) + def test_lists(self): a = [None]*4 self.assertSameAfterDumpsAndLoads(a) @@ -87,11 +94,19 @@ class TestMiniJSON(unittest.TestCase): a = list(range(0x1FFFF)) self.assertSameAfterDumpsAndLoads(a) + def test_weird_dict(self): + key = 'a'*300 + a = {key: 2} + self.assertSameAfterDumpsAndLoads(a) + def test_negatives(self): self.assertSameAfterDumpsAndLoads(-1) self.assertSameAfterDumpsAndLoads(-259) self.assertSameAfterDumpsAndLoads(-0x7FFF) self.assertSameAfterDumpsAndLoads(-0xFFFF) + self.assertSameAfterDumpsAndLoads(0x1FFFF) + self.assertSameAfterDumpsAndLoads(0x1FFFFFF) + self.assertRaises(EncodingError, lambda: dumps(0xFFFFFFFFF)) def test_dumps(self): v = {"name": "land", "operator_id": "dupa", "parameters": @@ -99,8 +114,10 @@ class TestMiniJSON(unittest.TestCase): self.assertSameAfterDumpsAndLoads(v) def test_loads_exception(self): - b = b'\x1F' - self.assertRaises(DecodingError, lambda: loads(b)) + self.assertRaises(DecodingError, lambda: loads(b'\x1F')) + self.assertRaises(DecodingError, lambda: loads(b'\x00\x01')) + self.assertRaises(DecodingError, lambda: loads(b'\x00\x01\xFF')) + self.assertRaises(DecodingError, lambda: loads(b'\x81\xFF')) def test_loads(self): a = loads(b'\x0B\x03\x04name\x84land\x0Boperator_id\x84dupa\x0Aparameters\x0B\x03\x03lat\x09B4\xeb\x85\x03lon\x09B[33\x03alt\x09Cj\x00\x00')