detect utf8 bom and ignore if present
This commit is contained in:
parent
5e87f02fc5
commit
e69ac5f371
3 changed files with 29 additions and 1 deletions
1
priv/test_cases/bom.json
Normal file
1
priv/test_cases/bom.json
Normal file
|
@ -0,0 +1 @@
|
||||||
|
[]
|
3
priv/test_cases/bom.test
Normal file
3
priv/test_cases/bom.test
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{name, "byte order mark"}.
|
||||||
|
{jsx, [start_array, end_array, end_json]}.
|
||||||
|
{json, "bom.json"}.
|
|
@ -29,7 +29,7 @@
|
||||||
-spec decoder(Handler::module(), State::any(), Opts::jsx:opts()) -> jsx:decoder().
|
-spec decoder(Handler::module(), State::any(), Opts::jsx:opts()) -> jsx:decoder().
|
||||||
|
|
||||||
decoder(Handler, State, Opts) ->
|
decoder(Handler, State, Opts) ->
|
||||||
fun(JSON) -> value(JSON, {Handler, Handler:init(State)}, [], jsx_utils:parse_opts(Opts)) end.
|
fun(JSON) -> start(JSON, {Handler, Handler:init(State)}, [], jsx_utils:parse_opts(Opts)) end.
|
||||||
|
|
||||||
|
|
||||||
-include("jsx_opts.hrl").
|
-include("jsx_opts.hrl").
|
||||||
|
@ -128,6 +128,30 @@ decoder(Handler, State, Opts) ->
|
||||||
-define(end_seq(Seq), unicode:characters_to_binary(lists:reverse(Seq))).
|
-define(end_seq(Seq), unicode:characters_to_binary(lists:reverse(Seq))).
|
||||||
|
|
||||||
|
|
||||||
|
start(<<16#ef, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
|
maybe_bom(Rest, Handler, Stack, Opts);
|
||||||
|
start(<<>>, Handler, Stack, Opts) ->
|
||||||
|
?incomplete(start, <<>>, Handler, Stack, Opts);
|
||||||
|
start(Bin, Handler, Stack, Opts) ->
|
||||||
|
value(Bin, Handler, Stack, Opts).
|
||||||
|
|
||||||
|
|
||||||
|
maybe_bom(<<16#bb, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
|
definitely_bom(Rest, Handler, Stack, Opts);
|
||||||
|
maybe_bom(<<>>, Handler, Stack, Opts) ->
|
||||||
|
?incomplete(maybe_bom, <<>>, Handler, Stack, Opts);
|
||||||
|
maybe_bom(Bin, Handler, Stack, Opts) ->
|
||||||
|
?error([Bin, Handler, Stack, Opts]).
|
||||||
|
|
||||||
|
|
||||||
|
definitely_bom(<<16#bf, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
|
value(Rest, Handler, Stack, Opts);
|
||||||
|
definitely_bom(<<>>, Handler, Stack, Opts) ->
|
||||||
|
?incomplete(definitely_bom, <<>>, Handler, Stack, Opts);
|
||||||
|
definitely_bom(Bin, Handler, Stack, Opts) ->
|
||||||
|
?error([Bin, Handler, Stack, Opts]).
|
||||||
|
|
||||||
|
|
||||||
value(<<?doublequote, Rest/binary>>, Handler, Stack, Opts) ->
|
value(<<?doublequote, Rest/binary>>, Handler, Stack, Opts) ->
|
||||||
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
string(Rest, Handler, [?new_seq()|Stack], Opts);
|
||||||
value(<<?singlequote, Rest/binary>>, Handler, Stack, Opts = #opts{single_quoted_strings=true}) ->
|
value(<<?singlequote, Rest/binary>>, Handler, Stack, Opts = #opts{single_quoted_strings=true}) ->
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue