close/1,
sockname/1, peername/1]).
+-include("ejabberd.hrl").
+
-record(socket_state, {sockmod, socket, receiver}).
%%====================================================================
%% API
%%====================================================================
%%--------------------------------------------------------------------
-%% Function:
+%% Function:
%% Description:
%%--------------------------------------------------------------------
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}
(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).
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}
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,
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;