From e36858d1baf9a0205632de84a098d3698185aa21 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Mon, 19 Mar 2012 15:57:00 -0700 Subject: [PATCH] apply escape_forward_slash option to decoding as well as encoding --- priv/test_cases/string_escapes.json | 2 +- priv/test_cases/string_escapes.test | 1 - src/jsx_decoder.erl | 22 +++++++++++++++++----- 3 files changed, 18 insertions(+), 7 deletions(-) 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",