diff options
author | Paweł Chmielowski <pchmielowski@process-one.net> | 2012-05-02 20:59:09 +0200 |
---|---|---|
committer | Paweł Chmielowski <pchmielowski@process-one.net> | 2012-05-03 11:44:21 +0200 |
commit | e8921d79bab5bc725faf5f5d5933e80d4f13c6fe (patch) | |
tree | 124cd5df2cc34475e992fc532e9c4b77381e1603 | |
parent | Fix get_subscription_lists/4 (diff) |
Receiving missing http-bind request shouldn't close waiting out-ouf-order request
-rw-r--r-- | src/web/ejabberd_http_bind.erl | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/src/web/ejabberd_http_bind.erl b/src/web/ejabberd_http_bind.erl index 0108d4aa1..0024cb17d 100644 --- a/src/web/ejabberd_http_bind.erl +++ b/src/web/ejabberd_http_bind.erl @@ -441,8 +441,6 @@ handle_sync_event(#http_put{payload_size = PayloadSize} = Request, %% HTTP GET: send packets to the client handle_sync_event({http_get, Rid, Wait, Hold}, From, StateName, StateData) -> %% setup timer - send_receiver_reply(StateData#state.http_receiver, {ok, empty}), - cancel_timer(StateData#state.wait_timer), TNow = tnow(), if (Hold > 0) and @@ -450,7 +448,9 @@ handle_sync_event({http_get, Rid, Wait, Hold}, From, StateName, StateData) -> ((TNow - StateData#state.ctime) < (Wait*1000*1000)) and (StateData#state.rid =< Rid) and (StateData#state.input /= cancel) and - (StateData#state.pause == 0) -> + (StateData#state.pause == 0) -> + send_receiver_reply(StateData#state.http_receiver, {ok, empty}), + cancel_timer(StateData#state.wait_timer), WaitTimer = erlang:start_timer(Wait * 1000, self(), []), %% MR: Not sure we should cancel the state timer here. cancel_timer(StateData#state.timer), @@ -460,6 +460,8 @@ handle_sync_event({http_get, Rid, Wait, Hold}, From, StateName, StateData) -> wait_timer = WaitTimer, timer = undefined}}; (StateData#state.input == cancel) -> + send_receiver_reply(StateData#state.http_receiver, {ok, empty}), + cancel_timer(StateData#state.wait_timer), cancel_timer(StateData#state.timer), Timer = set_inactivity_timer(StateData#state.pause, StateData#state.max_inactivity), @@ -471,8 +473,6 @@ handle_sync_event({http_get, Rid, Wait, Hold}, From, StateName, StateData) -> timer = Timer}}; true -> cancel_timer(StateData#state.timer), - Timer = set_inactivity_timer(StateData#state.pause, - StateData#state.max_inactivity), Reply = {ok, StateData#state.output}, %% save request ReqList = [#hbr{rid = Rid, @@ -482,12 +482,26 @@ handle_sync_event({http_get, Rid, Wait, Hold}, From, StateName, StateData) -> [El || El <- StateData#state.req_list, El#hbr.rid /= Rid ] ], - {reply, Reply, StateName, StateData#state{ - output = [], - http_receiver = undefined, - wait_timer = undefined, - timer = Timer, - req_list = ReqList}} + if + (StateData#state.http_receiver /= undefined) and + StateData#state.out_of_order_receiver -> + {reply, Reply, StateName, StateData#state{ + output = [], + timer = undefined, + req_list = ReqList, + out_of_order_receiver = false}}; + true -> + send_receiver_reply(StateData#state.http_receiver, {ok, empty}), + cancel_timer(StateData#state.wait_timer), + Timer = set_inactivity_timer(StateData#state.pause, + StateData#state.max_inactivity), + {reply, Reply, StateName, + StateData#state{output = [], + http_receiver = undefined, + wait_timer = undefined, + timer = Timer, + req_list = ReqList}} + end end; handle_sync_event(peername, _From, StateName, StateData) -> |