tcrash reporter: in Qt subclass, do network request using WaitingDialog - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 53893be4c9224b6914df40248c94d065c2512643 DIR parent 1d0f67996e7875091fec253ed68d240403a11a0d HTML Author: SomberNight <somber.night@protonmail.com> Date: Tue, 2 Jul 2019 19:27:36 +0200 crash reporter: in Qt subclass, do network request using WaitingDialog so it does not block the GUI Diffstat: M electrum/base_crash_reporter.py | 9 +++++---- M electrum/gui/kivy/uix/dialogs/cras… | 5 ++++- M electrum/gui/qt/exception_window.py | 30 ++++++++++++++++++------------ 3 files changed, 27 insertions(+), 17 deletions(-) --- DIR diff --git a/electrum/base_crash_reporter.py b/electrum/base_crash_reporter.py t@@ -31,10 +31,10 @@ from .version import ELECTRUM_VERSION from . import constants from .i18n import _ from .util import make_aiohttp_session -from .logging import describe_os_version +from .logging import describe_os_version, Logger -class BaseCrashReporter: +class BaseCrashReporter(Logger): report_server = "https://crashhub.electrum.org" config_key = "show_crash_reporter" issue_template = """<h2>Traceback</h2> t@@ -59,9 +59,10 @@ class BaseCrashReporter: ASK_CONFIRM_SEND = _("Do you want to send this report?") def __init__(self, exctype, value, tb): + Logger.__init__(self) self.exc_args = (exctype, value, tb) - def send_report(self, asyncio_loop, proxy, endpoint="/crash"): + def send_report(self, asyncio_loop, proxy, endpoint="/crash", *, timeout=None): if constants.net.GENESIS[-4:] not in ["4943", "e26f"] and ".electrum.org" in BaseCrashReporter.report_server: # Gah! Some kind of altcoin wants to send us crash reports. raise Exception(_("Missing report URL.")) t@@ -69,7 +70,7 @@ class BaseCrashReporter: report.update(self.get_additional_info()) report = json.dumps(report) coro = self.do_post(proxy, BaseCrashReporter.report_server + endpoint, data=report) - response = asyncio.run_coroutine_threadsafe(coro, asyncio_loop).result(5) + response = asyncio.run_coroutine_threadsafe(coro, asyncio_loop).result(timeout) return response async def do_post(self, proxy, url, data): DIR diff --git a/electrum/gui/kivy/uix/dialogs/crash_reporter.py b/electrum/gui/kivy/uix/dialogs/crash_reporter.py t@@ -119,8 +119,11 @@ class CrashReporter(BaseCrashReporter, Factory.Popup): try: loop = self.main_window.network.asyncio_loop proxy = self.main_window.network.proxy - response = json.loads(BaseCrashReporter.send_report(self, loop, proxy, "/crash.json")) + # FIXME network request in GUI thread... + response = json.loads(BaseCrashReporter.send_report(self, loop, proxy, + "/crash.json", timeout=10)) except (ValueError, ClientError): + #self.logger.debug("", exc_info=True) self.show_popup(_('Unable to send report'), _("Please check your network connection.")) else: self.show_popup(_('Report sent'), response["text"]) DIR diff --git a/electrum/gui/qt/exception_window.py b/electrum/gui/qt/exception_window.py t@@ -33,7 +33,7 @@ from PyQt5.QtWidgets import (QWidget, QLabel, QPushButton, QTextEdit, from electrum.i18n import _ from electrum.base_crash_reporter import BaseCrashReporter from electrum.logging import Logger -from .util import MessageBoxMixin, read_QIcon +from .util import MessageBoxMixin, read_QIcon, WaitingDialog class Exception_Window(BaseCrashReporter, QWidget, MessageBoxMixin, Logger): t@@ -96,17 +96,23 @@ class Exception_Window(BaseCrashReporter, QWidget, MessageBoxMixin, Logger): self.show() def send_report(self): - try: - proxy = self.main_window.network.proxy - response = BaseCrashReporter.send_report(self, self.main_window.network.asyncio_loop, proxy) - except BaseException as e: - self.logger.exception('There was a problem with the automatic reporting') - self.main_window.show_critical(_('There was a problem with the automatic reporting:') + '\n' + - str(e) + '\n' + - _("Please report this issue manually.")) - return - QMessageBox.about(self, _("Crash report"), response) - self.close() + def on_success(response): + self.show_message(parent=self, + title=_("Crash report"), + msg=response) + self.close() + def on_failure(exc_info): + e = exc_info[1] + self.logger.error('There was a problem with the automatic reporting', exc_info=exc_info) + self.show_critical(parent=self, + msg=(_('There was a problem with the automatic reporting:') + '\n' + + str(e) + '\n' + + _("Please report this issue manually."))) + + proxy = self.main_window.network.proxy + task = lambda: BaseCrashReporter.send_report(self, self.main_window.network.asyncio_loop, proxy) + msg = _('Sending crash report...') + WaitingDialog(self, msg, task, on_success, on_failure) def on_close(self): Exception_Window._active_window = None