6 #include <QAbstractSocket>
8 #include <QHostAddress>
11 #include <QNetworkInterface>
12 #include <QNetworkReply>
14 #include <QRegularExpression>
15 #include <QSignalMapper>
16 #include <QStringBuilder>
27 using namespace swift::config;
29 using namespace swift::misc::network;
31 namespace swift::misc::network
33 int CNetworkUtils::getTimeoutMs() {
return 5000; }
35 int CNetworkUtils::getLongTimeoutMs() {
return 3 * getTimeoutMs(); }
43 if (address.isNull()) {
continue; }
46 const QString a = address.toString();
54 bool CNetworkUtils::canConnect(
const QString &hostAddress,
int port,
QString &message,
int timeoutMs)
56 if (timeoutMs < 0) { timeoutMs = getTimeoutMs(); }
65 socket.
connectToHost(hostAddress,
static_cast<quint16
>(port));
66 const bool timedOut = !eventLoop.
exec(timeoutMs);
70 static const QString e(
"Connection failed: '%1'");
76 static const QString ok(
"OK, connected");
84 return CNetworkUtils::canConnect(server.
getAddress(), server.
getPort(), message, timeoutMs);
87 bool CNetworkUtils::canConnect(
const QString &url,
QString &message,
int timeoutMs)
94 return canConnect(
QUrl(url), message, timeoutMs);
97 bool CNetworkUtils::canConnect(
const QUrl &url,
QString &message,
int timeoutMs)
114 if (p < 0) { p = scheme.
contains(
"https") ? 443 : 80; }
115 return canConnect(host, p, message, timeoutMs);
118 bool CNetworkUtils::canConnect(
const QUrl &url,
int timeoutMs)
121 return canConnect(url, m, timeoutMs);
124 bool CNetworkUtils::isValidIPv4Address(
const QString &candidate)
130 bool CNetworkUtils::isValidIPv6Address(
const QString &candidate)
136 bool CNetworkUtils::isValidPort(
const QString &port)
139 int p = port.
toInt(&success);
140 if (!success)
return false;
141 return (p >= 1 && p <= 65535);
147 Q_ASSERT_X(protocol.
length() > 3, Q_FUNC_INFO,
"worng protocol");
148 Q_ASSERT_X(!server.
isEmpty(), Q_FUNC_INFO,
"missing server");
149 Q_ASSERT_X(!serviceUrl.
isEmpty(), Q_FUNC_INFO,
"missing service URL");
155 return protocol +
"://" + url;
164 userAgentDetails.
isEmpty() ? defaultUserAgent : defaultUserAgent +
"/" + userAgentDetails);
171 const QString &userAgentDetails)
181 CNetworkUtils::setSwiftUserAgent(request, userAgentDetails);
186 const QString &userAgentDetails)
189 CNetworkUtils::setSwiftUserAgent(req, userAgentDetails);
193 qint64 CNetworkUtils::lastModifiedMsSinceEpoch(
const QNetworkReply *nwReply)
196 const QDateTime lm = CNetworkUtils::lastModifiedDateTime(nwReply);
213 const qint64 sinceEpoch = CNetworkUtils::lastModifiedMsSinceEpoch(nwReply);
220 if (!nwReply) {
return -1; }
225 const qint64 start = started.
value<qint64>();
226 return (now - start);
233 if (!nwReply) {
return -1; }
235 if (!statusCode.
isValid()) {
return -1; }
236 const int status = statusCode.
toInt();
242 if (!nwReply) {
return false; }
243 const int code = CNetworkUtils::getHttpStatusCode(nwReply);
244 return code == 301 || code == 302 || code == 303 || code == 307;
249 if (!nwReply) {
return QUrl(); }
251 if (!possibleRedirectUrl.
isValid()) {
return QUrl(); }
252 QUrl redirectUrl = possibleRedirectUrl.
toUrl();
257 QString CNetworkUtils::removeHtmlPartsFromPhpErrorMessage(
const QString &errorMessage)
259 if (errorMessage.
isEmpty()) {
return errorMessage; }
260 QString phpError(errorMessage);
262 return phpError.
remove(regEx);
265 bool CNetworkUtils::looksLikePhpErrorMessage(
const QString &errorMessage)
267 if (errorMessage.
length() < 50) {
return false; }
274 static const QString h(
"HEAD");
276 static const QString put(
"PUT");
277 static const QString d(
"DELETE");
278 static const QString post(
"POST");
279 static const QString c(
"custom");
280 static const QString u(
"unknown");
static const QString & getVersionString()
Version as QVersionNumber.
Utility class which blocks until a signal is emitted or timeout reached.
bool exec(int timeoutMs)
Begin processing events until the timeout or stop condition occurs.
void stopWhen(const T *sender, F signal)
Event loop will stop if the given signal is received.
Value object encapsulating information of a server.
int getPort() const
Get port.
const QString & getAddress() const
Get address.
Free functions in swift::misc.
void connectToHost(const QHostAddress &address, quint16 port, QIODeviceBase::OpenMode openMode)
void errorOccurred(QAbstractSocket::SocketError socketError)
QAbstractSocket::SocketState state() const const
qint64 currentMSecsSinceEpoch()
bool isValid() const const
qint64 toMSecsSinceEpoch() const const
int protocol() const const
QString errorString() const const
void append(QList< T > &&value)
QList< QHostAddress > allAddresses()
QVariant attribute(QNetworkRequest::Attribute code) const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QVariant property(const char *name) const const
QString tr(const char *sourceText, const char *disambiguation, int n)
void setMapping(QObject *sender, QObject *object)
QString & append(QChar ch)
QString arg(Args &&... args) const const
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
qsizetype length() const const
QString & remove(QChar ch, Qt::CaseSensitivity cs)
QString & replace(QChar before, QChar after, Qt::CaseSensitivity cs)
int toInt(bool *ok, int base) const const
QString toLower() const const
void sort(Qt::CaseSensitivity cs)
QString host(QUrl::ComponentFormattingOptions options) const const
bool isRelative() const const
bool isValid() const const
int port(int defaultPort) const const
QUrl resolved(const QUrl &relative) const const
QString scheme() const const
QString toString(QUrl::FormattingOptions options) const const
void addQueryItem(const QString &key, const QString &value)
bool canConvert() const const
QVariant fromValue(T &&value)
bool isValid() const const
int toInt(bool *ok) const const