2013-05-25 18 views
5

In precedenza stavo usando xml: get_tag_attr_s ("tipo", pacchetto) per quella riga di debug in ejabberd 2.1.10, ma non funziona più in ejabberd 13.03. Probabilmente perché è deprecato secondo i documenti (http://www.process-one.net/docs/exmpp/devdoc/trunk/xml.html#get_attr_s-2), quindi ho provato a utilizzare una funzione dalla libreria exmpp.Errore di clausola di funzione quando si utilizza la funzione exmpp

Viene visualizzato un errore sulla seconda riga DEBUG (la prima riga di debug funziona correttamente). E idee su come ottenere il valore dall'attributo?

Codice estratto:

on_user_send_packet(From, To, Packet) -> 
    ?DEBUG("Sent packet (1): ~p", [Packet]), 
    Type = exmpp_xml:get_attribute(Packet, <<"type">>, <<"unknown">>), 
    ?DEBUG("Sent packet from (2): ~p", [From]), 

Log:

=INFO REPORT==== 2013-05-25 09:58:50 === 
    D(<0.1625.0>:mod_stanza_ack:59) : Sent packet (1): {xmlel,<<"message">>, 
               [{<<"to">>, 
                <<"[email protected]_dev">>}, 
               {<<"from">>, 
                <<"[email protected]_dev/webapp">>}, 
               {<<"type">>,<<"chat">>}, 
               {<<"id">>,<<"4834">>}], 
               [{xmlel,<<"body">>,[], 
                [{xmlcdata, 
                <<"SHOOOOOT">>}]}, 
               {xmlel,<<"request">>, 
                [{<<"xmlns">>, 
                <<"urn:xmpp:receipts">>}], 
                []}]} 

=ERROR REPORT==== 2013-05-25 09:58:50 === 
E(<0.1625.0>:ejabberd_hooks:315) : {function_clause, 
           [{exmpp_xml,get_attribute, 
            [{xmlel,<<"message">>, 
            [{<<"to">>, 
             <<"[email protected]_dev">>}, 
            {<<"from">>, 
             <<"[email protected]_dev/webapp">>}, 
            {<<"type">>,<<"chat">>}, 
            {<<"id">>,<<"4834">>}], 
            [{xmlel,<<"body">>,[], 
             [{xmlcdata,<<"SHOOOOOT">>}]}, 
            {xmlel,<<"request">>, 
             [{<<"xmlns">>, 
             <<"urn:xmpp:receipts">>}], 
             []}]}, 
            <<"from">>,<<"unknown">>], 
            [{file,"./core/exmpp_xml.erl"}, 
            {line,1173}]}, 
           {mod_stanza_ack,on_user_send_packet,3, 
            [{file,"mod_stanza_ack.erl"},{line,60}]}, 
           {ejabberd_hooks,run1,3, 
            [{file,"ejabberd_hooks.erl"}, 
            {line,311}]}, 
           {ejabberd_c2s,session_established2,2, 
            [{file,"ejabberd_c2s.erl"},{line,1136}]}, 
           {p1_fsm,handle_msg,10, 
            [{file,"p1_fsm.erl"},{line,578}]}, 
           {proc_lib,init_p_do_apply,3, 
            [{file,"proc_lib.erl"},{line,239}]}]} 

risposta

6

Il Packet che si sta passando ad exmpp_xml:get_attribute è un record xmlel con tre campi: nome di un elemento, gli attributi e gli elementi figlio. Tuttavia, exmpp definisce il record xmlel con cinque elementi (definition from here):

% Elements. 
-record(xmlel, { 
    ns = undefined :: xmlname() | undefined, 
    declared_ns = [] :: [{xmlname(), string() | none}], 
    name :: xmlname(), 
    attrs = [] :: [xmlattr()], 
    children = [] :: [#xmlel{} | xmlcdata()] | undefined 
}). 

ho avuto una rapida occhiata al codice sorgente ejabberd 13.03, e sembra che xml:get_tag_attr_s dovrebbe funzionare bene, così ho il sospetto che ejabberd 13.03 non è compatibile con exmpp. (Anche se di recente non ho seguito lo sviluppo di ejabberd da vicino, quindi mi piacerebbe avere più informazioni su questo). Penso che staresti meglio cercando di capire perché le interruzioni di get_tag_attr_s per te.

+1

Hai ragione. xml: get_tag_attr_s ("type", Packet) ora dovrebbe essere xml: get_tag_attr_s (<<"type">>, Packet) per funzionare con ejabberd 13.XX –

0

Pre ejabberd 13.XX

xml:get_tag_attr_s("type", Packet) 

Messaggio ejabberd 13.XX

xml:get_tag_attr_s(<<"type">>, Packet) 
0

Su ejabberd 16.04 dovrebbe essere

fxml: get_tag_attr_s (< < " digita ">>, Pacchetto)