aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaweł Chmielowski <pchmielowski@process-one.net>2012-05-02 20:59:09 +0200
committerPaweł Chmielowski <pchmielowski@process-one.net>2012-05-03 11:44:21 +0200
commite8921d79bab5bc725faf5f5d5933e80d4f13c6fe (patch)
tree124cd5df2cc34475e992fc532e9c4b77381e1603 /src
parentFix get_subscription_lists/4 (diff)
Receiving missing http-bind request shouldn't close waiting out-ouf-order request
Diffstat (limited to 'src')
-rw-r--r--src/web/ejabberd_http_bind.erl36
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) ->