diff --git a/priv/test_cases/string_escapes.json b/priv/test_cases/string_escapes.json index 461bc67..3c9af78 100644 --- a/priv/test_cases/string_escapes.json +++ b/priv/test_cases/string_escapes.json @@ -1 +1 @@ -["\"", "\\", "\/", "\b", "\f", "\n", "\r", "\t"] \ No newline at end of file +["\"", "\\", "\b", "\f", "\n", "\r", "\t"] \ No newline at end of file diff --git a/priv/test_cases/string_escapes.test b/priv/test_cases/string_escapes.test index 7cd460c..8f6eeed 100644 --- a/priv/test_cases/string_escapes.test +++ b/priv/test_cases/string_escapes.test @@ -2,7 +2,6 @@ {jsx, [start_array, {string,<<"\"">>}, {string,<<"\\">>}, - {string,<<"/">>}, {string,<<"\b">>}, {string,<<"\f">>}, {string,<<"\n">>}, diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index eb85efa..4055b2e 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -348,13 +348,16 @@ escape(<<$r, Rest/binary>>, Handler, [Acc|Stack], Opts) -> string(Rest, Handler, [?acc_seq(Acc, $\r)|Stack], Opts); escape(<<$t, Rest/binary>>, Handler, [Acc|Stack], Opts) -> string(Rest, Handler, [?acc_seq(Acc, $\t)|Stack], Opts); -escape(<<$u, Rest/binary>>, Handler, Stack, Opts) -> - escaped_unicode(Rest, Handler, [?new_seq()|Stack], Opts); -escape(<>, Handler, [Acc|Stack], Opts) - when S =:= ?doublequote; S =:= ?solidus; S =:= ?rsolidus -> - string(Rest, Handler, [?acc_seq(Acc, S)|Stack], Opts); +escape(<>, Handler, [Acc|Stack], Opts) -> + string(Rest, Handler, [?acc_seq(Acc, $\\)|Stack], Opts); +escape(<>, Handler, [Acc|Stack], Opts=#opts{escape_forward_slash=true}) -> + string(Rest, Handler, [?acc_seq(Acc, $/)|Stack], Opts); +escape(<>, Handler, [Acc|Stack], Opts) -> + string(Rest, Handler, [?acc_seq(Acc, $\")|Stack], Opts); escape(<>, Handler, [Acc|Stack], Opts = #opts{single_quotes=true}) -> string(Rest, Handler, [?acc_seq(Acc, ?singlequote)|Stack], Opts); +escape(<<$u, Rest/binary>>, Handler, Stack, Opts) -> + escaped_unicode(Rest, Handler, [?new_seq()|Stack], Opts); escape(<<>>, Handler, Stack, Opts) -> ?incomplete(escape, <<>>, Handler, Stack, Opts); escape(Bin, Handler, Stack, Opts) -> @@ -1011,6 +1014,15 @@ comments_test_() -> ]. +escape_forward_slash_test_() -> + [ + {"escape forward slash test", ?_assertEqual( + decode(<<"[ \" \/ \" ]">>, [escape_forward_slash]), + [start_array, {string, <<" / ">>}, end_array, end_json] + )} + ]. + + noncharacters_test_() -> [ {"noncharacters - badjson",