From ab9667f9178548fcb6d68f1028cdfc2e727cac8a Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Fri, 23 May 2014 11:38:54 +0200 Subject: [PATCH] XEP-0198: Don't exit on socket send failure If stream management is enabled, don't exit the c2s process when ejabberd_socket:send/2 fails, but close the socket instead. This gives the client a chance to resume the session. Thanks go to Matthias Rieber for reporting the issue, providing detailed logs, and testing the fix. --- src/ejabberd_c2s.erl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 5d0cc9c08..1076eb895 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1811,6 +1811,14 @@ send_text(StateData, Text) when StateData#state.xml_socket -> ?DEBUG("Send Text on stream = ~p", [Text]), (StateData#state.sockmod):send_xml(StateData#state.socket, {xmlstreamraw, Text}); +send_text(StateData, Text) when StateData#state.mgmt_state == active -> + ?DEBUG("Send XML on stream = ~p", [Text]), + case catch (StateData#state.sockmod):send(StateData#state.socket, Text) of + {'EXIT', _} -> + (StateData#state.sockmod):close(StateData#state.socket); + _ -> + ok + end; send_text(StateData, Text) -> ?DEBUG("Send XML on stream = ~p", [Text]), (StateData#state.sockmod):send(StateData#state.socket, Text).