summaryrefslogtreecommitdiff
blob: 34b8f4aa9e29c91f8acff220b1cd3b8d92edcbaf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
commit 1145be6cac70ed065f2053977d470f3f771ac6a0
Author: Tyler Kennedy <tk@tkte.ch>
Date:   Sun May 23 15:55:28 2021 -0400

    Empty buffers now raise identical error to empty bytes. Closes #81.

diff --git a/simdjson/csimdjson.pyx b/simdjson/csimdjson.pyx
index 095a183..c278e08 100644
--- a/simdjson/csimdjson.pyx
+++ b/simdjson/csimdjson.pyx
@@ -478,6 +478,13 @@ cdef class Parser:
             # type-specific APIs, but gives much greater compatibility.
             data = src
 
+            if data.size == 0:
+                # If we were given a completely empty buffer, trying to access
+                # a stride in the next step will cause a (potentially
+                # confusing) IndexError. This isn't a very good error message,
+                # but it's identical to the one simdjson would have raised.
+                raise ValueError('Empty: no JSON found')
+
             return element_to_primitive(
                 self,
                 dereference(self.c_parser).parse(
diff --git a/tests/test_parser.py b/tests/test_parser.py
index 88e7207..d3a28c7 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -1,3 +1,4 @@
+import io
 import pathlib
 
 import pytest
@@ -32,6 +33,19 @@ def test_parse_str(parser):
     assert doc.as_dict() == {'hello': 'world'}
 
 
+def test_parse_empty_buffer(parser):
+    """Ensure trying to parse an empty buffer returns an error consistent
+    with attempting to parse an empty bytestring."""
+    # Issue #81
+    with pytest.raises(ValueError) as bytes_exc:
+        parser.parse(b'')
+
+    with pytest.raises(ValueError) as buffer_exc:
+        parser.parse(io.BytesIO(b'').getbuffer())
+
+    assert str(bytes_exc.value) == str(buffer_exc.value)
+
+
 def test_unicode_decode_error(parser):
     """Ensure the parser raises encoding issues."""
     with pytest.raises(UnicodeDecodeError):