From d46257f670320a0e6737956148396163e95def98 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 28 Apr 2017 02:24:29 +0200 Subject: [PATCH] Ref T42, util function to create network report --- src/blackmisc/network/networkutils.cpp | 55 +++++++++++++++++++++++++- src/blackmisc/network/networkutils.h | 14 ++++++- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/blackmisc/network/networkutils.cpp b/src/blackmisc/network/networkutils.cpp index 9ae87bec3..0ed306c28 100644 --- a/src/blackmisc/network/networkutils.cpp +++ b/src/blackmisc/network/networkutils.cpp @@ -7,12 +7,14 @@ * contained in the LICENSE file. */ -#include "blackmisc/eventloop.h" #include "blackmisc/network/networkutils.h" #include "blackmisc/network/server.h" +#include "blackmisc/eventloop.h" +#include "blackmisc/stringutils.h" #include "blackconfig/buildconfig.h" #include #include +#include #include #include #include @@ -21,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +53,11 @@ namespace BlackMisc return 3000; } + int CNetworkUtils::getLongTimeoutMs() + { + return 3 * getTimeoutMs(); + } + bool CNetworkUtils::canPing(const QString &hostAddress) { if (hostAddress.isEmpty()) { return false; } @@ -341,5 +349,50 @@ namespace BlackMisc static const QRegularExpression regEx("<[^>]*>"); return phpError.remove(regEx); } + + CStatusMessageList CNetworkUtils::createNetworkReport(const QNetworkAccessManager *am) + { + return CNetworkUtils::createNetworkReport(CUrl(), am); + } + + CStatusMessageList CNetworkUtils::createNetworkReport(const CUrl &url, const QNetworkAccessManager *am) + { + static const CLogCategoryList cats({CLogCategory::network()}); + CStatusMessageList msgs; + + if (!url.isEmpty()) + { + const QString host = url.getHost(); + const bool canPing = CNetworkUtils::canPing(host); + const CStatusMessage ping(cats, canPing ? CStatusMessage::SeverityInfo : CStatusMessage::SeverityError, "Host: " + host + " ping: " + boolToYesNo(canPing)); + msgs.push_back(ping); + + QString msg; + const bool canConnect = CNetworkUtils::canConnect(url, msg, getTimeoutMs() * 2); + if (canConnect) + { + msgs.push_back(CStatusMessage(cats, CStatusMessage::SeverityInfo, "Can connect to " + url.getFullUrl())); + } + else + { + msgs.push_back(CStatusMessage(cats, CStatusMessage::SeverityError, "Cannot connect to " + url.getFullUrl() + " msg: " + msg)); + } + } + + if (am) + { + const bool accessible = am->networkAccessible() == QNetworkAccessManager::Accessible; + const QNetworkConfiguration c = am->configuration(); + static const QMetaEnum enumAccessible = QMetaEnum::fromType(); + + const QString msg = QString("Accessible: %1 (%2) bearer: %3 %4").arg( + boolToYesNo(accessible), + enumAccessible.valueToKey(am->networkAccessible()), + c.bearerTypeName(), c.identifier()); + msgs.push_back(CStatusMessage(cats, accessible ? CStatusMessage::SeverityInfo : CStatusMessage::SeverityError, msg)); + } + + return msgs; + } } // namespace } // namespace diff --git a/src/blackmisc/network/networkutils.h b/src/blackmisc/network/networkutils.h index d5469e9ec..0a76a3135 100644 --- a/src/blackmisc/network/networkutils.h +++ b/src/blackmisc/network/networkutils.h @@ -12,10 +12,12 @@ #ifndef BLACKMISC_NETWORKUTILS_H #define BLACKMISC_NETWORKUTILS_H -#include "blackmisc/blackmiscexport.h" #include "blackmisc/network/urllist.h" +#include "blackmisc/blackmiscexport.h" +#include "blackmisc/statusmessagelist.h" #include +#include #include #include #include @@ -46,6 +48,9 @@ namespace BlackMisc //! Default for timeout static int getTimeoutMs(); + //! Default for timeout (long) + static int getLongTimeoutMs(); + //! Can ping the address? //! \note uses OS ping static bool canPing(const QString &hostAddress); @@ -137,6 +142,13 @@ namespace BlackMisc //! Remove the HTML formatting from a PHP error message static QString removeHtmlPartsFromPhpErrorMessage(const QString &errorMessage); + //! Status about network + static BlackMisc::CStatusMessageList createNetworkReport(const QNetworkAccessManager *am); + + //! Status about network, can be used when an URL fails to resolve issues + //! \remark that can take a moment to complete, as it checks network + static BlackMisc::CStatusMessageList createNetworkReport(const CUrl &url, const QNetworkAccessManager *am = nullptr); + private: //! Hidden constructor CNetworkUtils() {}