diff --git a/src/jiffy.erl b/src/jiffy.erl index 78f4cf2..215674c 100644 --- a/src/jiffy.erl +++ b/src/jiffy.erl @@ -89,6 +89,9 @@ encode(Data, Options) -> {error, {invalid_string, _}} when ForceUTF8 == true -> FixedData = jiffy_utf8:fix(Data), 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 -> throw(Error); {partial, IOData} -> @@ -191,6 +194,9 @@ encode_loop(Data, Options, Encoder, Stack, IOBuf) -> {error, {invalid_string, _}} when ForceUTF8 == true -> FixedData = jiffy_utf8:fix(Data), 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 -> throw(Error); {partial, IOData} -> diff --git a/test/jiffy_04_string_tests.erl b/test/jiffy_04_string_tests.erl index 0d642d5..7cf645d 100644 --- a/test/jiffy_04_string_tests.erl +++ b/test/jiffy_04_string_tests.erl @@ -23,6 +23,16 @@ string_error_test_() -> string_utf8_test_() -> [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_() -> [gen(escaped_slashes, Case) || Case <- cases(escaped_slashes)]. @@ -54,6 +64,12 @@ gen(utf8, {Case, Fixed}) -> ?_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}) -> {msg("escaped_slashes - ~s", [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>>} ]; +cases(bad_utf8_key) -> + [ + { + {[{<<"foo", 16#80, "bar">>, true}]}, + {[{<<"foo", 16#EF, 16#BF, 16#BD, "bar">>, true}]} + } + ]; + cases(escaped_slashes) -> [ {<<"\"\\/\"">>, <<"/">>}