fix(emqx_management): return 404 for unknown listener id

This commit is contained in:
Stefan Strigler 2023-07-07 11:57:33 +02:00
parent d65d690c17
commit 3fd28f9e18
2 changed files with 27 additions and 24 deletions

View File

@ -45,14 +45,10 @@
update/3 update/3
]). ]).
-include_lib("emqx/include/emqx.hrl").
-include_lib("hocon/include/hoconsc.hrl"). -include_lib("hocon/include/hoconsc.hrl").
-define(NODE_LISTENER_NOT_FOUND, <<"Node name or listener id not found">>).
-define(NODE_NOT_FOUND_OR_DOWN, <<"Node not found or Down">>).
-define(LISTENER_NOT_FOUND, <<"Listener id not found">>). -define(LISTENER_NOT_FOUND, <<"Listener id not found">>).
-define(LISTENER_ID_INCONSISTENT, <<"Path and body's listener id not match">>). -define(LISTENER_ID_INCONSISTENT, <<"Path and body's listener id not match">>).
-define(ADDR_PORT_INUSE, <<"Addr port in use">>).
namespace() -> "listeners". namespace() -> "listeners".
@ -156,7 +152,7 @@ schema("/listeners/:id") ->
parameters => [?R_REF(listener_id)], parameters => [?R_REF(listener_id)],
responses => #{ responses => #{
204 => <<"Listener deleted">>, 204 => <<"Listener deleted">>,
400 => error_codes(['BAD_REQUEST']) 404 => error_codes(['BAD_LISTENER_ID'])
} }
} }
}; };
@ -405,20 +401,8 @@ list_listeners(get, #{query_string := Query}) ->
list_listeners(post, #{body := Body}) -> list_listeners(post, #{body := Body}) ->
create_listener(Body). create_listener(Body).
crud_listeners_by_id(get, #{bindings := #{id := Id0}}) -> crud_listeners_by_id(get, #{bindings := #{id := Id}}) ->
Listeners = case find_listeners_by_id(Id) of
[
Conf#{
<<"id">> => Id,
<<"type">> => Type,
<<"bind">> := iolist_to_binary(
emqx_listeners:format_bind(maps:get(<<"bind">>, Conf))
)
}
|| {Id, Type, Conf} <- emqx_listeners:list_raw(),
Id =:= Id0
],
case Listeners of
[] -> {404, #{code => 'BAD_LISTENER_ID', message => ?LISTENER_NOT_FOUND}}; [] -> {404, #{code => 'BAD_LISTENER_ID', message => ?LISTENER_NOT_FOUND}};
[L] -> {200, L} [L] -> {200, L}
end; end;
@ -449,9 +433,12 @@ crud_listeners_by_id(post, #{body := Body}) ->
create_listener(Body); create_listener(Body);
crud_listeners_by_id(delete, #{bindings := #{id := Id}}) -> crud_listeners_by_id(delete, #{bindings := #{id := Id}}) ->
{ok, #{type := Type, name := Name}} = emqx_listeners:parse_listener_id(Id), {ok, #{type := Type, name := Name}} = emqx_listeners:parse_listener_id(Id),
case ensure_remove(Type, Name) of case find_listeners_by_id(Id) of
{ok, _} -> {204}; [_L] ->
{error, Reason} -> {400, #{code => 'BAD_REQUEST', message => err_msg(Reason)}} {ok, _Res} = ensure_remove(Type, Name),
{204};
[] ->
{404, #{code => 'BAD_LISTENER_ID', message => ?LISTENER_NOT_FOUND}}
end. end.
parse_listener_conf(Conf0) -> parse_listener_conf(Conf0) ->
@ -585,6 +572,19 @@ do_list_listeners() ->
<<"listeners">> => Listeners <<"listeners">> => Listeners
}. }.
find_listeners_by_id(Id) ->
[
Conf#{
<<"id">> => Id0,
<<"type">> => Type,
<<"bind">> := iolist_to_binary(
emqx_listeners:format_bind(maps:get(<<"bind">>, Conf))
)
}
|| {Id0, Type, Conf} <- emqx_listeners:list_raw(),
Id0 =:= Id
].
wrap_rpc({badrpc, Reason}) -> wrap_rpc({badrpc, Reason}) ->
{error, Reason}; {error, Reason};
wrap_rpc(Res) -> wrap_rpc(Res) ->

View File

@ -399,12 +399,15 @@ crud_listeners_by_id(ListenerId, NewListenerId, MinListenerId, BadId, Type, Port
?assertEqual([], delete(MinPath)), ?assertEqual([], delete(MinPath)),
?assertEqual({error, not_found}, is_running(NewListenerId)), ?assertEqual({error, not_found}, is_running(NewListenerId)),
?assertMatch({error, {"HTTP/1.1", 404, _}}, request(get, NewPath, [], [])), ?assertMatch({error, {"HTTP/1.1", 404, _}}, request(get, NewPath, [], [])),
?assertEqual([], delete(NewPath)), ?assertMatch({error, {"HTTP/1.1", 404, _}}, request(delete, NewPath, [], [])),
ok. ok.
t_delete_nonexistent_listener(Config) when is_list(Config) -> t_delete_nonexistent_listener(Config) when is_list(Config) ->
NonExist = emqx_mgmt_api_test_util:api_path(["listeners", "tcp:nonexistent"]), NonExist = emqx_mgmt_api_test_util:api_path(["listeners", "tcp:nonexistent"]),
?assertEqual([], delete(NonExist)), ?assertMatch(
{error, {_, 404, _}},
request(delete, NonExist, [], [])
),
ok. ok.
t_action_listeners(Config) when is_list(Config) -> t_action_listeners(Config) when is_list(Config) ->