diff src/plugins/plugin_xep_0363.py @ 1824:a19161bb3ff7

plugin upload, XEP-0363: splitted fileUpload in fileUpload + upload: fileUpload is used by external frontends, while upload can be used by frontends. upload return in addition to the progress_id a download_d Deferred which fire with URI when file is uploaded. changed option ignore-tls-errors to ignore_tls_errors.
author Goffi <goffi@goffi.org>
date Fri, 22 Jan 2016 20:24:17 +0100
parents d17772b0fe22
children c55220fc03e4
line wrap: on
line diff
--- a/src/plugins/plugin_xep_0363.py	Fri Jan 22 20:24:17 2016 +0100
+++ b/src/plugins/plugin_xep_0363.py	Fri Jan 22 20:24:17 2016 +0100
@@ -123,7 +123,8 @@
 
     def _fileHTTPUpload(self, filepath, filename='', upload_jid='', ignore_tls_errors=False, profile=C.PROF_KEY_NONE):
         assert os.path.isabs(filepath) and os.path.isfile(filepath)
-        return self.fileHTTPUpload(filepath, filename or None, jid.JID(upload_jid) if upload_jid else None, {'ignore-tls-errors': ignore_tls_errors}, profile)
+        progress_id_d, dummy = self.fileHTTPUpload(filepath, filename or None, jid.JID(upload_jid) if upload_jid else None, {'ignore_tls_errors': ignore_tls_errors}, profile)
+        return progress_id_d
 
     def fileHTTPUpload(self, filepath, filename=None, upload_jid=None, options=None, profile=C.PROF_KEY_NONE):
         """upload a file through HTTP
@@ -136,29 +137,32 @@
         @param options(dict): options where key can be:
             - ignore_tls_errors(bool): if True, SSL certificate will not be checked
         @param profile: %(doc_profile)s
-        @return (D(unicode)): progress id
+        @return (D(tuple[D(unicode), D(unicode)])): progress id and Deferred which fire download URL
         """
         if options is None:
             options = {}
-        ignore_tls_errors = options.get('ignore-tls-errors', False)
+        ignore_tls_errors = options.get('ignore_tls_errors', False)
         client = self.host.getClient(profile)
         filename = filename or os.path.basename(filepath)
         size = os.path.getsize(filepath)
         progress_id_d = defer.Deferred()
+        download_d = defer.Deferred()
         d = self.getSlot(client, filename, size, upload_jid=upload_jid)
-        d.addCallbacks(self._getSlotCb, self._getSlotEb, (client, progress_id_d, filepath, size, ignore_tls_errors), None, (client, progress_id_d))
-        return progress_id_d
+        d.addCallbacks(self._getSlotCb, self._getSlotEb, (client, progress_id_d, download_d, filepath, size, ignore_tls_errors), None, (client, progress_id_d, download_d))
+        return progress_id_d, download_d
 
-    def _getSlotEb(self, fail, client, progress_id_d):
+    def _getSlotEb(self, fail, client, progress_id_d, download_d):
         """an error happened while trying to get slot"""
         log.warning(u"Can't get upload slot: {reason}".format(reason=fail.value))
         progress_id_d.errback(fail)
+        download_d.errback(fail)
 
-    def _getSlotCb(self, slot, client, progress_id_d, path, size, ignore_tls_errors=False):
+    def _getSlotCb(self, slot, client, progress_id_d, download_d, path, size, ignore_tls_errors=False):
         """Called when slot is received, try to do the upload
 
         @param slot(Slot): slot instance with the get and put urls
         @param progress_id_d(defer.Deferred): Deferred to call when progress_id is known
+        @param progress_id_d(defer.Deferred): Deferred to call with URL when upload is done
         @param path(str): path to the file to upload
         @param size(int): size of the file to upload
         @param ignore_tls_errors(bool): ignore TLS certificate is True
@@ -173,10 +177,10 @@
         else:
             agent = http_client.Agent(reactor)
         d = agent.request('PUT', slot.put.encode('utf-8'), http_headers.Headers({'User-Agent': [C.APP_NAME.encode('utf-8')]}), file_producer)
-        d.addCallbacks(self._uploadCb, self._uploadEb, (sat_file, slot), None, (sat_file,))
+        d.addCallbacks(self._uploadCb, self._uploadEb, (sat_file, slot, download_d), None, (sat_file, download_d))
         return d
 
-    def _uploadCb(self, dummy, sat_file, slot):
+    def _uploadCb(self, dummy, sat_file, slot, download_d):
         """Called once file is successfully uploaded
 
         @param sat_file(SatFile): file used for the upload
@@ -185,13 +189,15 @@
         """
         log.info(u"HTTP upload finished")
         sat_file.progressFinished({'url': slot.get})
+        download_d.callback(slot.get)
 
-    def _uploadEb(self, fail, sat_file):
+    def _uploadEb(self, fail, sat_file, download_d):
         """Called on unsuccessful upload
 
         @param sat_file(SatFile): file used for the upload
             should be closed, be is needed to send the progressError signal
         """
+        download_d.errback(fail)
         try:
             wrapped_fail = fail.value.reasons[0]
         except (AttributeError, IndexError):