diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2012-05-04 14:19:52 +1000 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2012-05-04 14:19:52 +1000 |
commit | 75d3152a0f87c9c706ba306cb3b8725cfd81818e (patch) | |
tree | 5f4d6f03d1abc79c94e07c7e486e0efb101dfc3e /src/web | |
parent | Remove CRLFs introduced in the previous merge (diff) | |
parent | Repeated 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.erl | 68 | ||||
-rw-r--r-- | src/web/ejabberd_web_admin.erl | 27 |
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} -> |