From 30b5cea06d7e42e8877f561f4828e88ebf66d7f7 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Thu, 15 Mar 2012 22:56:21 -0700 Subject: [PATCH] escape strings and keys in the encoder --- src/jsx_encoder.erl | 29 ++++++++++++++++++++++------- src/jsx_utils.erl | 6 +++--- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/jsx_encoder.erl b/src/jsx_encoder.erl index 68bff84..f4d83e7 100644 --- a/src/jsx_encoder.erl +++ b/src/jsx_encoder.erl @@ -53,8 +53,8 @@ start(Term, {Handler, State}, Opts) -> Handler:handle_event(end_json, value(Term, {Handler, State}, Opts)). -value(String, {Handler, State}, _Opts) when is_binary(String) -> - Handler:handle_event({string, String}, State); +value(String, {Handler, State}, Opts) when is_binary(String) -> + Handler:handle_event({string, escape(String, {Handler, State}, Opts)}, State); value(Float, {Handler, State}, _Opts) when is_float(Float) -> Handler:handle_event({float, Float}, State); value(Int, {Handler, State}, _Opts) when is_integer(Int) -> @@ -78,9 +78,18 @@ list_or_object(List, {Handler, State}, Opts) -> object([{Key, Value}|Rest], {Handler, State}, Opts) -> - object(Rest, {Handler, - value(Value, {Handler, Handler:handle_event({key, fix_key(Key)}, State)}, Opts) - }, Opts); + object( + Rest, + { + Handler, + value( + Value, + {Handler, Handler:handle_event({key, escape(fix_key(Key), {Handler, State}, Opts)}, State)}, + Opts + ) + }, + Opts + ); object([], {Handler, State}, _Opts) -> Handler:handle_event(end_object, State); object(Term, Handler, Opts) -> ?error([Term, Handler, Opts]). @@ -91,8 +100,14 @@ list([], {Handler, State}, _Opts) -> Handler:handle_event(end_array, State); list(Term, Handler, Opts) -> ?error([Term, Handler, Opts]). -fix_key(Key) when is_binary(Key) -> Key; -fix_key(Key) when is_atom(Key) -> atom_to_binary(Key, utf8). +fix_key(Key) when is_atom(Key) -> fix_key(atom_to_binary(Key, utf8)); +fix_key(Key) when is_binary(Key) -> Key. + + +escape(String, Handler, Opts) -> + try jsx_utils:json_escape(String, Opts) + catch error:badarg -> erlang:error(badarg, [String, Handler, Opts]) + end. -ifdef(TEST). diff --git a/src/jsx_utils.erl b/src/jsx_utils.erl index 2c8b160..fa6db97 100644 --- a/src/jsx_utils.erl +++ b/src/jsx_utils.erl @@ -97,7 +97,7 @@ json_escape(<<$\t, Rest/binary>>, Opts, Acc) -> json_escape(<>, Opts, Acc) when C >= 0, C < $\s -> json_escape(Rest, Opts, - <> + <> ); %% escape forward slashes -- optionally -- to faciliate microsoft's retarded %% date format @@ -108,7 +108,7 @@ json_escape(<>, Opts, Acc) when C == 16#2028; C == 16#2029 -> json_escape(Rest, Opts, - <> + <> ); %% any other legal codepoint json_escape(<>, Opts, Acc) -> @@ -122,7 +122,7 @@ json_escape(Rest, Opts, Acc) -> %% convert a codepoint to it's \uXXXX equiv. json_escape_sequence(X) -> <> = <>, - [$\\, $u, (to_hex(A)), (to_hex(B)), (to_hex(C)), (to_hex(D))]. + unicode:characters_to_binary([$\\, $u, (to_hex(A)), (to_hex(B)), (to_hex(C)), (to_hex(D))]). to_hex(10) -> $a;