【问题标题】:Ejabberd custom IQ Handler: getting feature-not-implemented or service-unavailableEjabberd 自定义 IQ 处理程序:获取功能未实现或服务不可用
【发布时间】:2016-07-20 17:01:07
【问题描述】:

我剥离了 mod_last.erl 来测试 IQHandler 的创建(只粘贴了重要的部分):

start(Host, Opts) ->
    IQDisc = gen_mod:get_opt(iqdisc, Opts, fun gen_iq_handler:check_type/1,
                             one_queue),
    gen_iq_handler:add_iq_handler(ejabberd_local, Host,
                  <<"join">>, ?MODULE, process_local_iq, IQDisc).

stop(Host) ->
    gen_iq_handler:remove_iq_handler(ejabberd_local, Host,
                     <<"join">>).

process_local_iq(_From, _To,
         #iq{type = Type, sub_el = SubEl} = IQ) ->
    case Type of
      set ->
      IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
      get ->
      Sec = 60,
      IQ#iq{type = result,
        sub_el =
            [#xmlel{name = <<"query">>,
                attrs =
                [{<<"xmlns">>, <<"join">>},
                 {<<"seconds">>,
                  iolist_to_binary(integer_to_list(Sec))}],
                children = []}]}
    end.

但是当我发送请求时:

<iq type='get' id='123'>
    <query xmlns='join'/>
</iq>

我不断收到 service-unavailable 错误:

<iq from='alfred@localhost' to='alfred@localhost/Alfreds-MacBook-Pro' type='error' id='123'>
<query xmlns='join'/>
<error code='503' type='cancel'>
    <service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
</iq>

similar question 没有帮助,因为我没有添加 to

注意:我要创建的 IQHandler 是请求加入游戏房间。

【问题讨论】:

标签: erlang xmpp ejabberd


【解决方案1】:

如果您发送没有to 属性的IQ 节,服务器将“代表发送实体处理该节”(RFC 6120, section 10.3.3)。实际上,这意味着服务器将把该节视为to 属性是用户的裸JID,在本例中为alfred@localhost

当您调用gen_iq_handler:add_iq_handler 注册新的处理程序时,您还指定了“范围”,ejabberd_localejabberd_sm(“SM”代表“会话管理器”)。如果是ejabberd_local,则处理程序将对发给服务器本身的IQ 节作出反应,在这种情况下为localhost。如果是ejabberd_sm,则处理程序将对寻址到本地用户的裸 JID 的 IQ 节做出反应,例如alfred@localhost.

这就是为什么你的 IQ 节最终没有被处理的原因。在发送请求时包含to="localhost",或者在注册处理程序时将ejabberd_local 更改为ejabberd_sm

【讨论】:

  • 就是这样,当我尝试使用to 时,我给出了完整的 JID,所以它当然不会工作,因为资源无法处理 Iq。也终于明白local和sm handlers的区别了,谢谢!
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 2014-09-28
  • 2014-12-20
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
相关资源
最近更新 更多