]> granicus.if.org Git - ejabberd/commitdiff
add the ability to send raw xml packets over http bind
authorChristopher tofu Zorn <tofu@stanziq.com>
Tue, 1 Jun 2010 18:52:15 +0000 (14:52 -0400)
committerBadlop <badlop@process-one.net>
Mon, 29 Nov 2010 19:05:37 +0000 (20:05 +0100)
src/ejabberd_c2s.erl
src/web/ejabberd_http_bind.erl

index d97b04559476d37d942be2154618ba50c35e8c1c..730ac17c9dbb1cd98d9315119de6adbcaea18b89 100644 (file)
@@ -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).
index 1533af361a9b5096517a50f1f8bea77b65e03d5f..a1d255cff9cc3396099957c6d78a67e25bac9e66 100644 (file)
@@ -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,
             "<body type='terminate' xmlns='"++
             ?NS_HTTP_BIND++"'/>"};
@@ -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 = "<body xmlns='"++?NS_HTTP_BIND++"'>" 
+                       ++ TypedEls ++
+                       "</body>",
                    ?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.