From 6b7d70adf6adace9406934f595fa8e50cbd6dc43 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Mon, 4 Jun 2012 18:11:59 +1000 Subject: [PATCH] Do not close session with an item-not-found error when receiving duplicate request with same rid as the currently active one (EJABS-1844) (thanks to Pawel Chmielowski) Conflicts: src/web/ejabberd_bosh.erl --- src/web/ejabberd_bosh.erl | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/web/ejabberd_bosh.erl b/src/web/ejabberd_bosh.erl index 2087e76e6..c33b058a0 100644 --- a/src/web/ejabberd_bosh.erl +++ b/src/web/ejabberd_bosh.erl @@ -463,20 +463,18 @@ active1(#body{attrs = Attrs} = Req, From, State) -> {next_state, active, State1#state{receivers = Receivers}}; RID =< State#state.prev_rid -> - case gb_trees:lookup(RID, State#state.responses) of - {value, PrevBody} -> - {next_state, active, - do_reply(State, From, PrevBody, RID)}; - none -> - reply_stop(State, - #body{http_reason = - <<"Request ID is out of range">>, - attrs = - [{<<"type">>, <<"terminate">>}, - {<<"condition">>, - <<"item-not-found">>}]}, - From, RID) - end; + %% TODO: do we need to check 'key' here? It seems so... + case gb_trees:lookup(RID, State#state.responses) of + {value, PrevBody} -> + {next_state, active, + do_reply(State, From, PrevBody, RID)}; + none -> + State1 = drop_holding_receiver(State), + State2 = restart_inactivity_timer(State1), + Receivers = gb_trees:insert(RID, {From, Req}, + State2#state.receivers), + {next_state, active, State2#state{receivers = Receivers}} + end; not IsValidKey -> reply_stop(State, #body{http_reason = <<"Session key mismatch">>,