ejabberd源码分析及开发系列(2) local_router模块分析
本模块对具有目的地为本服务器的消息包进行路由, 如果目的地JID有一个非空的用户部分,则将其路由到session manager, 否则将根据其内容进行处理
下面将其对源码进行分析, 本部分的源码主要是ejabberd_local.erl文件。
本部分最关键的函数式do_route函数,下面对其分几个部分进行分析。
1 if To#jid.luser /= <<"">> -> 2 ejabberd_sm:route(From, To, Packet);
首先判断该目的部分的用户是否为空,若不为空则将通过ejabberd_sm进行处理
1 To#jid.lresource == <<"">> -> 2 #xmlel{name = Name} = Packet, 3 case Name of 4 <<"iq">> -> process_iq(From, To, Packet); 5 <<"message">> -> ok; 6 <<"presence">> -> ok; 7 _ -> ok 8 end;
然后若目的jid的资源部分为空,则根据其name判断进行处理, 若属性为iq, 则对请求进行相应的处理。
1 true -> 2 #xmlel{attrs = Attrs} = Packet, 3 case xml:get_attr_s(<<"type">>, Attrs) of 4 <<"error">> -> ok; 5 <<"result">> -> ok; 6 _ -> 7 ejabberd_hooks:run(local_send_to_resource_hook, 8 To#jid.lserver, [From, To, Packet]) 9 end 10 end.
最后则对资源的情况进行处理, 根据属性的类型,若为error和 result则丢弃, 否则就通过hook机制进行处理。
浙公网安备 33010602011771号