From cc892ddc01e28a682ad63734918b50c67c39d711 Mon Sep 17 00:00:00 2001 From: Evgeny Khramtsov Date: Tue, 23 Apr 2019 16:19:26 +0300 Subject: [PATCH] Improve request_handlers validator --- src/ejabberd_http.erl | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/ejabberd_http.erl b/src/ejabberd_http.erl index 9588e6cd1..e37269659 100644 --- a/src/ejabberd_http.erl +++ b/src/ejabberd_http.erl @@ -397,10 +397,11 @@ process(Handlers, Request) -> %% requested path is "/test/foo/bar", the local path is %% ["foo", "bar"] LocalPath = lists:nthtail(length(HandlerPathPrefix), Request#request.path), - R = try - HandlerModule:socket_handoff( - LocalPath, Request, HandlerOpts) - catch error:undef -> + R = case erlang:function_exported(HandlerModule, socket_handoff, 3) of + true -> + HandlerModule:socket_handoff( + LocalPath, Request, HandlerOpts); + false -> HandlerModule:process(LocalPath, Request) end, ejabberd_hooks:run(http_request_debug, [{LocalPath, Request}]), @@ -962,6 +963,23 @@ transform_listen_option({request_handlers, Hs}, Opts) -> transform_listen_option(Opt, Opts) -> [Opt|Opts]. +prepare_request_module(mod_http_bind) -> + mod_bosh; +prepare_request_module(Mod) when is_atom(Mod) -> + case code:ensure_loaded(Mod) of + {module, Mod} -> + Mod; + Err -> + ?ERROR_MSG( + "Failed to load request handler ~s: " + "make sure there is no typo and file ~s.beam " + "exists inside either ~s or ~s directory", + [Mod, Mod, + filename:dirname(code:which(?MODULE)), + ext_mod:modules_dir()]), + erlang:error(Err) + end. + -spec opt_type(atom()) -> fun((any()) -> any()) | [atom()]. opt_type(trusted_proxies) -> fun (all) -> all; @@ -1003,11 +1021,7 @@ listen_opt_type(request_handlers) -> Hs2 = [{str:tokens( iolist_to_binary(Path), <<"/">>), Mod} || {Path, Mod} <- Hs1], - [{Path, - case Mod of - mod_http_bind -> mod_bosh; - _ -> Mod - end} || {Path, Mod} <- Hs2] + [{Path, prepare_request_module(Mod)} || {Path, Mod} <- Hs2] end; listen_opt_type(default_host) -> fun iolist_to_binary/1;