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();
}
/*!
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
parameters. The query parameters are added to any potential query
@ -426,6 +452,7 @@ QNetworkRequest QNetworkRequestFactoryPrivate::newRequest(const QUrl &url) const
if (!bearerToken.isEmpty())
request.setRawHeader("Authorization"_ba, Bearer + bearerToken);
request.setTransferTimeout(transferTimeout);
return request;
}
@ -485,6 +512,7 @@ bool QNetworkRequestFactoryPrivate::equals(
const QNetworkRequestFactoryPrivate &other) const noexcept
{
return
transferTimeout == other.transferTimeout &&
#if QT_CONFIG(ssl)
sslConfig == other.sslConfig &&
#endif

View File

@ -12,6 +12,8 @@
#include <QtCore/qurlquery.h>
#include <QtCore/qurl.h>
#include <chrono>
QT_BEGIN_NAMESPACE
#if QT_CONFIG(ssl)
@ -56,6 +58,9 @@ public:
Q_NETWORK_EXPORT void setBearerToken(const QByteArray &token);
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 void setQueryParameters(const QUrlQuery &query);
Q_NETWORK_EXPORT void clearQueryParameters();

View File

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

View File

@ -542,6 +542,30 @@ void QRestAccessManager::abortRequests()
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
can be used for accessing less-frequently used features and configurations.

View File

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

View File

@ -10,6 +10,7 @@
#include <QtCore/qurl.h>
using namespace Qt::StringLiterals;
using namespace std::chrono_literals;
class tst_QNetworkRequestFactory : public QObject
{
@ -23,6 +24,7 @@ private Q_SLOTS:
void headers();
void bearerToken();
void operators();
void timeout();
private:
const QUrl url1{u"http://foo.io"_s};
@ -310,5 +312,21 @@ void tst_QNetworkRequestFactory::operators()
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)
#include "tst_qnetworkrequestfactory.moc"

View File

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

View File

@ -19,6 +19,7 @@
#include <QtCore/qstringconverter.h>
using namespace Qt::StringLiterals;
using namespace std::chrono_literals;
class tst_QRestAccessManager : public QObject
{
@ -40,6 +41,7 @@ private slots:
void text();
void download();
void upload();
void timeout();
private:
void memberHandler(QRestReply *reply);
@ -893,5 +895,19 @@ void tst_QRestAccessManager::upload()
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)
#include "tst_qrestaccessmanager.moc"