From 3e24408710e0d7313e7c90daafdc9dd619fab2b6 Mon Sep 17 00:00:00 2001 From: Christopher tofu Zorn Date: Tue, 1 Jun 2010 14:52:15 -0400 Subject: [PATCH] add the ability to send raw xml packets over http bind --- src/ejabberd_c2s.erl | 4 ++++ src/web/ejabberd_http_bind.erl | 27 +++++++++++++++++++-------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index d97b04559..730ac17c9 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1504,6 +1504,10 @@ change_shaper(StateData, JID) -> StateData#state.shaper, JID), (StateData#state.sockmod):change_shaper(StateData#state.socket, Shaper). +send_text(StateData, Text) when StateData#state.xml_socket -> + ?DEBUG("Send Text on stream = ~p", [lists:flatten(Text)]), + (StateData#state.sockmod):send_xml(StateData#state.socket, + {xmlstreamraw, Text}); send_text(StateData, Text) -> ?DEBUG("Send XML on stream = ~p", [Text]), (StateData#state.sockmod):send(StateData#state.socket, Text). diff --git a/src/web/ejabberd_http_bind.erl b/src/web/ejabberd_http_bind.erl index 1533af361..a1d255cff 100644 --- a/src/web/ejabberd_http_bind.erl +++ b/src/web/ejabberd_http_bind.erl @@ -928,6 +928,7 @@ prepare_response(Sess, Rid, OutputEls, StreamStart) -> prepare_outpacket_response(Sess, _Rid, OutPacket, false) -> case catch send_outpacket(Sess, OutPacket) of {'EXIT', _Reason} -> + ?DEBUG("Error in sending packet ~p ", [_Reason]), {200, ?HEADER, ""}; @@ -1034,17 +1035,25 @@ send_outpacket(#http_bind{pid = FsmRef}, OutPacket) -> lists:all(fun({xmlstreamelement, {xmlelement, "stream:error", _, _}}) -> false; ({xmlstreamelement, _}) -> true; + ({xmlstreamraw, _}) -> true; (_) -> false end, OutPacket), case AllElements of true -> - TypedEls = [check_default_xmlns(OEl) || - {xmlstreamelement, OEl} <- OutPacket], - Body = xml:element_to_binary( - {xmlelement,"body", - [{"xmlns", - ?NS_HTTP_BIND}], - TypedEls}), + TypedEls = lists:foldr(fun({xmlstreamelement, El}, Acc) -> + Acc ++ + [xml:element_to_string( + check_default_xmlns(El) + )]; + ({xmlstreamraw, R}, Acc) -> + Acc ++ [R] + end, + [], + OutPacket), + + Body = "" + ++ TypedEls ++ + "", ?DEBUG(" --- outgoing data --- ~n~s~n --- END --- ~n", [Body]), {200, ?HEADER, Body}; @@ -1218,7 +1227,9 @@ check_default_xmlns({xmlelement, Name, Attrs, Els} = El) -> case xml:get_tag_attr_s("xmlns", El) of "" -> {xmlelement, Name, [{"xmlns", ?NS_CLIENT} | Attrs], Els}; _ -> El - end. + end; +check_default_xmlns(El) -> + El. %% Check that mod_http_bind has been defined in config file. %% Print a warning in log file if this is not the case. -- 2.40.0