]> granicus.if.org Git - ejabberd/commitdiff
mod_push: Improve notification error handling
authorHolger Weiss <holger@zedat.fu-berlin.de>
Mon, 11 Feb 2019 21:29:49 +0000 (22:29 +0100)
committerHolger Weiss <holger@zedat.fu-berlin.de>
Mon, 11 Feb 2019 21:29:49 +0000 (22:29 +0100)
Don't disable push notifications if the app server returned a temporary
error, and log the app server's notification response.

src/mod_push.erl

index 2aa6995979948d139c1e369c2d98633cc5a0f328..07772c0ef80c11bdab22f5cc583cc56d652838d1 100644 (file)
@@ -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.
 %%--------------------------------------------------------------------