Functions for setting request transfer timeouts

Added to both QNetworkRequestFactory and QRestAccessManager

Task-number: QTBUG-114717
Change-Id: Ibca55bba548a034a0da7ea60550642c150b63dc2
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
Juha Vuolle 2023-08-08 11:51:36 +03:00
parent 090991123d
commit 669a48e5ae
8 changed files with 98 additions and 0 deletions

View File

@ -349,6 +349,32 @@ void QNetworkRequestFactory::clearBearerToken()
d->bearerToken.clear(); d->bearerToken.clear();
} }
/*!
Sets \a timeout used for transfers.
\sa transferTimeout(), QNetworkRequest::setTransferTimeout(),
QRestAccessManager::setTransferTimeout()
*/
void QNetworkRequestFactory::setTransferTimeout(std::chrono::milliseconds timeout)
{
if (d->transferTimeout == timeout)
return;
d.detach();
d->transferTimeout = timeout;
}
/*!
Returns the timeout used for transfers.
\sa setTransferTimeout(), QNetworkRequest::transferTimeout(),
QRestAccessManager::transferTimeout()
*/
std::chrono::milliseconds QNetworkRequestFactory::transferTimeout() const
{
return d->transferTimeout;
}
/*! /*!
Returns query parameters that are added to individual requests' query Returns query parameters that are added to individual requests' query
parameters. The query parameters are added to any potential query parameters. The query parameters are added to any potential query
@ -426,6 +452,7 @@ QNetworkRequest QNetworkRequestFactoryPrivate::newRequest(const QUrl &url) const
if (!bearerToken.isEmpty()) if (!bearerToken.isEmpty())
request.setRawHeader("Authorization"_ba, Bearer + bearerToken); request.setRawHeader("Authorization"_ba, Bearer + bearerToken);
request.setTransferTimeout(transferTimeout);
return request; return request;
} }
@ -485,6 +512,7 @@ bool QNetworkRequestFactoryPrivate::equals(
const QNetworkRequestFactoryPrivate &other) const noexcept const QNetworkRequestFactoryPrivate &other) const noexcept
{ {
return return
transferTimeout == other.transferTimeout &&
#if QT_CONFIG(ssl) #if QT_CONFIG(ssl)
sslConfig == other.sslConfig && sslConfig == other.sslConfig &&
#endif #endif

View File

@ -12,6 +12,8 @@
#include <QtCore/qurlquery.h> #include <QtCore/qurlquery.h>
#include <QtCore/qurl.h> #include <QtCore/qurl.h>
#include <chrono>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
#if QT_CONFIG(ssl) #if QT_CONFIG(ssl)
@ -56,6 +58,9 @@ public:
Q_NETWORK_EXPORT void setBearerToken(const QByteArray &token); Q_NETWORK_EXPORT void setBearerToken(const QByteArray &token);
Q_NETWORK_EXPORT void clearBearerToken(); Q_NETWORK_EXPORT void clearBearerToken();
Q_NETWORK_EXPORT void setTransferTimeout(std::chrono::milliseconds timeout);
Q_NETWORK_EXPORT std::chrono::milliseconds transferTimeout() const;
Q_NETWORK_EXPORT QUrlQuery queryParameters() const; Q_NETWORK_EXPORT QUrlQuery queryParameters() const;
Q_NETWORK_EXPORT void setQueryParameters(const QUrlQuery &query); Q_NETWORK_EXPORT void setQueryParameters(const QUrlQuery &query);
Q_NETWORK_EXPORT void clearQueryParameters(); Q_NETWORK_EXPORT void clearQueryParameters();

View File

@ -43,6 +43,7 @@ public:
QHttpHeaders headers; QHttpHeaders headers;
QByteArray bearerToken; QByteArray bearerToken;
QUrlQuery queryParameters; QUrlQuery queryParameters;
std::chrono::milliseconds transferTimeout{0};
}; };
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -542,6 +542,30 @@ void QRestAccessManager::abortRequests()
req->abort(); req->abort();
} }
/*!
Sets \a timeout used for transfers.
\sa QNetworkAccessManager::setTransferTimeout(), transferTimeout(),
QNetworkRequestFactory::setTransferTimeout()
*/
void QRestAccessManager::setTransferTimeout(std::chrono::milliseconds timeout)
{
Q_D(QRestAccessManager);
d->qnam->setTransferTimeout(timeout);
}
/*!
Returns the timeout used for transfers.
\sa setTransferTimeout(), QNetworkAccessManager::transferTimeoutAsDuration(),
QNetworkRequestFactory::transferTimeout()
*/
std::chrono::milliseconds QRestAccessManager::transferTimeout() const
{
Q_D(const QRestAccessManager);
return d->qnam->transferTimeoutAsDuration();
}
/*! /*!
Returns the underlying QNetworkAccessManager instance. The instance Returns the underlying QNetworkAccessManager instance. The instance
can be used for accessing less-frequently used features and configurations. can be used for accessing less-frequently used features and configurations.

View File

@ -6,6 +6,8 @@
#include <QtNetwork/qnetworkaccessmanager.h> #include <QtNetwork/qnetworkaccessmanager.h>
#include <chrono>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QRestReply; class QRestReply;
@ -69,6 +71,9 @@ public:
bool deletesRepliesOnFinished() const; bool deletesRepliesOnFinished() const;
void setDeletesRepliesOnFinished(bool autoDelete); void setDeletesRepliesOnFinished(bool autoDelete);
void setTransferTimeout(std::chrono::milliseconds timeout);
std::chrono::milliseconds transferTimeout() const;
void abortRequests(); void abortRequests();
QREST_METHOD_NO_DATA(deleteResource) QREST_METHOD_NO_DATA(deleteResource)

View File

@ -10,6 +10,7 @@
#include <QtCore/qurl.h> #include <QtCore/qurl.h>
using namespace Qt::StringLiterals; using namespace Qt::StringLiterals;
using namespace std::chrono_literals;
class tst_QNetworkRequestFactory : public QObject class tst_QNetworkRequestFactory : public QObject
{ {
@ -23,6 +24,7 @@ private Q_SLOTS:
void headers(); void headers();
void bearerToken(); void bearerToken();
void operators(); void operators();
void timeout();
private: private:
const QUrl url1{u"http://foo.io"_s}; const QUrl url1{u"http://foo.io"_s};
@ -310,5 +312,21 @@ void tst_QNetworkRequestFactory::operators()
QCOMPARE(factory5.baseUrl(), url1); QCOMPARE(factory5.baseUrl(), url1);
} }
void tst_QNetworkRequestFactory::timeout()
{
constexpr auto defaultTimeout = 0ms;
constexpr auto timeout = 150ms;
QNetworkRequestFactory factory;
QNetworkRequest request = factory.request();
QCOMPARE(factory.transferTimeout(), defaultTimeout);
QCOMPARE(request.transferTimeoutAsDuration(), defaultTimeout);
factory.setTransferTimeout(timeout);
request = factory.request();
QCOMPARE(factory.transferTimeout(), timeout);
QCOMPARE(request.transferTimeoutAsDuration(), timeout);
}
QTEST_MAIN(tst_QNetworkRequestFactory) QTEST_MAIN(tst_QNetworkRequestFactory)
#include "tst_qnetworkrequestfactory.moc" #include "tst_qnetworkrequestfactory.moc"

View File

@ -6,6 +6,7 @@
#include <QtNetwork/qtcpsocket.h> #include <QtNetwork/qtcpsocket.h>
#include <QtCore/qcoreapplication.h> #include <QtCore/qcoreapplication.h>
#include <private/qlocale_p.h> #include <private/qlocale_p.h>
using namespace Qt::StringLiterals; using namespace Qt::StringLiterals;

View File

@ -19,6 +19,7 @@
#include <QtCore/qstringconverter.h> #include <QtCore/qstringconverter.h>
using namespace Qt::StringLiterals; using namespace Qt::StringLiterals;
using namespace std::chrono_literals;
class tst_QRestAccessManager : public QObject class tst_QRestAccessManager : public QObject
{ {
@ -40,6 +41,7 @@ private slots:
void text(); void text();
void download(); void download();
void upload(); void upload();
void timeout();
private: private:
void memberHandler(QRestReply *reply); void memberHandler(QRestReply *reply);
@ -893,5 +895,19 @@ void tst_QRestAccessManager::upload()
QCOMPARE(last.at(0).toLongLong(), expectedData.size()); QCOMPARE(last.at(0).toLongLong(), expectedData.size());
} }
void tst_QRestAccessManager::timeout()
{
constexpr auto defaultTimeout = 0ms;
constexpr auto timeout = 150ms;
QRestAccessManager manager;
QCOMPARE(manager.transferTimeout(), defaultTimeout);
QCOMPARE(manager.networkAccessManager()->transferTimeoutAsDuration(), defaultTimeout);
manager.setTransferTimeout(timeout);
QCOMPARE(manager.transferTimeout(), timeout);
QCOMPARE(manager.networkAccessManager()->transferTimeoutAsDuration(), timeout);
}
QTEST_MAIN(tst_QRestAccessManager) QTEST_MAIN(tst_QRestAccessManager)
#include "tst_qrestaccessmanager.moc" #include "tst_qrestaccessmanager.moc"