Browse Source

Fix force_utf8 for object keys

Previously if a key was malformed UTF-8 and the user specified the
`force_utf8` option we would fail to try and encode a fixed up version
of the object. This was due to missing a clause to catch the
`invalid_object_member_key` exception. This adds the clause and a couple
tests to ensure it works.
pull/119/head 0.14.8
Paul J. Davis 9 years ago
parent
commit
1febce3ca8
2 changed files with 30 additions and 0 deletions
  1. +6
    -0
      src/jiffy.erl
  2. +24
    -0
      test/jiffy_04_string_tests.erl

+ 6
- 0
src/jiffy.erl View File

@ -89,6 +89,9 @@ encode(Data, Options) ->
{error, {invalid_string, _}} when ForceUTF8 == true -> {error, {invalid_string, _}} when ForceUTF8 == true ->
FixedData = jiffy_utf8:fix(Data), FixedData = jiffy_utf8:fix(Data),
encode(FixedData, Options -- [force_utf8]); encode(FixedData, Options -- [force_utf8]);
{error, {invalid_object_member_key, _}} when ForceUTF8 == true ->
FixedData = jiffy_utf8:fix(Data),
encode(FixedData, Options -- [force_utf8]);
{error, _} = Error -> {error, _} = Error ->
throw(Error); throw(Error);
{partial, IOData} -> {partial, IOData} ->
@ -191,6 +194,9 @@ encode_loop(Data, Options, Encoder, Stack, IOBuf) ->
{error, {invalid_string, _}} when ForceUTF8 == true -> {error, {invalid_string, _}} when ForceUTF8 == true ->
FixedData = jiffy_utf8:fix(Data), FixedData = jiffy_utf8:fix(Data),
encode(FixedData, Options -- [force_utf8]); encode(FixedData, Options -- [force_utf8]);
{error, {invalid_object_member_key, _}} when ForceUTF8 == true ->
FixedData = jiffy_utf8:fix(Data),
encode(FixedData, Options -- [force_utf8]);
{error, _} = Error -> {error, _} = Error ->
throw(Error); throw(Error);
{partial, IOData} -> {partial, IOData} ->

+ 24
- 0
test/jiffy_04_string_tests.erl View File

@ -23,6 +23,16 @@ string_error_test_() ->
string_utf8_test_() -> string_utf8_test_() ->
[gen(utf8, Case) || Case <- cases(utf8)]. [gen(utf8, Case) || Case <- cases(utf8)].
string_bad_utf8_key_test_() ->
Cases = cases(bad_utf8_key),
{{J}, {E}} = hd(Cases),
ExtraProps = [{<<"abcdeefeadasffasdfa">>, I} || I <- lists:seq(1, 10000)],
Big = {{ExtraProps ++ J}, {ExtraProps ++ E}},
AllCases = [Big | Cases],
[gen(bad_utf8_key, Case) || Case <- AllCases].
string_escaped_slashes_test_() -> string_escaped_slashes_test_() ->
[gen(escaped_slashes, Case) || Case <- cases(escaped_slashes)]. [gen(escaped_slashes, Case) || Case <- cases(escaped_slashes)].
@ -54,6 +64,12 @@ gen(utf8, {Case, Fixed}) ->
?_assertThrow({error, {_, invalid_string}}, jiffy:decode(Case2)) ?_assertThrow({error, {_, invalid_string}}, jiffy:decode(Case2))
]}; ]};
gen(bad_utf8_key, {J, E}) ->
{msg("Bad UTF-8 key: - ~p", [size(term_to_binary(J))]), [
?_assertThrow({error, {invalid_object_member_key, _}}, jiffy:encode(J)),
?_assertEqual(E, jiffy:decode(jiffy:encode(J, [force_utf8])))
]};
gen(escaped_slashes, {J, E}) -> gen(escaped_slashes, {J, E}) ->
{msg("escaped_slashes - ~s", [J]), [ {msg("escaped_slashes - ~s", [J]), [
{"Decode", ?_assertEqual(E, dec(J))}, {"Decode", ?_assertEqual(E, dec(J))},
@ -152,6 +168,14 @@ cases(utf8) ->
{<<16#FC, 16#82, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>} {<<16#FC, 16#82, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>}
]; ];
cases(bad_utf8_key) ->
[
{
{[{<<"foo", 16#80, "bar">>, true}]},
{[{<<"foo", 16#EF, 16#BF, 16#BD, "bar">>, true}]}
}
];
cases(escaped_slashes) -> cases(escaped_slashes) ->
[ [
{<<"\"\\/\"">>, <<"/">>} {<<"\"\\/\"">>, <<"/">>}

Loading…
Cancel
Save