25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-11-24 16:23:40 +01:00

New option max_inactivity to configure maximum inactivity period (EJAB-512)

SVN Revision: 2247
This commit is contained in:
Badlop 2009-06-16 17:47:23 +00:00
parent feded4b0b7
commit 5fc16bc830

View File

@ -4,7 +4,7 @@
%%% Purpose : Implements XMPP over BOSH (XEP-0205) (formerly known as %%% Purpose : Implements XMPP over BOSH (XEP-0205) (formerly known as
%%% HTTP Binding) %%% HTTP Binding)
%%% Created : 21 Sep 2005 by Stefan Strigler <steve@zeank.in-berlin.de> %%% Created : 21 Sep 2005 by Stefan Strigler <steve@zeank.in-berlin.de>
%%% Id : $Id: ejabberd_http_bind.erl 854 2009-01-12 23:37:40Z badlop $ %%% Id : $Id: ejabberd_http_bind.erl 885 2009-02-14 09:01:54Z badlop $
%%%---------------------------------------------------------------------- %%%----------------------------------------------------------------------
-module(ejabberd_http_bind). -module(ejabberd_http_bind).
@ -60,6 +60,7 @@
pause=0, pause=0,
unprocessed_req_list = [], % list of request that have been delayed for proper reordering unprocessed_req_list = [], % list of request that have been delayed for proper reordering
req_list = [], % list of requests (cache) req_list = [], % list of requests (cache)
max_inactivity,
ip = ?NULL_PEER ip = ?NULL_PEER
}). }).
@ -233,6 +234,7 @@ init([Sid, Key, IP]) ->
{ok, loop, #state{id = Sid, {ok, loop, #state{id = Sid,
key = Key, key = Key,
socket = Socket, socket = Socket,
max_inactivity = ?MAX_INACTIVITY,
timer = Timer}}. timer = Timer}}.
%%---------------------------------------------------------------------- %%----------------------------------------------------------------------
@ -304,7 +306,7 @@ handle_sync_event({send, Packet}, _From, StateName, StateData) ->
StateData#state.pause*1000, self(), []); StateData#state.pause*1000, self(), []);
true -> true ->
erlang:start_timer( erlang:start_timer(
?MAX_INACTIVITY, self(), []) StateData#state.max_inactivity, self(), [])
end, end,
HTTPReply = case Output of HTTPReply = case Output of
[[]| OutPacket] -> [[]| OutPacket] ->
@ -431,7 +433,7 @@ handle_sync_event({http_get, Rid, Wait, Hold}, From, StateName, StateData) ->
StateData#state.pause*1000, self(), []); StateData#state.pause*1000, self(), []);
true -> true ->
erlang:start_timer( erlang:start_timer(
?MAX_INACTIVITY, self(), []) StateData#state.max_inactivity, self(), [])
end, end,
Output = StateData#state.output, Output = StateData#state.output,
ReqList = StateData#state.req_list, ReqList = StateData#state.req_list,
@ -456,7 +458,7 @@ handle_sync_event({http_get, Rid, Wait, Hold}, From, StateName, StateData) ->
StateData#state.pause*1000, self(), []); StateData#state.pause*1000, self(), []);
true -> true ->
erlang:start_timer( erlang:start_timer(
?MAX_INACTIVITY, self(), []) StateData#state.max_inactivity, self(), [])
end, end,
case StateData#state.output of case StateData#state.output of
[[]| OutPacket] -> [[]| OutPacket] ->
@ -521,7 +523,7 @@ handle_info({timeout, WaitTimer, _}, StateName,
StateData#state.pause*1000, self(), []); StateData#state.pause*1000, self(), []);
true -> true ->
erlang:start_timer( erlang:start_timer(
?MAX_INACTIVITY, self(), []) StateData#state.max_inactivity, self(), [])
end, end,
gen_fsm:reply(StateData#state.http_receiver, {ok, empty}), gen_fsm:reply(StateData#state.http_receiver, {ok, empty}),
{next_state, StateName, {next_state, StateName,
@ -663,7 +665,7 @@ process_http_put({http_put, Rid, Attrs, Payload, Hold, StreamTo, IP},
Pause*1000, self(), []); Pause*1000, self(), []);
true -> true ->
erlang:start_timer( erlang:start_timer(
?MAX_INACTIVITY, self(), []) StateData#state.max_inactivity, self(), [])
end, end,
case StateData#state.waiting_input of case StateData#state.waiting_input of
false -> false ->
@ -697,6 +699,7 @@ process_http_put({http_put, Rid, Attrs, Payload, Hold, StreamTo, IP},
_ -> _ ->
Payload Payload
end, end,
MaxInactivity = get_max_inactivity(StreamTo, StateData#state.max_inactivity),
?DEBUG("really sending now: ~s", [SendPacket]), ?DEBUG("really sending now: ~s", [SendPacket]),
Receiver ! {tcp, StateData#state.socket, Receiver ! {tcp, StateData#state.socket,
list_to_binary(SendPacket)}, list_to_binary(SendPacket)},
@ -712,6 +715,7 @@ process_http_put({http_put, Rid, Attrs, Payload, Hold, StreamTo, IP},
pause = Pause, pause = Pause,
last_poll = LastPoll, last_poll = LastPoll,
req_list = ReqList, req_list = ReqList,
max_inactivity = MaxInactivity,
ip = IP ip = IP
}) })
end end
@ -804,7 +808,7 @@ handle_http_put_error(Reason, #http_bind{pid=FsmRef}) ->
end. end.
prepare_response(#http_bind{id=Sid, wait=Wait, hold=Hold}=Sess, prepare_response(#http_bind{id=Sid, wait=Wait, hold=Hold, to=To}=Sess,
Rid, _, StreamStart) -> Rid, _, StreamStart) ->
receive after 100 -> ok end, receive after 100 -> ok end,
case catch http_get(Sess, Rid) of case catch http_get(Sess, Rid) of
@ -872,6 +876,7 @@ prepare_response(#http_bind{id=Sid, wait=Wait, hold=Hold}=Sess,
_ -> _ ->
[{"xmpp:version", Version}] [{"xmpp:version", Version}]
end, end,
MaxInactivity = get_max_inactivity(To, ?MAX_INACTIVITY),
{200, ?HEADER, {200, ?HEADER,
xml:element_to_string( xml:element_to_string(
{xmlelement,"body", {xmlelement,"body",
@ -882,7 +887,7 @@ prepare_response(#http_bind{id=Sid, wait=Wait, hold=Hold}=Sess,
{"requests", integer_to_list(Hold+1)}, {"requests", integer_to_list(Hold+1)},
{"inactivity", {"inactivity",
integer_to_list( integer_to_list(
trunc(?MAX_INACTIVITY/1000))}, trunc(MaxInactivity/1000))},
{"maxpause", {"maxpause",
integer_to_list(?MAX_PAUSE)}, integer_to_list(?MAX_PAUSE)},
{"polling", {"polling",
@ -1075,6 +1080,17 @@ elements_to_string([]) ->
elements_to_string([El | Els]) -> elements_to_string([El | Els]) ->
xml:element_to_string(El) ++ elements_to_string(Els). xml:element_to_string(El) ++ elements_to_string(Els).
%% @spec (To, Default::integer()) -> integer()
%% where To = [] | {Host::string(), Version::string()}
get_max_inactivity({Host, _}, Default) ->
case gen_mod:get_module_opt(Host, mod_http_bind, max_inactivity, undefined) of
Seconds when is_integer(Seconds) ->
Seconds * 1000;
undefined ->
Default
end;
get_max_inactivity(_, Default) ->
Default.
remove_tag_attr(Attr, El) -> remove_tag_attr(Attr, El) ->
case El of case El of