changeset 3526:e84ffb48acd4

plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
author Goffi <goffi@goffi.org>
date Wed, 05 May 2021 15:37:33 +0200
parents 7f5bf108961a
children bbf92ef05f38
files sat/plugins/plugin_xep_0363.py
diffstat 1 files changed, 15 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/sat/plugins/plugin_xep_0363.py	Wed May 05 15:37:33 2021 +0200
+++ b/sat/plugins/plugin_xep_0363.py	Wed May 05 15:37:33 2021 +0200
@@ -24,6 +24,7 @@
 from wokkel import disco, iwokkel
 from zope.interface import implementer
 from twisted.words.protocols.jabber import jid, xmlstream, error
+from twisted.words.xish import domish
 from twisted.internet import reactor
 from twisted.internet import defer
 from twisted.web import client as http_client
@@ -33,7 +34,7 @@
 from sat.core.constants import Const as C
 from sat.core.log import getLogger
 from sat.core import exceptions
-from sat.tools import web as sat_web
+from sat.tools import web as sat_web, utils
 
 
 log = getLogger(__name__)
@@ -122,6 +123,12 @@
         self.handlers.append(req_handler)
         self.handlers.sort(key=lambda handler: handler.priority, reverse=True)
 
+    def getFileTooLargeElt(self, max_size: int) -> domish.Element:
+        """Generate <file-too-large> app condition for errors"""
+        file_too_large_elt = domish.Element((NS_HTTP_UPLOAD, "file-too-large"))
+        file_too_large_elt.addElement("max-file-size", str(max_size))
+        return file_too_large_elt
+
     async def getHTTPUploadEntity(self, client, upload_jid=None):
         """Get HTTP upload capable entity
 
@@ -356,6 +363,9 @@
 
     def onComponentRequest(self, iq_elt, client):
         iq_elt.handled=True
+        defer.ensureDeferred(self.handleComponentRequest(client, iq_elt))
+
+    async def handleComponentRequest(self, client, iq_elt):
         try:
             request_elt = next(iq_elt.elements(NS_HTTP_UPLOAD, "request"))
             request = UploadRequest(
@@ -372,7 +382,7 @@
 
         for handler in self.handlers:
             try:
-                slot = handler.callback(client, request)
+                slot = await utils.asDeferred(handler.callback, client, request)
             except error.StanzaError as e:
                 log.warning(
                     "a stanza error has been raised while processing HTTP Upload of "
@@ -389,11 +399,9 @@
             log.warning(
                 _("no service can handle HTTP Upload request: {elt}")
                 .format(elt=iq_elt.toXml()))
-            if err is not None:
-                condition = err.condition
-            else:
-                condition = "feature-not-implemented"
-            client.sendError(iq_elt, condition)
+            if err is None:
+                err = error.StanzaError("feature-not-implemented")
+            client.send(err.toResponse(iq_elt))
             return
 
         iq_result_elt = xmlstream.toResponse(iq_elt, "result")