Add a timeout option to NetworkAccessManager.

In most cases, timeouts can be applied to a reply after a request has been made.
But some APIs, such as libmygpo-qt, don't always provide access to the reply or
provide abort methods. For these cases, add an optional timeout to
NetworkAccessManager. If set, create a NetworkTimeouts instance in createRequest
and add the reply. Use the reply as the parent so that it is destroyed when the
reply is destroyed.
This commit is contained in:
Jim Broadus 2019-12-25 22:59:57 -08:00
parent 82b185c087
commit 77d5d8bdea
2 changed files with 17 additions and 2 deletions

View File

@ -84,7 +84,12 @@ void ThreadSafeNetworkDiskCache::clear() {
} }
NetworkAccessManager::NetworkAccessManager(QObject* parent) NetworkAccessManager::NetworkAccessManager(QObject* parent)
: QNetworkAccessManager(parent) { : QNetworkAccessManager(parent), timeout_msec_(0) {
setCache(new ThreadSafeNetworkDiskCache(this));
}
NetworkAccessManager::NetworkAccessManager(int timeout, QObject* parent)
: QNetworkAccessManager(parent), timeout_msec_(timeout) {
setCache(new ThreadSafeNetworkDiskCache(this)); setCache(new ThreadSafeNetworkDiskCache(this));
} }
@ -117,7 +122,15 @@ QNetworkReply* NetworkAccessManager::createRequest(
QNetworkRequest::PreferCache); QNetworkRequest::PreferCache);
} }
return QNetworkAccessManager::createRequest(op, new_request, outgoingData); QNetworkReply* reply =
QNetworkAccessManager::createRequest(op, new_request, outgoingData);
if (timeout_msec_ > 0) {
// Since the parent is the reply, this object will be destroyed when the
// reply is destroyed.
NetworkTimeouts* timeout = new NetworkTimeouts(timeout_msec_, reply);
timeout->AddReply(reply);
}
return reply;
} }
NetworkTimeouts::NetworkTimeouts(int timeout_msec, QObject* parent) NetworkTimeouts::NetworkTimeouts(int timeout_msec, QObject* parent)

View File

@ -51,10 +51,12 @@ class NetworkAccessManager : public QNetworkAccessManager {
public: public:
explicit NetworkAccessManager(QObject* parent = nullptr); explicit NetworkAccessManager(QObject* parent = nullptr);
explicit NetworkAccessManager(int timeout, QObject* parent = nullptr);
protected: protected:
QNetworkReply* createRequest(Operation op, const QNetworkRequest& request, QNetworkReply* createRequest(Operation op, const QNetworkRequest& request,
QIODevice* outgoingData); QIODevice* outgoingData);
int timeout_msec_;
}; };
class RedirectFollower : public QObject { class RedirectFollower : public QObject {