%%% Purpose : Implements XMPP over BOSH (XEP-0205) (formerly known as
%%% HTTP Binding)
%%% 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).
pause=0,
unprocessed_req_list = [], % list of request that have been delayed for proper reordering
req_list = [], % list of requests (cache)
- ip = ?NULL_PEER
+ max_inactivity,
+ ip = ?NULL_PEER
}).
{ok, loop, #state{id = Sid,
key = Key,
socket = Socket,
+ max_inactivity = ?MAX_INACTIVITY,
timer = Timer}}.
%%----------------------------------------------------------------------
StateData#state.pause*1000, self(), []);
true ->
erlang:start_timer(
- ?MAX_INACTIVITY, self(), [])
+ StateData#state.max_inactivity, self(), [])
end,
HTTPReply = case Output of
[[]| OutPacket] ->
StateData#state.pause*1000, self(), []);
true ->
erlang:start_timer(
- ?MAX_INACTIVITY, self(), [])
+ StateData#state.max_inactivity, self(), [])
end,
Output = StateData#state.output,
ReqList = StateData#state.req_list,
StateData#state.pause*1000, self(), []);
true ->
erlang:start_timer(
- ?MAX_INACTIVITY, self(), [])
+ StateData#state.max_inactivity, self(), [])
end,
case StateData#state.output of
[[]| OutPacket] ->
StateData#state.pause*1000, self(), []);
true ->
erlang:start_timer(
- ?MAX_INACTIVITY, self(), [])
+ StateData#state.max_inactivity, self(), [])
end,
gen_fsm:reply(StateData#state.http_receiver, {ok, empty}),
{next_state, StateName,
Pause*1000, self(), []);
true ->
erlang:start_timer(
- ?MAX_INACTIVITY, self(), [])
+ StateData#state.max_inactivity, self(), [])
end,
case StateData#state.waiting_input of
false ->
_ ->
Payload
end,
+ MaxInactivity = get_max_inactivity(StreamTo, StateData#state.max_inactivity),
?DEBUG("really sending now: ~s", [SendPacket]),
Receiver ! {tcp, StateData#state.socket,
list_to_binary(SendPacket)},
pause = Pause,
last_poll = LastPoll,
req_list = ReqList,
+ max_inactivity = MaxInactivity,
ip = IP
})
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) ->
receive after 100 -> ok end,
case catch http_get(Sess, Rid) of
_ ->
[{"xmpp:version", Version}]
end,
+ MaxInactivity = get_max_inactivity(To, ?MAX_INACTIVITY),
{200, ?HEADER,
xml:element_to_string(
{xmlelement,"body",
{"requests", integer_to_list(Hold+1)},
{"inactivity",
integer_to_list(
- trunc(?MAX_INACTIVITY/1000))},
+ trunc(MaxInactivity/1000))},
{"maxpause",
integer_to_list(?MAX_PAUSE)},
{"polling",
elements_to_string([El | 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) ->
case El of