trap and process string encoding errors properly

This commit is contained in:
alisdair sullivan 2013-03-04 21:51:43 -08:00
parent da9bf969e2
commit d796dffa05

View file

@ -60,7 +60,7 @@ start(Term, {Handler, State}, Config) ->
value(String, {Handler, State}, Config) when is_binary(String) -> value(String, {Handler, State}, Config) when is_binary(String) ->
Handler:handle_event({string, clean_string(String, Config)}, State); Handler:handle_event({string, clean_string(String, {Handler, State}, Config)}, State);
value(Float, {Handler, State}, _Config) when is_float(Float) -> value(Float, {Handler, State}, _Config) when is_float(Float) ->
Handler:handle_event({float, Float}, State); Handler:handle_event({float, Float}, State);
value(Int, {Handler, State}, _Config) when is_integer(Int) -> value(Int, {Handler, State}, _Config) when is_integer(Int) ->
@ -76,7 +76,7 @@ value([Tuple|_] = List, Handler, Config) when is_tuple(Tuple) ->
list_or_object(List, Handler, Config); list_or_object(List, Handler, Config);
value(List, Handler, Config) when is_list(List) -> value(List, Handler, Config) when is_list(List) ->
list_or_object(List, Handler, Config); list_or_object(List, Handler, Config);
value(Term, Handler, Config) -> io:format("hi?~n"), ?error(value, Term, Handler, Config). value(Term, Handler, Config) -> ?error(value, Term, Handler, Config).
list_or_object([Term|Rest], {Handler, State}, Config) -> list_or_object([Term|Rest], {Handler, State}, Config) ->
@ -96,7 +96,7 @@ object([{Key, Value}, Next|Rest], {Handler, State}, Config) when is_atom(Key); i
Handler, Handler,
value( value(
V, V,
{Handler, Handler:handle_event({key, clean_string(fix_key(Key), Config)}, State)}, {Handler, Handler:handle_event({key, clean_string(fix_key(Key), {Handler, State}, Config)}, State)},
Config Config
) )
}, },
@ -109,7 +109,7 @@ object([{Key, Value}], {Handler, State}, Config) when is_atom(Key); is_binary(Ke
Handler, Handler,
value( value(
pre_encode(Value, Config), pre_encode(Value, Config),
{Handler, Handler:handle_event({key, clean_string(fix_key(Key), Config)}, State)}, {Handler, Handler:handle_event({key, clean_string(fix_key(Key), {Handler, State}, Config)}, State)},
Config Config
) )
}, },
@ -132,7 +132,11 @@ fix_key(Key) when is_atom(Key) -> fix_key(atom_to_binary(Key, utf8));
fix_key(Key) when is_binary(Key) -> Key. fix_key(Key) when is_binary(Key) -> Key.
clean_string(Bin, Config) -> jsx_utils:clean_string(Bin, Config). clean_string(Bin, Handler, Config) ->
try jsx_utils:clean_string(Bin, Config)
catch error:badarg -> ?error(string, Bin, Handler, Config)
end.
@ -281,7 +285,8 @@ pre_encoders_test_() ->
error_test_() -> error_test_() ->
[ [
{"value error", ?_assertError(badarg, encode(self(), []))} {"value error", ?_assertError(badarg, encode(self(), []))},
{"string error", ?_assertError(badarg, encode(<<16#ffff/utf8>>, []))}
]. ].
custom_error_handler_test_() -> custom_error_handler_test_() ->
@ -290,6 +295,10 @@ custom_error_handler_test_() ->
{"value error", ?_assertEqual( {"value error", ?_assertEqual(
{value, self()}, {value, self()},
encode(self(), [{error_handler, Error}]) encode(self(), [{error_handler, Error}])
)},
{"string error", ?_assertEqual(
{string, <<16#ffff/utf8>>},
encode(<<16#ffff/utf8>>, [{error_handler, Error}])
)} )}
]. ].