Skip to content

Commit 77aab72

Browse files
authored
Merge pull request #77 from cleverfox/master
Fix for known_atoms decoding
2 parents 72dfb8c + 84e1cec commit 77aab72

File tree

4 files changed

+25
-2
lines changed

4 files changed

+25
-2
lines changed

src/msgpack.erl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,15 @@ unpack_stream(Bin) -> unpack_stream(Bin, []).
129129
unpack_stream(Bin, Opts0) when is_binary(Bin) ->
130130
Opts = parse_options(Opts0),
131131
try
132-
msgpack_unpacker:unpack_stream(Bin, Opts)
132+
Opts1=Opts?OPTION{
133+
known_atoms=lists:map(
134+
fun(X) ->
135+
erlang:atom_to_binary(X, utf8)
136+
end,
137+
Opts?OPTION.known_atoms
138+
)
139+
},
140+
msgpack_unpacker:unpack_stream(Bin, Opts1)
133141
catch
134142
throw:Exception -> {error, Exception}
135143
end;

src/msgpack.hrl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
-record(options_v4, {
3737
spec = new :: new | old,
3838
allow_atom = pack :: none | pack, %% allows atom when packing
39-
known_atoms = [] :: [atom()],
39+
known_atoms = [] :: [atom()|binary()],
4040
unpack_str = as_list :: as_binary | as_list | as_tagged_list,
4141
validate_string = false :: boolean(),
4242
pack_str = from_list :: from_binary | from_list | from_tagged_list | none,

src/msgpack_unpacker.erl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,14 @@ unpack_str_or_raw(V, ?OPTION{spec=new,
237237
as_tagged_list -> {string, unpack_str(V)}
238238
end, Rest}.
239239

240+
maybe_bin(Bin, ?OPTION{known_atoms=Known}) when Known=/=[] ->
241+
case lists:member(Bin,Known) of
242+
true ->
243+
erlang:binary_to_existing_atom(Bin,utf8);
244+
false ->
245+
Bin
246+
end;
247+
240248
maybe_bin(Bin, _) ->
241249
Bin.
242250

test/msgpack_tests.erl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,13 @@ binary_test_() ->
379379
end}
380380
].
381381

382+
atom_test_() ->
383+
Map1=#{atom1=>atom1,atom2=><<"binary2">>},
384+
Bin=msgpack:pack(Map1),
385+
?_assertEqual({ok,#{<<"atom1">>=><<"atom1">>,
386+
<<"atom2">>=><<"binary2">>}}, msgpack:unpack(Bin)),
387+
?_assertEqual({ok,Map1}, msgpack:unpack(Bin,[{known_atoms,[atom1,atom2]}])).
388+
382389
-define(PCNT, 5).
383390
-define(CNT, 10000).
384391

0 commit comments

Comments
 (0)