From 35e4b35d125983051a25173d595119d99b7bda3a Mon Sep 17 00:00:00 2001 From: Hanabishi <13597663+HanabishiRecca@users.noreply.github.com> Date: Tue, 24 Oct 2023 15:32:21 +0500 Subject: [PATCH] Make WebUI error non-fatal * Do not exit the app when WebUI is failed for start. * Print the error to stdout. PR #19697. Closes #19695. Closes #19469. --- src/app/application.cpp | 12 ++++++++---- src/webui/webui.cpp | 14 ++++++++++---- src/webui/webui.h | 4 +++- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/app/application.cpp b/src/app/application.cpp index d8b8a5ac4..bea89337e 100644 --- a/src/app/application.cpp +++ b/src/app/application.cpp @@ -890,13 +890,17 @@ int Application::exec() #ifndef DISABLE_WEBUI m_webui = new WebUI(this); #ifdef DISABLE_GUI - if (m_webui->isErrored()) - QCoreApplication::exit(EXIT_FAILURE); - connect(m_webui, &WebUI::fatalError, this, []() { QCoreApplication::exit(EXIT_FAILURE); }); + connect(m_webui, &WebUI::error, this, [](const QString &message) { fprintf(stderr, "%s\n", qUtf8Printable(message)); }); printf("%s", qUtf8Printable(u"\n******** %1 ********\n"_s.arg(tr("Information")))); - if (m_webui->isEnabled()) + if (m_webui->isErrored()) + { + const QString error = m_webui->errorMessage() + u'\n' + + tr("To fix the error, you may need to edit the config file manually."); + fprintf(stderr, "%s\n", qUtf8Printable(error)); + } + else if (m_webui->isEnabled()) { const QHostAddress address = m_webui->hostAddress(); const QString url = u"%1://%2:%3"_s.arg((m_webui->isHttps() ? u"https"_s : u"http"_s) diff --git a/src/webui/webui.cpp b/src/webui/webui.cpp index c4a707e10..c9e112759 100644 --- a/src/webui/webui.cpp +++ b/src/webui/webui.cpp @@ -48,6 +48,7 @@ WebUI::WebUI(IApplication *app) void WebUI::configure() { m_isErrored = false; // clear previous error state + m_errorMsg.clear(); const QString portForwardingProfile = u"webui"_s; const Preferences *pref = Preferences::instance(); @@ -113,13 +114,13 @@ void WebUI::configure() } else { - const QString errorMsg = tr("Web UI: Unable to bind to IP: %1, port: %2. Reason: %3") + m_errorMsg = tr("Web UI: Unable to bind to IP: %1, port: %2. Reason: %3") .arg(serverAddressString).arg(port).arg(m_httpServer->errorString()); - LogMsg(errorMsg, Log::CRITICAL); - qCritical() << errorMsg; + LogMsg(m_errorMsg, Log::CRITICAL); + qCritical() << m_errorMsg; m_isErrored = true; - emit fatalError(); + emit error(m_errorMsg); } } @@ -156,6 +157,11 @@ bool WebUI::isErrored() const return m_isErrored; } +QString WebUI::errorMessage() const +{ + return m_errorMsg; +} + bool WebUI::isHttps() const { if (!m_httpServer) return false; diff --git a/src/webui/webui.h b/src/webui/webui.h index 107bb2e62..026ec5952 100644 --- a/src/webui/webui.h +++ b/src/webui/webui.h @@ -56,12 +56,13 @@ public: bool isEnabled() const; bool isErrored() const; + QString errorMessage() const; bool isHttps() const; QHostAddress hostAddress() const; quint16 port() const; signals: - void fatalError(); + void error(const QString &message); private slots: void configure(); @@ -69,6 +70,7 @@ private slots: private: bool m_isEnabled = false; bool m_isErrored = false; + QString m_errorMsg; QPointer m_httpServer; QPointer m_dnsUpdater; QPointer m_webapp;