summary refs log tree commit diff stats
path: root/lib/pure
diff options
context:
space:
mode:
authorLolo Iccl <oxisccl@gmail.com>2017-01-11 14:50:18 +0900
committerAndreas Rumpf <rumpf_a@web.de>2017-01-11 06:50:18 +0100
commitabe5cb82a0152cceaeaa2c763ad9ef8c793ea597 (patch)
tree10a2ff975045d458a8fc6f9b5cea9305f14b0e2e /lib/pure
parentda1293c405c3323430cf7dc0f1abcd025b6fe70c (diff)
downloadNim-abe5cb82a0152cceaeaa2c763ad9ef8c793ea597.tar.gz
Fix for #5134 (parseJson(string) should fail on leftover data) (#5203)
Diffstat (limited to 'lib/pure')
-rw-r--r--lib/pure/json.nim18
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim
index 5fff7352f..5e36a2aa1 100644
--- a/lib/pure/json.nim
+++ b/lib/pure/json.nim
@@ -1175,18 +1175,22 @@ when not defined(js):
   proc parseJson*(s: Stream, filename: string): JsonNode =
     ## Parses from a stream `s` into a `JsonNode`. `filename` is only needed
     ## for nice error messages.
+    ## If `s` contains extra data, it will raising `JsonParsingError`.
     var p: JsonParser
     p.open(s, filename)
     defer: p.close()
     discard getTok(p) # read first token
     result = p.parseJson()
+    eat(p, tkEof) # check there are no exstra data
 
   proc parseJson*(buffer: string): JsonNode =
     ## Parses JSON from `buffer`.
+    ## If `buffer` contains extra data, it will raising `JsonParsingError`.
     result = parseJson(newStringStream(buffer), "input")
 
   proc parseFile*(filename: string): JsonNode =
     ## Parses `file` into a `JsonNode`.
+    ## If `file` contains extra data, it will raising `JsonParsingError`.
     var stream = newFileStream(filename, fmRead)
     if stream == nil:
       raise newException(IOError, "cannot read from file: " & filename)
@@ -1412,4 +1416,18 @@ when isMainModule:
 
   doAssert escapeJson("\10FoobarÄ") == "\"\\u000AFoobar\\u00C4\""
 
+  # Test with extra data
+  when not defined(js):
+    try:
+      discard parseJson("123 456")
+      doAssert(false)
+    except JsonParsingError:
+      doAssert getCurrentExceptionMsg().contains(errorMessages[errEofExpected])
+
+    try:
+      discard parseFile("tests/testdata/jsonwithextradata.json")
+      doAssert(false)
+    except JsonParsingError:
+      doAssert getCurrentExceptionMsg().contains(errorMessages[errEofExpected])
+
   echo("Tests succeeded!")