ejabberd分析(五)+订阅/添加好友
?
模块ejabberd_c2s中,状态为session_established2。
用户发送iq set 消息到服务器
<iq id="M8QF3-52" type="set"><query xmlns="jabber:iq:roster"><item jid="1555215557@kinglong" name="1555215557"><group>Friends</group></item></query></iq>
服务器端匹配到
?
?
上面这段代码需要注意ToJID的解析,发送给服务器的消息一般是默认不带to 属性的,这种情况下会自动将to 补上(这关系到包的路由)。
ejabberd_hooks:run(user_send_packet 会记录用户发送的消息到日志。
check_privacy_route 中对权限进行效验,通过后调用ejabberd_router:route(FromRoute, To, Packet) 进行路由。
在ejabberd_router:route中调用do_route/3:
?
?
也就是说对于那些在session_established 之后发送的消息都会交由ejabberd_sm去路由。
在ejabberd_sm中由do_route/3 来处理:
?
?
ejabberd_sm 是一个gen_server 当调用register_iq_handler 接口时会向sm_iqtable 插入记录。
而这些命名空间处理模块的登记是由gen_iq_handler 模块的add_iq_handler/6 来进行的。
在mod_roster:start/2 中有如下代码:
?