From: Holger Weiss Date: Mon, 11 Feb 2019 21:29:49 +0000 (+0100) Subject: mod_push: Improve notification error handling X-Git-Tag: 19.02~28 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=abdbc5df132309dddac7a539776d62aa86a88b99;p=ejabberd mod_push: Improve notification error handling Don't disable push notifications if the app server returned a temporary error, and log the app server's notification response. --- diff --git a/src/mod_push.erl b/src/mod_push.erl index 2aa699597..07772c0ef 100644 --- a/src/mod_push.erl +++ b/src/mod_push.erl @@ -441,14 +441,32 @@ notify(#{jid := #jid{luser = LUser, lserver = LServer}, notify(LUser, LServer, Clients, Pkt, Dir) -> lists:foreach( fun({TS, PushLJID, Node, XData}) -> - HandleResponse = fun(#iq{type = result}) -> - ok; - (#iq{type = error}) -> - spawn(?MODULE, delete_session, - [LUser, LServer, TS]); - (timeout) -> - ok % Hmm. - end, + HandleResponse = + fun(#iq{type = result}) -> + ?DEBUG("~s accepted notification for ~s@~s (~s)", + [jid:encode(PushLJID), LUser, LServer, Node]); + (#iq{type = error} = IQ) -> + case inspect_error(IQ) of + {wait, Reason} -> + ?INFO_MSG("~s rejected notification for " + "~s@~s (~s) temporarily: ~s", + [jid:encode(PushLJID), LUser, + LServer, Node, Reason]); + {Type, Reason} -> + spawn(?MODULE, delete_session, + [LUser, LServer, TS]), + ?WARNING_MSG("~s rejected notification for " + "~s@~s (~s), disabling push: ~s " + "(~s)", + [jid:encode(PushLJID), LUser, + LServer, Node, Reason, Type]) + end; + (timeout) -> + ?DEBUG("Timeout sending notification for ~s@~s (~s) " + "to ~s", + [LUser, LServer, Node, jid:encode(PushLJID)]), + ok % Hmm. + end, notify(LServer, PushLJID, Node, XData, Pkt, Dir, HandleResponse) end, Clients). @@ -667,6 +685,15 @@ get_body_text(#message{body = Body} = Msg) -> body_is_encrypted(#message{sub_els = SubEls}) -> lists:keyfind(<<"encrypted">>, #xmlel.name, SubEls) /= false. +-spec inspect_error(iq()) -> {atom(), binary()}. +inspect_error(IQ) -> + case xmpp:get_error(IQ) of + #stanza_error{type = Type} = Err -> + {Type, xmpp:format_stanza_error(Err)}; + undefined -> + {undefined, <<"unrecognized error">>} + end. + %%-------------------------------------------------------------------- %% Caching. %%--------------------------------------------------------------------