Don't send ping if resource is gone
This commit is contained in:
parent
f61f5beb5b
commit
f4959c8b28
|
@ -138,29 +138,37 @@ handle_info({iq_reply, timeout, JID}, State) ->
|
||||||
ejabberd_hooks:run(user_ping_timeout, State#state.host,
|
ejabberd_hooks:run(user_ping_timeout, State#state.host,
|
||||||
[JID]),
|
[JID]),
|
||||||
Timers = case State#state.timeout_action of
|
Timers = case State#state.timeout_action of
|
||||||
kill ->
|
kill ->
|
||||||
#jid{user = User, server = Server,
|
#jid{user = User, server = Server,
|
||||||
resource = Resource} =
|
resource = Resource} =
|
||||||
JID,
|
JID,
|
||||||
case ejabberd_sm:get_session_pid(User, Server, Resource)
|
case ejabberd_sm:get_session_pid(User, Server, Resource) of
|
||||||
of
|
Pid when is_pid(Pid) ->
|
||||||
Pid when is_pid(Pid) -> ejabberd_c2s:close(Pid, ping_timeout);
|
ejabberd_c2s:close(Pid, ping_timeout);
|
||||||
_ -> ok
|
_ ->
|
||||||
end,
|
ok
|
||||||
del_timer(JID, State#state.timers);
|
end,
|
||||||
_ ->
|
del_timer(JID, State#state.timers);
|
||||||
State#state.timers
|
_ ->
|
||||||
end,
|
State#state.timers
|
||||||
|
end,
|
||||||
{noreply, State#state{timers = Timers}};
|
{noreply, State#state{timers = Timers}};
|
||||||
handle_info({timeout, _TRef, {ping, JID}}, State) ->
|
handle_info({timeout, _TRef, {ping, JID}}, State) ->
|
||||||
Host = State#state.host,
|
Timers = case ejabberd_sm:get_session_pid(JID#jid.luser,
|
||||||
From = jid:make(Host),
|
JID#jid.lserver,
|
||||||
IQ = #iq{from = From, to = JID, type = get, sub_els = [#ping{}]},
|
JID#jid.lresource) of
|
||||||
ejabberd_router:route_iq(IQ, JID,
|
none ->
|
||||||
gen_mod:get_module_proc(Host, ?MODULE),
|
del_timer(JID, State#state.timers);
|
||||||
State#state.ping_ack_timeout),
|
_ ->
|
||||||
Timers = add_timer(JID, State#state.ping_interval,
|
Host = State#state.host,
|
||||||
State#state.timers),
|
From = jid:make(Host),
|
||||||
|
IQ = #iq{from = From, to = JID, type = get, sub_els = [#ping{}]},
|
||||||
|
ejabberd_router:route_iq(IQ, JID,
|
||||||
|
gen_mod:get_module_proc(Host, ?MODULE),
|
||||||
|
State#state.ping_ack_timeout),
|
||||||
|
add_timer(JID, State#state.ping_interval,
|
||||||
|
State#state.timers)
|
||||||
|
end,
|
||||||
{noreply, State#state{timers = Timers}};
|
{noreply, State#state{timers = Timers}};
|
||||||
handle_info(Info, State) ->
|
handle_info(Info, State) ->
|
||||||
?WARNING_MSG("Unexpected info: ~p", [Info]),
|
?WARNING_MSG("Unexpected info: ~p", [Info]),
|
||||||
|
@ -243,10 +251,10 @@ unregister_iq_handlers(Host) ->
|
||||||
add_timer(JID, Interval, Timers) ->
|
add_timer(JID, Interval, Timers) ->
|
||||||
LJID = jid:tolower(JID),
|
LJID = jid:tolower(JID),
|
||||||
NewTimers = case maps:find(LJID, Timers) of
|
NewTimers = case maps:find(LJID, Timers) of
|
||||||
{ok, OldTRef} ->
|
{ok, OldTRef} ->
|
||||||
misc:cancel_timer(OldTRef),
|
misc:cancel_timer(OldTRef),
|
||||||
maps:remove(LJID, Timers);
|
maps:remove(LJID, Timers);
|
||||||
_ -> Timers
|
_ -> Timers
|
||||||
end,
|
end,
|
||||||
TRef = erlang:start_timer(Interval, self(), {ping, JID}),
|
TRef = erlang:start_timer(Interval, self(), {ping, JID}),
|
||||||
maps:put(LJID, TRef, NewTimers).
|
maps:put(LJID, TRef, NewTimers).
|
||||||
|
@ -255,10 +263,10 @@ add_timer(JID, Interval, Timers) ->
|
||||||
del_timer(JID, Timers) ->
|
del_timer(JID, Timers) ->
|
||||||
LJID = jid:tolower(JID),
|
LJID = jid:tolower(JID),
|
||||||
case maps:find(LJID, Timers) of
|
case maps:find(LJID, Timers) of
|
||||||
{ok, TRef} ->
|
{ok, TRef} ->
|
||||||
misc:cancel_timer(TRef),
|
misc:cancel_timer(TRef),
|
||||||
maps:remove(LJID, Timers);
|
maps:remove(LJID, Timers);
|
||||||
_ -> Timers
|
_ -> Timers
|
||||||
end.
|
end.
|
||||||
|
|
||||||
depends(_Host, _Opts) ->
|
depends(_Host, _Opts) ->
|
||||||
|
|
Loading…
Reference in New Issue