From e4a401a3a65a4bbdc56a737ef6c53d160251b848 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Sat, 13 Jul 2013 02:05:16 +0000 Subject: [PATCH] incomplete input now results in an error when parsing json or jsx internal form streaming decoding is now only available when forced with the `stream` option and no longer returns until forced to via the token `end_stream`. this api is still subject to being replaced with an even more explicit streaming mode --- src/jsx_decoder.erl | 30 ++++++++++++++++++++++++++++-- src/jsx_parser.erl | 2 ++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index f5d09c7..26e5aa6 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -138,10 +138,15 @@ resume(Rest, State, Handler, Acc, Stack, Config) -> -endif. +incomplete(State, Rest, Handler, Stack, Config = #config{stream=false}) -> + ?error(State, Rest, Handler, Stack, Config); incomplete(State, Rest, Handler, Stack, Config) -> incomplete(State, Rest, Handler, unused, Stack, Config). -incomplete(State, Rest, Handler, Acc, Stack, Config=#config{incomplete_handler=false}) -> + +incomplete(State, Rest, Handler, Acc, Stack, Config = #config{stream=false}) -> + ?error(State, Rest, Handler, Acc, Stack, Config); +incomplete(State, Rest, Handler, Acc, Stack, Config = #config{incomplete_handler=false}) -> {incomplete, fun(Stream) when is_binary(Stream) -> resume(<>, State, Handler, Acc, Stack, Config); (end_stream) -> @@ -151,7 +156,7 @@ incomplete(State, Rest, Handler, Acc, Stack, Config=#config{incomplete_handler=f end end }; -incomplete(State, Rest, Handler, Acc, Stack, Config=#config{incomplete_handler=F}) -> +incomplete(State, Rest, Handler, Acc, Stack, Config = #config{incomplete_handler=F}) -> F(Rest, {decoder, State, Handler, Acc, Stack}, jsx_config:config_to_list(Config)). @@ -1898,6 +1903,27 @@ bom_test_() -> ]. +incomplete_test_() -> + [ + {"stream false", ?_assertError( + badarg, + start(<<"{">>, {jsx, []}, [], jsx_config:parse_config([])) + )}, + {"stream true", ?_assert( + case start(<<"{">>, {jsx, []}, [], jsx_config:parse_config([stream])) of + {incomplete, _} -> true; + _ -> false + end + )}, + {"complete input", ?_assert( + case start(<<"{}">>, {jsx, []}, [], jsx_config:parse_config([stream])) of + {incomplete, _} -> true; + _ -> false + end + )} + ]. + + error_test_() -> Decode = fun(JSON, Config) -> start(JSON, {jsx, []}, [], jsx_config:parse_config(Config)) end, [ diff --git a/src/jsx_parser.erl b/src/jsx_parser.erl index 099b71e..6b27e35 100644 --- a/src/jsx_parser.erl +++ b/src/jsx_parser.erl @@ -72,6 +72,8 @@ resume(Rest, State, Handler, Stack, Config) -> -endif. +incomplete(State, Handler, Stack, Config=#config{stream=false}) -> + ?error(State, [], Handler, Stack, Config); incomplete(State, Handler, Stack, Config=#config{incomplete_handler=false}) -> {incomplete, fun(end_stream) -> case resume([end_json], State, Handler, Stack, Config) of