From d4ec7a2f01f35793c05442165166561c9f9b1f29 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 7 Jun 2010 13:44:55 +0200 Subject: [PATCH] New optional BOSH connection attribute process-delay (EJAB-1257) --- src/web/ejabberd_http_bind.erl | 21 ++++++++++++++++++++- src/web/mod_http_bind.erl | 4 ++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/web/ejabberd_http_bind.erl b/src/web/ejabberd_http_bind.erl index 6f15703e0..80ddaf3ea 100644 --- a/src/web/ejabberd_http_bind.erl +++ b/src/web/ejabberd_http_bind.erl @@ -45,7 +45,7 @@ -include("ejabberd_http.hrl"). -include("http_bind.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}). @@ -107,6 +107,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 @@ -257,6 +262,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( xml:get_attr_s("ver", Attrs)) of @@ -274,6 +291,7 @@ handle_session_start(Pid, XmppDomain, Sid, Rid, Attrs, XmppVersion}, hold = Hold, wait = Wait, + process_delay = Pdelay, version = Version }) end), @@ -884,6 +902,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 bbaeae6c6..586b8eaaf 100644 --- a/src/web/mod_http_bind.erl +++ b/src/web/mod_http_bind.erl @@ -52,7 +52,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 @@ -138,7 +138,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