%% 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}]),
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;
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;