aboutsummaryrefslogtreecommitdiff
path: root/src/web
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2012-05-04 14:19:52 +1000
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2012-05-04 14:19:52 +1000
commit75d3152a0f87c9c706ba306cb3b8725cfd81818e (patch)
tree5f4d6f03d1abc79c94e07c7e486e0efb101dfc3e /src/web
parentRemove CRLFs introduced in the previous merge (diff)
parentRepeated http-bind request should abort only requests with same rid (diff)
Merge branch '2.1.x' into 2.2.x
Conflicts: src/mod_muc/mod_muc.erl src/mod_muc/mod_muc_room.erl src/mod_offline.erl src/mod_offline_odbc.erl src/mod_shared_roster.erl src/web/ejabberd_http_bind.erl
Diffstat (limited to 'src/web')
-rw-r--r--src/web/ejabberd_http_bind.erl68
-rw-r--r--src/web/ejabberd_web_admin.erl27
2 files changed, 47 insertions, 48 deletions
diff --git a/src/web/ejabberd_http_bind.erl b/src/web/ejabberd_http_bind.erl
index 473cfe2d7..cbbe68c33 100644
--- a/src/web/ejabberd_http_bind.erl
+++ b/src/web/ejabberd_http_bind.erl
@@ -493,8 +493,6 @@ handle_sync_event({http_get, _Rid, _Wait, _Hold}, _From,
{reply, {ok, {prebind, JID}}, StateName, StateData#state{jid = undefined}};
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
@@ -502,7 +500,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),
@@ -511,20 +511,8 @@ handle_sync_event({http_get, Rid, Wait, Hold}, From, StateName, StateData) ->
out_of_order_receiver = StateData#state.rid < Rid,
wait_timer = WaitTimer,
timer = undefined}};
- (StateData#state.input == cancel) ->
- cancel_timer(StateData#state.timer),
- Timer = set_inactivity_timer(StateData#state.pause,
- StateData#state.max_inactivity),
- Reply = {ok, cancel},
- {reply, Reply, StateName, StateData#state{
- input = queue:new(),
- http_receiver = undefined,
- wait_timer = undefined,
- 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,
@@ -534,12 +522,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) ->
@@ -709,16 +711,20 @@ process_http_put(#http_put{rid = Rid, attrs = Attrs, payload = Payload,
{reply, Reply, StateName, StateData};
repeat ->
?DEBUG("REPEATING ~p", [Rid]),
- Reply = case [El#hbr.out ||
- El <- StateData#state.req_list,
- El#hbr.rid == Rid] of
- [] ->
- {error, not_exists};
- [Out | _XS] ->
- {repeat, lists:reverse(Out)}
- end,
- {reply, Reply, StateName, StateData#state{input = cancel,
- last_poll = LastPoll}};
+ case [El#hbr.out ||
+ El <- StateData#state.req_list,
+ El#hbr.rid == Rid] of
+ [] ->
+ {error, not_exists};
+ [Out | _XS] ->
+ if (Rid == StateData#state.rid) and
+ (StateData#state.http_receiver /= undefined) ->
+ {reply, ok, StateName, StateData};
+ true ->
+ Reply = {repeat, lists:reverse(Out)},
+ {reply, Reply, StateName, StateData#state{last_poll = LastPoll}}
+ end
+ end;
{true, Pause} ->
SaveKey = if
NewKey == "" ->
diff --git a/src/web/ejabberd_web_admin.erl b/src/web/ejabberd_web_admin.erl
index 447926e26..59e9b0313 100644
--- a/src/web/ejabberd_web_admin.erl
+++ b/src/web/ejabberd_web_admin.erl
@@ -1564,7 +1564,6 @@ list_users_in_diapason(Host, Diap, Lang, URLFunc) ->
[list_given_users(Host, Sub, "../../", Lang, URLFunc)].
list_given_users(Host, Users, Prefix, Lang, URLFunc) ->
- ModLast = get_lastactivity_module(Host),
ModOffline = get_offlinemsg_module(Host),
?XE("table",
[?XE("thead",
@@ -1583,7 +1582,7 @@ list_given_users(Host, Users, Prefix, Lang, URLFunc) ->
FLast =
case ejabberd_sm:get_user_resources(User, Server) of
[] ->
- case ModLast:get_last_info(User, Server) of
+ case mod_last:get_last_info(User, Server) of
not_found ->
?T("Never");
{ok, Shift, _Status} ->
@@ -1618,22 +1617,17 @@ get_offlinemsg_length(ModOffline, User, Server) ->
end.
get_offlinemsg_module(Server) ->
- case [mod_offline, mod_offline_odbc] -- gen_mod:loaded_modules(Server) of
- [mod_offline, mod_offline_odbc] -> none;
- [mod_offline_odbc] -> mod_offline;
- [mod_offline] -> mod_offline_odbc
- end.
-
-get_lastactivity_module(Server) ->
- case lists:member(mod_last, gen_mod:loaded_modules(Server)) of
- true -> mod_last;
- _ -> mod_last_odbc
+ case gen_mod:is_loaded(Server, mod_offline) of
+ true ->
+ mod_offline;
+ false ->
+ none
end.
get_lastactivity_menuitem_list(Server) ->
- case get_lastactivity_module(Server) of
- mod_last -> [{"last-activity", "Last Activity"}];
- mod_last_odbc -> []
+ case gen_mod:db_type(Server, mod_last) of
+ mnesia -> [{"last-activity", "Last Activity"}];
+ _ -> []
end.
us_to_list({User, Server}) ->
@@ -1735,10 +1729,9 @@ user_info(User, Server, Query, Lang) ->
UserItems = ejabberd_hooks:run_fold(webadmin_user, LServer, [],
[User, Server, Lang]),
%% Code copied from list_given_users/5:
- ModLast = get_lastactivity_module(Server),
LastActivity = case ejabberd_sm:get_user_resources(User, Server) of
[] ->
- case ModLast:get_last_info(User, Server) of
+ case mod_last:get_last_info(User, Server) of
not_found ->
?T("Never");
{ok, Shift, _Status} ->