Mercurial > libervia-backend
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):