diff --git a/apps/emqx_utils/src/emqx_placeholder.erl b/apps/emqx_utils/src/emqx_placeholder.erl index 0f677236d..4d386840f 100644 --- a/apps/emqx_utils/src/emqx_placeholder.erl +++ b/apps/emqx_utils/src/emqx_placeholder.erl @@ -277,20 +277,29 @@ lookup_var([Prop | Rest], Data0) -> end. lookup(Prop, Data) when is_binary(Prop) -> - case maps:get(Prop, Data, undefined) of - undefined -> - try - {ok, maps:get(binary_to_existing_atom(Prop, utf8), Data)} + case do_one_lookup(Prop, Data) of + {error, undefined} -> + try binary_to_existing_atom(Prop, utf8) of + AtomKey -> + do_one_lookup(AtomKey, Data) catch - error:{badkey, _} -> - {error, undefined}; error:badarg -> {error, undefined} end; - Value -> + {ok, Value} -> {ok, Value} end. +do_one_lookup(Key, Data) -> + try + {ok, maps:get(Key, Data)} + catch + error:{badkey, _} -> + {error, undefined}; + error:{badmap, _} -> + {error, undefined} + end. + %%------------------------------------------------------------------------------ %% Internal functions %%------------------------------------------------------------------------------ diff --git a/apps/emqx_utils/src/emqx_utils.app.src b/apps/emqx_utils/src/emqx_utils.app.src index 539bfd3b7..de7326a21 100644 --- a/apps/emqx_utils/src/emqx_utils.app.src +++ b/apps/emqx_utils/src/emqx_utils.app.src @@ -2,7 +2,7 @@ {application, emqx_utils, [ {description, "Miscellaneous utilities for EMQX apps"}, % strict semver, bump manually! - {vsn, "5.0.7"}, + {vsn, "5.0.8"}, {modules, [ emqx_utils, emqx_utils_api, diff --git a/apps/emqx_utils/test/emqx_placeholder_SUITE.erl b/apps/emqx_utils/test/emqx_placeholder_SUITE.erl index f813656f2..a1250269f 100644 --- a/apps/emqx_utils/test/emqx_placeholder_SUITE.erl +++ b/apps/emqx_utils/test/emqx_placeholder_SUITE.erl @@ -256,3 +256,25 @@ t_proc_tmpl_arbitrary_var_name_double_quote(_) -> <<"a:1,a:1-1,b:1,b:2,c:1.0,d:oo,d1:hi}">>, emqx_placeholder:proc_tmpl(Tks, Selected) ). + +t_proc_tmpl_badmap(_Config) -> + ThisTks = emqx_placeholder:preproc_tmpl(<<"${.}">>), + Tks = emqx_placeholder:preproc_tmpl(<<"${.a.b.c}">>), + BadMap = <<"not-a-map">>, + ?assertEqual( + <<"not-a-map">>, + emqx_placeholder:proc_tmpl(ThisTks, BadMap) + ), + ?assertEqual( + <<"undefined">>, + emqx_placeholder:proc_tmpl(Tks, #{<<"a">> => #{<<"b">> => BadMap}}) + ), + ?assertEqual( + <<"undefined">>, + emqx_placeholder:proc_tmpl(Tks, #{<<"a">> => BadMap}) + ), + ?assertEqual( + <<"undefined">>, + emqx_placeholder:proc_tmpl(Tks, BadMap) + ), + ok.