]> granicus.if.org Git - ejabberd/commitdiff
Support gen_tcp send timeout: Close the connection if the other end has disconnected...
authorMickaël Rémond <mickael.remond@process-one.net>
Mon, 19 Oct 2009 09:36:23 +0000 (09:36 +0000)
committerMickaël Rémond <mickael.remond@process-one.net>
Mon, 19 Oct 2009 09:36:23 +0000 (09:36 +0000)
SVN Revision: 2671

src/ejabberd_listener.erl
src/ejabberd_s2s_out.erl
src/ejabberd_socket.erl
src/web/ejabberd_http.erl

index 26167351f3872318ee60d479dbc2f9c911154914..dad7aa5be1780f26af3b2f0678315ec17b189c99 100644 (file)
@@ -132,6 +132,7 @@ init_tcp(PortIP, Module, Opts, SockOpts, Port, IPS) ->
                                {reuseaddr, true},
                                {nodelay, true},
                                {send_timeout, ?TCP_SEND_TIMEOUT},
+                                {send_timeout_close, true},
                                {keepalive, true} |
                                SockOpts]),
     case Res of
index 66396e1e31e17325608a356c0be34db19c9fe2c8..8fb82c07d64a9c2531f71ed9f0f91d063fc6f105 100644 (file)
@@ -268,6 +268,7 @@ open_socket2(Type, Addr, Port) ->
     case (catch ejabberd_socket:connect(Addr, Port,
                                        [binary, {packet, 0},
                                         {send_timeout, ?TCP_SEND_TIMEOUT},
+                                         {send_timeout_close, true},
                                         {active, false}, Type],
                                        Timeout)) of
        {ok, _Socket} = R -> R;
index d629a77d9aff83d7d7c4c8177e41a15ffef29977..a3c008c97359f003e23c0c49bac42f4aeca2003d 100644 (file)
         close/1,
         sockname/1, peername/1]).
 
+-include("ejabberd.hrl").
+
 -record(socket_state, {sockmod, socket, receiver}).
 
 %%====================================================================
 %% API
 %%====================================================================
 %%--------------------------------------------------------------------
-%% Function: 
+%% Function:
 %% Description:
 %%--------------------------------------------------------------------
 start(Module, SockMod, Socket, Opts) ->
@@ -67,7 +69,7 @@ start(Module, SockMod, Socket, Opts) ->
                case catch SockMod:custom_receiver(Socket) of
                    {receiver, RecMod, RecPid} ->
                        {RecMod, RecPid, RecMod};
-                   _ -> 
+                   _ ->
                        RecPid = ejabberd_receiver:start(
                                   Socket, SockMod, none, MaxStanzaSize),
                        {ejabberd_receiver, RecPid, RecPid}
@@ -158,10 +160,22 @@ reset_stream(SocketData) when is_atom(SocketData#socket_state.receiver) ->
     (SocketData#socket_state.receiver):reset_stream(
       SocketData#socket_state.socket).
 
+%% sockmod=gen_tcp|tls|ejabberd_zlib
 send(SocketData, Data) ->
-    catch (SocketData#socket_state.sockmod):send(
-           SocketData#socket_state.socket, Data).
+    case catch (SocketData#socket_state.sockmod):send(
+            SocketData#socket_state.socket, Data) of
+        ok -> ok;
+       {error, timeout} ->
+           ?INFO_MSG("Timeout on ~p:send",[SocketData#socket_state.sockmod]),
+           exit(normal);
+        Error ->
+           ?DEBUG("Error in ~p:send: ~p",[SocketData#socket_state.sockmod, Error]),
+           exit(normal)
+    end.
 
+%% Can only be called when in c2s StateData#state.xml_socket is true
+%% This function is used for HTTP bind
+%% sockmod=ejabberd_http_poll|ejabberd_http_bind or any custom module
 send_xml(SocketData, Data) ->
     catch (SocketData#socket_state.sockmod):send_xml(
            SocketData#socket_state.socket, Data).
index bed6c28ac1cc97ff90d2a81d1b8be42f31b27d7e..bff4b4d45cc8b7ae8060546b0a73307784211d8b 100644 (file)
@@ -101,7 +101,7 @@ start_link({SockMod, Socket}, Opts) ->
     end,
 
     %% XXX bard: for backward compatibility, expand in Opts:
-    %%  web_admin -> {["admin"], ejabberd_web_admin} 
+    %%  web_admin -> {["admin"], ejabberd_web_admin}
     %%  http_bind -> {["http-bind"], mod_http_bind}
     %%  http_poll -> {["http-poll"], ejabberd_http_poll}
 
@@ -143,8 +143,15 @@ socket_type() ->
     raw.
 
 send_text(State, Text) ->
-    (State#state.sockmod):send(State#state.socket, Text).
-
+    case catch (State#state.sockmod):send(State#state.socket, Text) of
+        ok -> ok;
+       {error, timeout} ->
+           ?INFO_MSG("Timeout on ~p:send",[State#state.sockmod]),
+           exit(normal);
+        Error ->
+           ?DEBUG("Error in ~p:send: ~p",[State#state.sockmod, Error]),
+           exit(normal)
+    end.
 
 receive_headers(State) ->
     SockMod = State#state.sockmod,
@@ -637,7 +644,7 @@ start_dir(N, Path, "./"  ++ T ) -> start_dir(N    , Path, T);
 start_dir(N, Path, "../" ++ T ) -> start_dir(N + 1, Path, T);
 start_dir(N, Path,          T ) -> rest_dir (N    , Path, T).
 
-rest_dir (_N, Path, []         ) -> case Path of 
+rest_dir (_N, Path, []         ) -> case Path of
                                       [] -> "/";
                                       _  -> Path
                                   end;