xml,append_subtags 时出现 Ejabberd 错误

Posted

技术标签:

【中文标题】xml,append_subtags 时出现 Ejabberd 错误【英文标题】:Ejabberd error while xml,append_subtags 【发布时间】:2015-03-04 21:16:59 【问题描述】:

我是 erlang 和 ejabbered/mongooseIM 的新手。我正在尝试编写一个非常简单的猫鼬模块,它将在发送之前向数据包添加一个额外的子元素。以下是我的代码:

-module(mod_test).

-behavior(gen_mod).


-export([start/2, stop/1]).
-export([add_child/1]).

-include("ejabberd.hrl").

start(Host, Opts) ->
    ejabberd_hooks:add(filter_packet, Host, ?MODULE, add_child, 0),
    ?DEBUG(" MOD_TEST Started",[]),
    ok.

stop(Host) ->
    ejabberd_hooks:delete(filter_packet, Host, ?MODULE, add_child, 0),
    ok.

add_child(From, To, XML = Packet) ->
    Tag = "a","b",
    NewPacket = xml:append_subtags(Packet, [Tag]),
    ?INFO_MSG("  To party: ~p~n",[To]),
    NewPacket.

我可以成功编译和启动模块。但是,我在运行时收到以下错误:

2015-03-04 12:16:30.506 [error] <0.760.0>@ejabberd_hooks:run_fold1:259 
function_clause,
[xml,append_subtags,[jid,<<"user2">>,<<"localhost">>,<<"Damien">>,<<"user2">>,<<"localhost">>,<<"Damien">>,jid,<<"user1">>,<<"localhost">>,<<"Gajim">>,<<"user1">>,<<"localhost">>,<<"Gajim">>,xmlel,<<"message">>,[<<"xml:lang">>,<<"en">>,<<"type">>,<<"chat">>,<<"to">>,<<"user1@localhost/Gajim">>,<<"id">>,<<"ab68a">>],[xmlcdata,<<"\n">>,xmlel,<<"body">>,[],[xmlcdata,<<"mmmmm">>],xmlcdata,<<"\n">>,xmlel,<<"active">>,[<<"xmlns">>,<<"http://jabber.org/protocol/chatstates">>],[],xmlcdata,<<"\n">>],
["a","b"]],[file,"src/xml.erl",line,276],
safely,apply,3,[file,"src/safely.erl",line,19],
ejabberd_hooks,run_fold1,4,[file,"src/ejabberd_hooks.erl",line,255],
ejabberd_router,do_route,3,[file,"src/ejabberd_router.erl",line,246],
ejabberd_router,route,3,[file,"src/ejabberd_router.erl",line,78],
ejabberd_c2s,session_established2,2,[file,"src/ejabberd_c2s.erl",line,1098],
p1_fsm_old,handle_msg,10,[file,"src/p1_fsm_old.erl",line,542],
proc_lib,wake_up,3,[file,"proc_lib.erl",line,247]]

问题是什么以及如何解决?

【问题讨论】:

对于那些跟踪这个问题的人,用户在 ejabberd.im 论坛中提出了这个问题,那里有更多的讨论:ejabberd.im/node/24790 【参考方案1】:

您将Packet(一个元组:From, To, XML)传递给xml:append_subtags/2,而您应该只传递XML。你的add_child/1 应该看起来更像:

add_child(From, To, XML = Packet) ->
    Tag = <<"a">>, <<"b">>,
    NewPacket = From, To, xml:append_subtags(XML, [Tag]),
    ?INFO_MSG("  To party: ~p~n",[To]),
    NewPacket.

我还将 "a", "b" 更改为 &lt;&lt;"a"&gt;&gt;, &lt;&lt;"b"&gt;&gt;,因为二进制文件在 MongooseIM 代码库中的任何地方都用于字符串处理。

此外,不建议使用优先级 0(ejabberd_hooks:add/5 的最后一个参数),因为如果您真的想在这个特定的处理程序之前插入一些处理程序到处理程序链中,这给您带来的灵活性很小。

【讨论】:

您好,非常感谢您的回复。现在看不到这些错误了,但我希望在接收端的数据包中看到附加标签 a,b。但不幸的是,我没有看到他们。我稍微更改了代码;替换 Tag = >, >, 由 Tag = xmlel,>,[],[xmlcdata, >],我可以看到额外的元素已从日志中添加到我的数据包中。但是,接收方没有得到这些元素。知道为什么吗? 您确定在日志行中看到添加到数据包中的自定义元素,上面写着“Send XML on stream ...”吗?如果是,那么客户端应该会收到调整后的数据包。 我添加了调试行。 ?DEBUG("Packet updated to ~p",[NewPacket]), 从那里我可以看到带有添加标签的 NewPacket。但是没有看到 Send XML on stream。 我并不是说您可能添加了任何自定义日志语句。当您将日志记录级别更改为 5 时,您将看到由 ejabberd_c2s 生成的日志条目,该组件负责客户端到服务器的连接。其中一个看起来像这样:2015-03-05 17:51:28.255 [debug] @ejabberd_c2s:send_text:1717 在流上发送 XML = ... 如果你觉得答案足够好(因为没有其他人......)你会考虑接受它吗?

以上是关于xml,append_subtags 时出现 Ejabberd 错误的主要内容,如果未能解决你的问题,请参考以下文章

读取 XML 元素时出现异常

使用 WebLogic 解析 XML 时出现 ClassCastException

将 XML 读入 DataTable 时出现 FormatException

使用 XSL 解析 XML 时出现问题

尝试将 xml 导入到 android 时出现 OutOfMemoryException

jaxb 编组时出现 javax.xml.bind.PropertyException