[httpupload] Better exception handling
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user