mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-28 16:34:13 +01:00
Improve error handling
This commit is contained in:
parent
2a49f8cae7
commit
6ea7153e31
@ -87,6 +87,7 @@ get_commands_spec() ->
|
|||||||
args = [], result = {res, rescode}},
|
args = [], result = {res, rescode}},
|
||||||
#ejabberd_commands{name = reopen_log, tags = [logs, server],
|
#ejabberd_commands{name = reopen_log, tags = [logs, server],
|
||||||
desc = "Reopen the log files",
|
desc = "Reopen the log files",
|
||||||
|
policy = admin,
|
||||||
module = ?MODULE, function = reopen_log,
|
module = ?MODULE, function = reopen_log,
|
||||||
args = [], result = {res, rescode}},
|
args = [], result = {res, rescode}},
|
||||||
#ejabberd_commands{name = rotate_log, tags = [logs, server],
|
#ejabberd_commands{name = rotate_log, tags = [logs, server],
|
||||||
|
@ -425,7 +425,7 @@ get_command_definition(Name, Version) ->
|
|||||||
{V, C}
|
{V, C}
|
||||||
end)))) of
|
end)))) of
|
||||||
[{_, Command} | _ ] -> Command;
|
[{_, Command} | _ ] -> Command;
|
||||||
_E -> throw(unknown_command)
|
_E -> throw({error, unknown_command})
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec get_commands_definition(integer()) -> [ejabberd_commands()].
|
-spec get_commands_definition(integer()) -> [ejabberd_commands()].
|
||||||
|
@ -213,11 +213,7 @@ process(_, #request{method = 'POST', data = <<>>}) ->
|
|||||||
process([Call], #request{method = 'POST', data = Data, ip = {IP, _} = IPPort} = Req) ->
|
process([Call], #request{method = 'POST', data = Data, ip = {IP, _} = IPPort} = Req) ->
|
||||||
Version = get_api_version(Req),
|
Version = get_api_version(Req),
|
||||||
try
|
try
|
||||||
Args = case jiffy:decode(Data) of
|
Args = extract_args(Data),
|
||||||
List when is_list(List) -> List;
|
|
||||||
{List} when is_list(List) -> List;
|
|
||||||
Other -> [Other]
|
|
||||||
end,
|
|
||||||
log(Call, Args, IPPort),
|
log(Call, Args, IPPort),
|
||||||
case check_permissions(Req, Call) of
|
case check_permissions(Req, Call) of
|
||||||
{allowed, Cmd, Auth} ->
|
{allowed, Cmd, Auth} ->
|
||||||
@ -227,10 +223,14 @@ process([Call], #request{method = 'POST', data = Data, ip = {IP, _} = IPPort} =
|
|||||||
ErrorResponse ->
|
ErrorResponse ->
|
||||||
ErrorResponse
|
ErrorResponse
|
||||||
end
|
end
|
||||||
catch _:{error,{_,invalid_json}} = _Err ->
|
catch
|
||||||
?DEBUG("Bad Request: ~p", [_Err]),
|
%% TODO We need to refactor to remove redundant error return formatting
|
||||||
badrequest_response(<<"Invalid JSON input">>);
|
throw:{error, unknown_command} ->
|
||||||
_:_Error ->
|
{404, 40, <<"Command not found.">>};
|
||||||
|
_:{error,{_,invalid_json}} = _Err ->
|
||||||
|
?DEBUG("Bad Request: ~p", [_Err]),
|
||||||
|
badrequest_response(<<"Invalid JSON input">>);
|
||||||
|
_:_Error ->
|
||||||
?DEBUG("Bad Request: ~p ~p", [_Error, erlang:get_stacktrace()]),
|
?DEBUG("Bad Request: ~p ~p", [_Error, erlang:get_stacktrace()]),
|
||||||
badrequest_response()
|
badrequest_response()
|
||||||
end;
|
end;
|
||||||
@ -250,7 +250,12 @@ process([Call], #request{method = 'GET', q = Data, ip = IP} = Req) ->
|
|||||||
ErrorResponse ->
|
ErrorResponse ->
|
||||||
ErrorResponse
|
ErrorResponse
|
||||||
end
|
end
|
||||||
catch _:_Error ->
|
catch
|
||||||
|
%% TODO We need to refactor to remove redundant error return formatting
|
||||||
|
throw:{error, unknown_command} ->
|
||||||
|
{404, 40, <<"Command not found.">>};
|
||||||
|
_:_Error ->
|
||||||
|
|
||||||
?DEBUG("Bad Request: ~p ~p", [_Error, erlang:get_stacktrace()]),
|
?DEBUG("Bad Request: ~p ~p", [_Error, erlang:get_stacktrace()]),
|
||||||
badrequest_response()
|
badrequest_response()
|
||||||
end;
|
end;
|
||||||
@ -260,6 +265,15 @@ process(_Path, Request) ->
|
|||||||
?DEBUG("Bad Request: no handler ~p", [Request]),
|
?DEBUG("Bad Request: no handler ~p", [Request]),
|
||||||
badrequest_response().
|
badrequest_response().
|
||||||
|
|
||||||
|
%% Be tolerant to make API more easily usable from command-line pipe.
|
||||||
|
extract_args(<<"\n">>) -> [];
|
||||||
|
extract_args(Data) ->
|
||||||
|
case jiffy:decode(Data) of
|
||||||
|
List when is_list(List) -> List;
|
||||||
|
{List} when is_list(List) -> List;
|
||||||
|
Other -> [Other]
|
||||||
|
end.
|
||||||
|
|
||||||
% get API version N from last "vN" element in URL path
|
% get API version N from last "vN" element in URL path
|
||||||
get_api_version(#request{path = Path}) ->
|
get_api_version(#request{path = Path}) ->
|
||||||
get_api_version(lists:reverse(Path));
|
get_api_version(lists:reverse(Path));
|
||||||
|
Loading…
Reference in New Issue
Block a user