fix(topic_rewrite): handle error when target contains wildcards
Fixes https://emqx.atlassian.net/browse/EMQX-10565
This commit is contained in:
parent
2c153c11e7
commit
8ec14bb07e
|
@ -28,6 +28,7 @@
|
||||||
-define(MAX_RULES_LIMIT, 20).
|
-define(MAX_RULES_LIMIT, 20).
|
||||||
|
|
||||||
-define(EXCEED_LIMIT, 'EXCEED_LIMIT').
|
-define(EXCEED_LIMIT, 'EXCEED_LIMIT').
|
||||||
|
-define(BAD_REQUEST, 'BAD_REQUEST').
|
||||||
|
|
||||||
api_spec() ->
|
api_spec() ->
|
||||||
emqx_dashboard_swagger:spec(?MODULE).
|
emqx_dashboard_swagger:spec(?MODULE).
|
||||||
|
@ -62,6 +63,10 @@ schema("/mqtt/topic_rewrite") ->
|
||||||
hoconsc:array(hoconsc:ref(emqx_modules_schema, "rewrite")),
|
hoconsc:array(hoconsc:ref(emqx_modules_schema, "rewrite")),
|
||||||
#{desc => ?DESC(update_topic_rewrite_api)}
|
#{desc => ?DESC(update_topic_rewrite_api)}
|
||||||
),
|
),
|
||||||
|
400 => emqx_dashboard_swagger:error_codes(
|
||||||
|
[?BAD_REQUEST],
|
||||||
|
?DESC(update_topic_rewrite_api_response400)
|
||||||
|
),
|
||||||
413 => emqx_dashboard_swagger:error_codes(
|
413 => emqx_dashboard_swagger:error_codes(
|
||||||
[?EXCEED_LIMIT],
|
[?EXCEED_LIMIT],
|
||||||
?DESC(update_topic_rewrite_api_response413)
|
?DESC(update_topic_rewrite_api_response413)
|
||||||
|
@ -75,11 +80,30 @@ topic_rewrite(get, _Params) ->
|
||||||
topic_rewrite(put, #{body := Body}) ->
|
topic_rewrite(put, #{body := Body}) ->
|
||||||
case length(Body) < ?MAX_RULES_LIMIT of
|
case length(Body) < ?MAX_RULES_LIMIT of
|
||||||
true ->
|
true ->
|
||||||
ok = emqx_rewrite:update(Body),
|
try
|
||||||
{200, emqx_rewrite:list()};
|
ok = emqx_rewrite:update(Body),
|
||||||
|
{200, emqx_rewrite:list()}
|
||||||
|
catch
|
||||||
|
throw:#{
|
||||||
|
kind := validation_error,
|
||||||
|
reason := #{
|
||||||
|
msg := "cannot_use_wildcard_for_destination_topic",
|
||||||
|
invalid_topics := InvalidTopics
|
||||||
|
}
|
||||||
|
} ->
|
||||||
|
Message = get_invalid_wildcard_topic_msg(InvalidTopics),
|
||||||
|
{400, #{code => ?BAD_REQUEST, message => Message}}
|
||||||
|
end;
|
||||||
_ ->
|
_ ->
|
||||||
Message = iolist_to_binary(
|
Message = iolist_to_binary(
|
||||||
io_lib:format("Max rewrite rules count is ~p", [?MAX_RULES_LIMIT])
|
io_lib:format("Max rewrite rules count is ~p", [?MAX_RULES_LIMIT])
|
||||||
),
|
),
|
||||||
{413, #{code => ?EXCEED_LIMIT, message => Message}}
|
{413, #{code => ?EXCEED_LIMIT, message => Message}}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
get_invalid_wildcard_topic_msg(InvalidTopics) ->
|
||||||
|
iolist_to_binary(
|
||||||
|
io_lib:format("Cannot use wildcard for destination topic. Invalid topics: ~p", [
|
||||||
|
InvalidTopics
|
||||||
|
])
|
||||||
|
).
|
||||||
|
|
|
@ -130,7 +130,7 @@ t_mqtt_topic_rewrite_wildcard(_) ->
|
||||||
lists:foreach(
|
lists:foreach(
|
||||||
fun(Rule) ->
|
fun(Rule) ->
|
||||||
?assertMatch(
|
?assertMatch(
|
||||||
{ok, 500, _},
|
{ok, 400, _},
|
||||||
request(
|
request(
|
||||||
put,
|
put,
|
||||||
uri(["mqtt", "topic_rewrite"]),
|
uri(["mqtt", "topic_rewrite"]),
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix HTTP API error when a publish topic rewrite rule targets a topic with wildcards. Now it returns error 400 (Bad Match) instead of error 500 (Internal Error).
|
|
@ -15,4 +15,9 @@ update_topic_rewrite_api_response413.desc:
|
||||||
update_topic_rewrite_api_response413.label:
|
update_topic_rewrite_api_response413.label:
|
||||||
"""Rules count exceed limit"""
|
"""Rules count exceed limit"""
|
||||||
|
|
||||||
|
update_topic_rewrite_api_response400.desc:
|
||||||
|
"""Bad request"""
|
||||||
|
update_topic_rewrite_api_response400.label:
|
||||||
|
"""Bad request"""
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue