summaryrefslogtreecommitdiff
path: root/src/ejabberd_router.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-07-25 13:50:30 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-07-25 13:50:30 +0300
commit179fcd9521ef8db4626ca110ba80c502d810c814 (patch)
tree78e0b2410b0f8a4cbe95f84bfb30e58d1b205e3e /src/ejabberd_router.erl
parentFix hooks de-registration (diff)
Rewrite mod_mam and mod_muc to use XML generator
Diffstat (limited to 'src/ejabberd_router.erl')
-rw-r--r--src/ejabberd_router.erl31
1 files changed, 21 insertions, 10 deletions
diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl
index 5924d92c..83ffd932 100644
--- a/src/ejabberd_router.erl
+++ b/src/ejabberd_router.erl
@@ -72,7 +72,7 @@
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
--spec route(jid(), jid(), xmlel() | xmpp_element()) -> ok.
+-spec route(jid(), jid(), xmlel() | stanza()) -> ok.
route(From, To, Packet) ->
case catch do_route(From, To, Packet) of
@@ -85,13 +85,21 @@ route(From, To, Packet) ->
%% Route the error packet only if the originating packet is not an error itself.
%% RFC3920 9.3.1
--spec route_error(jid(), jid(), xmlel(), xmlel()) -> ok.
+-spec route_error(jid(), jid(), xmlel(), xmlel()) -> ok;
+ (jid(), jid(), stanza(), error()) -> ok.
-route_error(From, To, ErrPacket, OrigPacket) ->
+route_error(From, To, #xmlel{} = ErrPacket, #xmlel{} = OrigPacket) ->
#xmlel{attrs = Attrs} = OrigPacket,
case <<"error">> == fxml:get_attr_s(<<"type">>, Attrs) of
false -> route(From, To, ErrPacket);
true -> ok
+ end;
+route_error(From, To, Packet, #error{} = Err) ->
+ Type = xmpp:get_type(Packet),
+ if Type == error; Type == result ->
+ ok;
+ true ->
+ ejabberd_router:route(From, To, xmpp:make_error(Packet, Err))
end.
-spec register_route(binary()) -> term().
@@ -406,11 +414,16 @@ do_route(OrigFrom, OrigTo, OrigPacket) ->
end.
-spec do_route(jid(), jid(), xmlel() | xmpp_element(), #route{}) -> any().
-do_route(From, To, Packet,
- #route{local_hint = {apply, Module, Function}, pid = Pid})
- when is_pid(Pid) andalso node(Pid) == node() ->
- try
- Module:Function(From, To, xmpp:decode(Packet, [ignore_els]))
+do_route(From, To, Packet, #route{local_hint = LocalHint,
+ pid = Pid}) when is_pid(Pid) ->
+ try xmpp:decode(Packet, [ignore_els]) of
+ Pkt ->
+ case LocalHint of
+ {apply, Module, Function} when node(Pid) == node() ->
+ Module:Function(From, To, Pkt);
+ _ ->
+ Pid ! {route, From, To, Pkt}
+ end
catch error:{xmpp_codec, Why} ->
?ERROR_MSG("failed to decode xml element ~p when "
"routing from ~s to ~s: ~s",
@@ -418,8 +431,6 @@ do_route(From, To, Packet,
xmpp:format_error(Why)]),
drop
end;
-do_route(From, To, Packet, #route{pid = Pid}) when is_pid(Pid) ->
- Pid ! {route, From, To, xmpp:encode(Packet)};
do_route(_From, _To, _Packet, _Route) ->
drop.