fix(emqx_rule_events): drop tuple-value from message headers

the message headers are fed to a JSON ecnoder which
may crash if the header value is a tuple
This commit is contained in:
Zaiming (Stone) Shi 2022-10-25 19:32:37 +02:00
parent c72f3a0ae9
commit d704de4a84
4 changed files with 23 additions and 5 deletions

View File

@ -1054,8 +1054,11 @@ printable_maps(Headers) ->
|| {Key, Value} <- V0
]
};
(K, V0, AccIn) ->
AccIn#{K => V0}
(_K, V, AccIn) when is_tuple(V) ->
%% internal headers
AccIn;
(K, V, AccIn) ->
AccIn#{K => V}
end,
#{},
Headers

View File

@ -26,13 +26,19 @@ t_printable_maps(_) ->
Headers = #{
peerhost => {127, 0, 0, 1},
peername => {{127, 0, 0, 1}, 9980},
sockname => {{127, 0, 0, 1}, 1883}
sockname => {{127, 0, 0, 1}, 1883},
redispatch_to => {<<"group">>, <<"sub/topic/+">>},
shared_dispatch_ack => {self(), ref}
},
Converted = emqx_rule_events:printable_maps(Headers),
?assertMatch(
#{
peerhost := <<"127.0.0.1">>,
peername := <<"127.0.0.1:9980">>,
sockname := <<"127.0.0.1:1883">>
},
emqx_rule_events:printable_maps(Headers)
).
Converted
),
?assertNot(maps:is_key(redispatch_to, Converted)),
?assertNot(maps:is_key(shared_dispatch_ack, Converted)),
ok.

View File

@ -19,3 +19,8 @@
- Fixed the HTTP response status code for the `/status` endpoint [#9211](https://github.com/emqx/emqx/pull/9211).
Before the fix, it always returned `200` even if the EMQX application was not running. Now it returns `503` in that case.
- Fix message delivery related event encoding [#9228](https://github.com/emqx/emqx/pull/9228).
This bug was introduced in v5.0.9. For Rule-Engine's input events like `$events/message_delivered`
and `$events/message_dropped`, if the message was delivered to a shared-subscription,
the encoding (to JSON) of the event will fail.

View File

@ -18,3 +18,7 @@
- 修正了 `/status` 端点的响应状态代码 [#9211](https://github.com/emqx/emqx/pull/9211)。
在此修复前,它总是返回 HTTP 状态码 `200`,即使 EMQX 没有完成启动或正在重启。 现在它在这些情况下会返回状态码 `503`
- 修复规则引擎的消息事件编码失败 [#9228](https://github.com/emqx/emqx/pull/9228)。
该问题在 v5.0.9 中引入:带消息的规则引擎事件,例如 `$events/message_delivered`
`$events/message_dropped`, 如果消息事件是共享订阅产生的,在编码(到 JSON 格式)过程中会失败。