diff --git a/src/web/ejabberd_http_bind.erl b/src/web/ejabberd_http_bind.erl index d25c7e060..ae57592be 100644 --- a/src/web/ejabberd_http_bind.erl +++ b/src/web/ejabberd_http_bind.erl @@ -47,7 +47,7 @@ -include("http_bind.hrl"). -include_lib("exmpp/include/exmpp.hrl"). --record(http_bind, {id, pid, to, hold, wait, version}). +-record(http_bind, {id, pid, to, hold, wait, process_delay, version}). -define(NULL_PEER, {{0, 0, 0, 0}, 0}). @@ -106,6 +106,11 @@ -define(MAX_PAUSE, 120). % may num of sec a client is allowed to pause % the session +%% Wait 100ms before continue processing, to allow the client provide more related stanzas. +-define(PROCESS_DELAY_DEFAULT, 100). +-define(PROCESS_DELAY_MIN, 0). +-define(PROCESS_DELAY_MAX, 1000). + %%%---------------------------------------------------------------------- %%% API @@ -276,6 +281,18 @@ handle_session_start(Pid, XmppDomain, Sid, Rid, Attrs, CHold end end, + Pdelay = case string:to_integer(xml:get_attr_s("process-delay",Attrs)) of + {error, _} -> + ?PROCESS_DELAY_DEFAULT; + {CPdelay, _} when + (?PROCESS_DELAY_MIN =< CPdelay) and + (CPdelay =< ?PROCESS_DELAY_MAX) -> + CPdelay; + {CPdelay, _} -> + erlang:max( + erlang:min(CPdelay,?PROCESS_DELAY_MAX), + ?PROCESS_DELAY_MIN) + end, Version = case catch list_to_float( exmpp_xml:get_attribute_from_list_as_list(Attrs, "ver", "")) of @@ -293,6 +310,7 @@ handle_session_start(Pid, XmppDomain, Sid, Rid, Attrs, XmppVersion}, hold = Hold, wait = Wait, + process_delay = Pdelay, version = Version }) end), @@ -946,6 +964,7 @@ update_shaper(ShaperState, PayloadSize) -> end. prepare_response(Sess, Rid, OutputEls, StreamStart) -> + receive after Sess#http_bind.process_delay -> ok end, case catch http_get(Sess, Rid) of {ok, cancel} -> %% actually it would be better if we could completely diff --git a/src/web/mod_http_bind.erl b/src/web/mod_http_bind.erl index 0c422b812..f28dce827 100644 --- a/src/web/mod_http_bind.erl +++ b/src/web/mod_http_bind.erl @@ -53,7 +53,7 @@ %% Duplicated from ejabberd_http_bind. %% TODO: move to hrl file. --record(http_bind, {id, pid, to, hold, wait, version}). +-record(http_bind, {id, pid, to, hold, wait, process_delay, version}). %%%---------------------------------------------------------------------- %%% API @@ -143,7 +143,7 @@ setup_database() -> migrate_database() -> case catch mnesia:table_info(http_bind, attributes) of - [id, pid, to, hold, wait, version] -> + [id, pid, to, hold, wait, process_delay, version] -> ok; _ -> %% Since the stored information is not important, instead