add dirty_strings option to bypass json escaping strings during encoding

This commit is contained in:
alisdair sullivan 2012-03-29 00:01:50 -07:00
parent 9d2448669e
commit 19e710da55
2 changed files with 13 additions and 13 deletions

View file

@ -5,5 +5,6 @@
single_quotes = false, single_quotes = false,
no_jsonp_escapes = false, no_jsonp_escapes = false,
comments = false, comments = false,
json_escape = false json_escape = false,
dirty_strings = false
}). }).

View file

@ -51,6 +51,8 @@ parse_opts([comments|Rest], Opts) ->
parse_opts(Rest, Opts#opts{comments=true}); parse_opts(Rest, Opts#opts{comments=true});
parse_opts([json_escape|Rest], Opts) -> parse_opts([json_escape|Rest], Opts) ->
parse_opts(Rest, Opts#opts{json_escape=true}); parse_opts(Rest, Opts#opts{json_escape=true});
parse_opts([dirty_strings|Rest], Opts) ->
parse_opts(Rest, Opts#opts{json_escape=true});
parse_opts(_, _) -> parse_opts(_, _) ->
{error, badarg}. {error, badarg}.
@ -63,7 +65,8 @@ valid_flags() ->
single_quotes, single_quotes,
no_jsonp_escapes, no_jsonp_escapes,
comments, comments,
json_escape json_escape,
dirty_strings
]. ].
@ -88,7 +91,10 @@ extract_parser_opts([K|Rest], Acc) ->
%% everything else should be a legal json string component %% everything else should be a legal json string component
json_escape(String, Opts) when is_binary(String) -> json_escape(String, Opts) when is_binary(String) ->
json_escape(String, Opts, 0, size(String)). case Opts#opts.dirty_strings of
true -> String
; false -> json_escape(String, Opts, 0, size(String))
end.
-define(control_character(X), -define(control_character(X),
@ -592,17 +598,10 @@ binary_escape_test_() ->
<<"\\/Date(1303502009425)\\/">> <<"\\/Date(1303502009425)\\/">>
) )
}, },
{"bad surrogate", ?_assertError(badarg, json_escape(<<237, 160, 127>>, #opts{}))}, {"dirty strings",
{"bad surrogate ok",
?_assertEqual( ?_assertEqual(
json_escape(<<237, 160, 127>>, #opts{loose_unicode=true}), json_escape(<<"\\x25\\uffff">>, #opts{dirty_strings=true}),
<<16#fffd/utf8>> <<"\\x25\\uffff">>
)
},
{"all sizes of codepoints",
?_assertEqual(
json_escape(unicode:characters_to_binary([0, 32, 16#80, 16#800, 16#10000]), #opts{}),
<<"\\u0000", 32/utf8, 16#80/utf8, 16#800/utf8, 16#10000/utf8>>
) )
} }
]. ].