25
1
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:
Mickael Remond 2016-07-31 22:48:24 +02:00
parent 2a49f8cae7
commit 6ea7153e31
No known key found for this signature in database
GPG Key ID: E6F6045D79965AA3
3 changed files with 26 additions and 11 deletions

View File

@ -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],

View File

@ -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()].

View File

@ -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,7 +223,11 @@ process([Call], #request{method = 'POST', data = Data, ip = {IP, _} = IPPort} =
ErrorResponse -> ErrorResponse ->
ErrorResponse ErrorResponse
end end
catch _:{error,{_,invalid_json}} = _Err -> catch
%% TODO We need to refactor to remove redundant error return formatting
throw:{error, unknown_command} ->
{404, 40, <<"Command not found.">>};
_:{error,{_,invalid_json}} = _Err ->
?DEBUG("Bad Request: ~p", [_Err]), ?DEBUG("Bad Request: ~p", [_Err]),
badrequest_response(<<"Invalid JSON input">>); badrequest_response(<<"Invalid JSON input">>);
_:_Error -> _:_Error ->
@ -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));