Explorar o código

fix(api): invalid params HTTP Code 400

JimMoen %!s(int64=4) %!d(string=hai) anos
pai
achega
40ab0064ae

+ 9 - 13
apps/emqx_gateway/src/emqx_gateway_api_clients.erl

@@ -77,25 +77,21 @@ apis() ->
 -define(format_fun, {?MODULE, format_channel_info}).
 
 clients(get, #{ bindings := #{name := Name0}
-              , query_string := Qs
+              , query_string := Params
               }) ->
     with_gateway(Name0, fun(GwName, _) ->
         TabName = emqx_gateway_cm:tabname(info, GwName),
-        case maps:get(<<"node">>, Qs, undefined) of
+        case maps:get(<<"node">>, Params, undefined) of
             undefined ->
-                Response = emqx_mgmt_api:cluster_query(
-                             Qs, TabName,
-                             ?CLIENT_QS_SCHEMA, ?query_fun
-                            ),
-                {200, Response};
+                Response = emqx_mgmt_api:cluster_query(Params, TabName,
+                                                       ?CLIENT_QS_SCHEMA, ?query_fun),
+                emqx_mgmt_util:generate_response(Response);
             Node1 ->
                 Node = binary_to_atom(Node1, utf8),
-                ParamsWithoutNode = maps:without([<<"node">>], Qs),
-                Response = emqx_mgmt_api:node_query(
-                             Node, ParamsWithoutNode,
-                             TabName, ?CLIENT_QS_SCHEMA, ?query_fun
-                            ),
-                {200, Response}
+                ParamsWithoutNode = maps:without([<<"node">>], Params),
+                Response = emqx_mgmt_api:node_query(Node, ParamsWithoutNode,
+                                                    TabName, ?CLIENT_QS_SCHEMA, ?query_fun),
+                emqx_mgmt_util:generate_response(Response)
         end
     end).
 

+ 11 - 15
apps/emqx_management/src/emqx_mgmt_api.erl

@@ -120,14 +120,7 @@ node_query(Node, Params, Tab, QsSchema, QueryFun) ->
     Limit = b2i(limit(Params)),
     Page  = b2i(page(Params)),
     Meta = #{page => Page, limit => Limit, count => 0},
-    case Meta of
-        #{page := Page, limit := Limit}
-          when Page < 1; Limit < 1 ->
-            {error, page_limit_invalid};
-        _ ->
-            do_node_query(Node, Tab, Qs, QueryFun, Meta)
-    end.
-
+    page_limit_check_query(Meta, {fun do_node_query/5, [Node, Tab, Qs, QueryFun, Meta]}).
 
 %% @private
 do_node_query(Node, Tab, Qs, QueryFun, Meta) ->
@@ -176,13 +169,7 @@ cluster_query(Params, Tab, QsSchema, QueryFun) ->
     Page  = b2i(page(Params)),
     Nodes = ekka_mnesia:running_nodes(),
     Meta = #{page => Page, limit => Limit, count => 0},
-    case Meta of
-        #{page := Page, limit := Limit}
-          when Page < 1; Limit < 1 ->
-            {error, page_limit_invalid};
-        _ ->
-            do_cluster_query(Nodes, Tab, Qs, QueryFun, Meta)
-    end.
+    page_limit_check_query(Meta, {fun do_cluster_query/5, [Nodes, Tab, Qs, QueryFun, Meta]}).
 
 %% @private
 do_cluster_query(Nodes, Tab, Qs, QueryFun, Meta) ->
@@ -380,6 +367,15 @@ rows_sub_params(Len, _Meta = #{page := Page, limit := Limit, count := Count}) ->
             {_SubStart = 1, _NeedNowNum = Len}
     end.
 
+page_limit_check_query(Meta, {F, A}) ->
+    case Meta of
+        #{page := Page, limit := Limit}
+          when Page < 1; Limit < 1 ->
+            {error, page_limit_invalid};
+        _ ->
+            erlang:apply(F, A)
+    end.
+
 %%--------------------------------------------------------------------
 %% Types
 %%--------------------------------------------------------------------

+ 1 - 1
apps/emqx_management/src/emqx_mgmt_api_alarms.erl

@@ -79,7 +79,7 @@ alarms(get, #{query_string := Qs}) ->
             <<"false">> -> ?DEACTIVATED_ALARM
         end,
     Response = emqx_mgmt_api:cluster_query(Qs, Table, [], {?MODULE, query}),
-    {200, Response};
+    emqx_mgmt_util:generate_response(Response);
 
 alarms(delete, _Params) ->
     _ = emqx_mgmt:delete_all_deactivated_alarms(),

+ 4 - 3
apps/emqx_management/src/emqx_mgmt_api_clients.erl

@@ -264,7 +264,8 @@ clients_api() ->
                 }
             ],
             responses => #{
-                <<"200">> => emqx_mgmt_util:array_schema(client, <<"List clients 200 OK">>)}}},
+                <<"200">> => emqx_mgmt_util:array_schema(client, <<"List clients 200 OK">>),
+                <<"400">> => emqx_mgmt_util:error_schema(<<"Invalid parameters">>, ['INVALID_PARAMETER'])}}},
     {"/clients", Metadata, clients}.
 
 client_api() ->
@@ -435,13 +436,13 @@ list(Params) ->
         undefined ->
             Response = emqx_mgmt_api:cluster_query(Params, Tab,
                                                    QuerySchema, ?query_fun),
-            {200, Response};
+            emqx_mgmt_util:generate_response(Response);
         Node1 ->
             Node = binary_to_atom(Node1, utf8),
             ParamsWithoutNode = maps:without([<<"node">>], Params),
             Response = emqx_mgmt_api:node_query(Node, ParamsWithoutNode,
                                                 Tab, QuerySchema, ?query_fun),
-            {200, Response}
+            emqx_mgmt_util:generate_response(Response)
     end.
 
 lookup(#{clientid := ClientID}) ->

+ 4 - 2
apps/emqx_management/src/emqx_mgmt_api_routes.erl

@@ -37,6 +37,7 @@
                         , error_schema/2
                         , properties/1
                         , page_params/0
+                        , generate_response/1
                         ]).
 
 api_spec() ->
@@ -54,7 +55,8 @@ routes_api() ->
             description => <<"EMQ X routes">>,
             parameters => [topic_param(query) , node_param()] ++ page_params(),
             responses => #{
-                <<"200">> => object_array_schema(properties(), <<"List route info">>)
+                <<"200">> => object_array_schema(properties(), <<"List route info">>),
+                <<"400">> => error_schema(<<"Invalid parameters">>, ['INVALID_PARAMETER'])
             }
         }
     },
@@ -87,7 +89,7 @@ route(get, #{bindings := Bindings}) ->
 %% api apply
 list(Params) ->
     Response = emqx_mgmt_api:node_query(node(), Params, emqx_route, ?ROUTES_QS_SCHEMA, {?MODULE, query}),
-    {200, Response}.
+    generate_response(Response).
 
 lookup(#{topic := Topic}) ->
     case emqx_mgmt:lookup_routes(Topic) of

+ 9 - 5
apps/emqx_management/src/emqx_mgmt_api_subscriptions.erl

@@ -21,6 +21,7 @@
 -include_lib("emqx/include/emqx.hrl").
 
 -import(emqx_mgmt_util, [ page_schema/1
+                        , error_schema/2
                         , properties/1
                         , page_params/0
                         ]).
@@ -53,7 +54,8 @@ subscriptions_api() ->
             description => <<"List subscriptions">>,
             parameters => parameters(),
             responses => #{
-                <<"200">> => page_schema(subscription)
+                <<"200">> => page_schema(subscription),
+                <<"400">> => error_schema(<<"Invalid parameters">>, ['INVALID_PARAMETER'])
             }
         }
     },
@@ -114,11 +116,13 @@ list(Params) ->
     {Tab, QuerySchema} = ?SUBS_QS_SCHEMA,
     case maps:get(<<"node">>, Params, undefined) of
         undefined ->
-            {200, emqx_mgmt_api:cluster_query(Params, Tab,
-                                              QuerySchema, ?query_fun)};
+            Response = emqx_mgmt_api:cluster_query(Params, Tab,
+                                                   QuerySchema, ?query_fun),
+            emqx_mgmt_util:generate_response(Response);
         Node ->
-            {200, emqx_mgmt_api:node_query(binary_to_atom(Node, utf8), Params,
-                                           Tab, QuerySchema, ?query_fun)}
+            Response = emqx_mgmt_api:node_query(binary_to_atom(Node, utf8), Params,
+                                                Tab, QuerySchema, ?query_fun),
+            emqx_mgmt_util:generate_response(Response)
     end.
 
 format(Items) when is_list(Items) ->

+ 11 - 0
apps/emqx_management/src/emqx_mgmt_util.erl

@@ -43,6 +43,7 @@
         , batch_schema/1
         ]).
 
+-export([generate_response/1]).
 
 
 -export([urldecode/1]).
@@ -258,3 +259,13 @@ bad_request() ->
 bad_request(Desc) ->
     object_schema(properties([{message, string}, {code, string}]), Desc).
 
+%%%==============================================================================================
+%% Response util
+
+generate_response(QueryResult) ->
+    case QueryResult of
+        {error, page_limit_invalid} ->
+            {400, #{code => <<"INVALID_PARAMETER">>, message => <<"page_limit_invalid">>}};
+        Response ->
+            {200, Response}
+    end.