diff --git a/libraries/networking/src/ResourceManager.cpp b/libraries/networking/src/ResourceManager.cpp index 7fdac3028a..00348df69b 100644 --- a/libraries/networking/src/ResourceManager.cpp +++ b/libraries/networking/src/ResourceManager.cpp @@ -12,7 +12,6 @@ #include #include -#include #include "AssetClient.h" #include "AssetRequest.h" @@ -31,24 +30,38 @@ ResourceRequest::ResourceRequest(QObject* parent, const QUrl& url) : _url(url) { } +HTTPResourceRequest::~HTTPResourceRequest() { + if (_reply) { + _reply->disconnect(this); + _reply->deleteLater(); + _reply = nullptr; + } +} + void HTTPResourceRequest::doSend() { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest networkRequest = QNetworkRequest(_url); networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); - if (!_cacheEnabled) { + if (_cacheEnabled) { + networkRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); + } else { networkRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); - } + } - QNetworkReply* reply = networkAccessManager.get(networkRequest); - QObject::connect(reply, &QNetworkReply::finished, [=]() { - if (_state != IN_PROGRESS) return; + _reply = networkAccessManager.get(networkRequest); + QObject::connect(_reply, &QNetworkReply::finished, [=]() { + Q_ASSERT(_state == IN_PROGRESS); + Q_ASSERT(_reply); _state = FINISHED; - auto error = reply->error(); + auto error = _reply->error(); qDebug() << "Loaded " << _url; + QString u = _url.path(); if (error == QNetworkReply::NoError) { - _data = reply->readAll(); + _data = _reply->readAll(); + qDebug() << "!!!! " << _data.size() << " " << _url.path(); + _loadedFromCache = _reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool(); _result = ResourceRequest::SUCCESS; emit finished(); } else if (error == QNetworkReply::TimeoutError) { @@ -58,7 +71,8 @@ void HTTPResourceRequest::doSend() { _result = ResourceRequest::ERROR; emit finished(); } - reply->deleteLater(); + _reply->deleteLater(); + _reply = nullptr; }); } @@ -105,16 +119,20 @@ void ATPResourceRequest::doSend() { const int TIMEOUT_MS = 2000; void ResourceRequest::send() { + Q_ASSERT(_state == UNSENT); + + _state = IN_PROGRESS; + doSend(); connect(&_sendTimer, &QTimer::timeout, this, &ResourceRequest::timeout); _sendTimer.setSingleShot(true); _sendTimer.start(TIMEOUT_MS); - _state = IN_PROGRESS; - doSend(); } void ResourceRequest::timeout() { + Q_ASSERT(_state != UNSENT); + // TIMEOUT!! - if (_state == UNSENT) { + if (_state == IN_PROGRESS) { qDebug() << "TImed out loading " << _url; _state = FINISHED; _result = TIMEOUT; diff --git a/libraries/networking/src/ResourceManager.h b/libraries/networking/src/ResourceManager.h index 4050b5f390..599399fb15 100644 --- a/libraries/networking/src/ResourceManager.h +++ b/libraries/networking/src/ResourceManager.h @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -41,6 +42,7 @@ public: State getState() const { return _state; } Result getResult() const { return _result; } QUrl getUrl() const { return _url; } + bool loadedFromCache() const { return _loadedFromCache; } void setCacheEnabled(bool value) { _cacheEnabled = value; } @@ -52,11 +54,12 @@ protected: virtual void doSend() = 0; QUrl _url; - State _state = UNSENT; + State _state { UNSENT }; Result _result; QTimer _sendTimer; QByteArray _data; bool _cacheEnabled { true }; + bool _loadedFromCache { false }; private slots: void timeout(); @@ -65,10 +68,15 @@ private slots: class HTTPResourceRequest : public ResourceRequest { Q_OBJECT public: + ~HTTPResourceRequest(); + HTTPResourceRequest(QObject* parent, const QUrl& url) : ResourceRequest(parent, url) { } protected: virtual void doSend() override; + +private: + QNetworkReply* _reply { nullptr }; }; class FileResourceRequest : public ResourceRequest {