diff --git a/src/jsx.erl b/src/jsx.erl index 3e89451..9f11ea8 100644 --- a/src/jsx.erl +++ b/src/jsx.erl @@ -262,6 +262,9 @@ key(<<>>, Stack, Callbacks, Opts) -> %% unicode codepoints is faster than constructing binaries, many of which will be %% converted back to lists by the user anyways. +%% the clause starting with Bin is necessary for cases where a stream is broken at a +%% point where it contains only a partial utf-8 sequence. + string(<>, [key|_] = Stack, Callbacks, Opts, Acc) -> colon(Rest, Stack, fold({key, lists:reverse(Acc)}, Callbacks), Opts); string(<>, Stack, Callbacks, Opts, Acc) -> @@ -269,7 +272,9 @@ string(<>, Stack, Callbacks, Opts, Acc) -> string(<>, Stack, Callbacks, Opts, Acc) -> escape(Rest, Stack, Callbacks, Opts, Acc); string(<>, Stack, Callbacks, Opts, Acc) when ?is_noncontrol(S) -> - string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); + string(Rest, Stack, Callbacks, Opts, [S] ++ Acc); +string(Bin, Stack, Callbacks, Opts, Acc) -> + {incomplete, fun(Stream) -> string(<>, Stack, Callbacks, Opts, Acc) end}; string(<<>>, Stack, Callbacks, Opts, Acc) -> {incomplete, fun(Stream) -> string(Stream, Stack, Callbacks, Opts, Acc) end}.