From 9479c8d33b62490097a50dee46d071c34038f79b Mon Sep 17 00:00:00 2001 From: zmstone Date: Mon, 17 Jun 2024 20:03:32 +0200 Subject: [PATCH] fix(redis): json decode if arg for map_to_redis_hset_args is string --- apps/emqx_rule_engine/src/emqx_rule_funcs.erl | 15 ++++++++++++++- .../test/emqx_rule_funcs_SUITE.erl | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl index af8ac4603..3f7f24604 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl @@ -825,8 +825,21 @@ join_to_string(Sep, List) -> emqx_variform_bif:join_to_string(Sep, List). %% - String values are always quoted %% - No escape sequence for keys and values %% - Float point values are formatted with fixed (6) decimal point compact-formatting +map_to_redis_hset_args(Payload) when erlang:is_binary(Payload) -> + try + Map = json_decode(Payload), + map_to_redis_hset_args(Map) + catch + _:_ -> + %% Discard invalid JSON + [map_to_redis_hset_args] + end; map_to_redis_hset_args(Map) when erlang:is_map(Map) -> - [map_to_redis_hset_args | maps:fold(fun redis_hset_acc/3, [], Map)]. + Fields = maps:fold(fun redis_hset_acc/3, [], Map), + %% Fields can be [], the final template may have other fields for concatenation + [map_to_redis_hset_args | Fields]; +map_to_redis_hset_args(_Other) -> + [map_to_redis_hset_args]. redis_hset_acc(K, V, IoData) -> try diff --git a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl index eb7b97b5f..355beb544 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl @@ -1395,6 +1395,8 @@ t_map_to_redis_hset_args(_Config) -> true end ), + ?assertEqual([], Do(<<"not json">>)), + ?assertEqual([], Do([<<"not map">>, <<"not json either">>])), ok. %%------------------------------------------------------------------------------