[httpupload] Better exception handling

This commit is contained in:
Philipp Hörist
2017-02-27 22:40:01 +01:00
parent 361ff561aa
commit 5b42455918

View File

@@ -20,6 +20,8 @@ import os
import sys import sys
import time import time
import threading import threading
import urllib
import ssl
from urllib.request import Request, urlopen from urllib.request import Request, urlopen
import mimetypes # better use the magic packet, but that's not a standard lib import mimetypes # better use the magic packet, but that's not a standard lib
import gtkgui_helpers import gtkgui_helpers
@@ -248,6 +250,7 @@ class Base(object):
self.conn.send(iq) self.conn.send(iq)
def received_slot(self, stanza, file): def received_slot(self, stanza, file):
log.info("Received slot")
if stanza.getType() == 'error': if stanza.getType() == 'error':
file.progress.close_dialog() file.progress.close_dialog()
ErrorDialog(_('Could not request upload slot'), ErrorDialog(_('Could not request upload slot'),
@@ -259,9 +262,9 @@ class Base(object):
try: try:
file.put = stanza.getTag("slot").getTag("put").getData() file.put = stanza.getTag("slot").getTag("put").getData()
file.get = stanza.getTag("slot").getTag("get").getData() file.get = stanza.getTag("slot").getTag("get").getData()
except Exception as exc: except Exception:
file.progress.close_dialog() file.progress.close_dialog()
log.error("Got unexpected stanza: ", stanza) log.error("Got unexpected stanza: %s", stanza)
log.exception('Error') log.exception('Error')
ErrorDialog(_('Could not request upload slot'), ErrorDialog(_('Could not request upload slot'),
_('Got unexpected response from server (see log)'), _('Got unexpected response from server (see log)'),
@@ -286,51 +289,58 @@ class Base(object):
thread.start() thread.start()
def upload_file(self, file): def upload_file(self, file):
GLib.idle_add(file.progress.label.set_text, GLib.idle_add(file.progress.label.set_text,
_('Uploading file via HTTP...')) _('Uploading file via HTTP...'))
try: try:
headers = {'User-Agent': 'Gajim %s' % gajim.version, headers = {'User-Agent': 'Gajim %s' % gajim.version,
'Content-Type': file.mime} 'Content-Type': file.mime}
request = Request(file.put, data=file.stream, headers=headers, method='PUT') request = Request(file.put, data=file.stream, headers=headers, method='PUT')
log.debug("opening urllib upload request...") log.debug("Opening Urllib upload request...")
if os.name == 'nt': if os.name == 'nt':
transfer = urlopen(request, cafile=certifi.where(), timeout=30) transfer = urlopen(request, cafile=certifi.where(), timeout=30)
else: else:
transfer = urlopen(request, timeout=30) transfer = urlopen(request, timeout=30)
file.stream.close() file.stream.close()
log.debug('urllib upload request done, response code: ', transfer.getcode()) log.debug('Urllib upload request done, response code: %s',
transfer.getcode())
GLib.idle_add(self.upload_complete, transfer.getcode(), file) GLib.idle_add(self.upload_complete, transfer.getcode(), file)
except: return
log.error("Exception during upload", exc_info=sys.exc_info()) except UploadAbortedException as exc:
GLib.idle_add(file.progress.close_dialog) log.info(exc)
GLib.idle_add(self.on_upload_error, file) error_msg = exc
except urllib.error.URLError as exc:
if isinstance(exc.reason, ssl.SSLError):
error_msg = exc.reason.reason
if error_msg == 'CERTIFICATE_VERIFY_FAILED':
log.exception('Certificate verify failed')
except Exception as exc:
log.exception("Exception during upload")
error_msg = exc
GLib.idle_add(file.progress.close_dialog)
GLib.idle_add(self.on_upload_error, file, error_msg)
def upload_complete(self, response_code, file): @staticmethod
if response_code == 0: def upload_complete(response_code, file):
return # Upload was aborted file.progress.close_dialog()
if 200 <= response_code < 300: if 200 <= response_code < 300:
log.info("Upload completed successfully") log.info("Upload completed successfully")
file.progress.close_dialog()
message = file.get message = file.get
if file.encrypted: if file.encrypted:
message += '#' + binascii.hexlify(file.iv + file.key) message += '#' + binascii.hexlify(file.iv + file.key)
file.control.send_message(message=message) file.control.send_message(message=message)
file.control.msg_textview.grab_focus() file.control.msg_textview.grab_focus()
else: else:
file.progress.close_dialog() log.error('Got unexpected http upload response code: %s',
log.error('Got unexpected http upload response code: ',
response_code) response_code)
ErrorDialog( ErrorDialog(
_('Could not upload file'), _('Could not upload file'),
_('HTTP response code from server: %s') % response_code, _('HTTP response code from server: %s') % response_code,
transient_for=file.control.parent_win.window) transient_for=file.control.parent_win.window)
def on_upload_error(self, file): @staticmethod
def on_upload_error(file, reason):
file.progress.close_dialog() file.progress.close_dialog()
ErrorDialog(_('Could not upload file'), ErrorDialog(_('Error'), str(reason),
_('Got unexpected exception while uploading file'
' (see log)'),
transient_for=file.control.parent_win.window) transient_for=file.control.parent_win.window)