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)
: 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));
}
@ -117,7 +122,15 @@ QNetworkReply* NetworkAccessManager::createRequest(
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)

View File

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