diff --git a/libraries/networking/src/FileResourceRequest.cpp b/libraries/networking/src/FileResourceRequest.cpp index f9ec7797be..ebeb5936c2 100644 --- a/libraries/networking/src/FileResourceRequest.cpp +++ b/libraries/networking/src/FileResourceRequest.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -54,6 +55,7 @@ void FileResourceRequest::doSend() { } else { QFile file(filename); if (file.exists()) { + setProperty("last-modified", toHttpDateString(QFileInfo(file).lastModified().toMSecsSinceEpoch())); if (file.open(QFile::ReadOnly)) { if (file.size() < _byteRange.fromInclusive || file.size() < _byteRange.toExclusive) { diff --git a/libraries/networking/src/ResourceRequest.cpp b/libraries/networking/src/ResourceRequest.cpp index c63bd4c563..8739cb61da 100644 --- a/libraries/networking/src/ResourceRequest.cpp +++ b/libraries/networking/src/ResourceRequest.cpp @@ -15,8 +15,14 @@ #include #include +#include #include +QString ResourceRequest::toHttpDateString(uint64_t msecsSinceEpoch) { + return QDateTime::fromMSecsSinceEpoch(msecsSinceEpoch) + .toString("ddd, dd MMM yyyy hh:mm:ss 'GMT'") + .toLatin1(); +} void ResourceRequest::send() { if (QThread::currentThread() != thread()) { diff --git a/libraries/networking/src/ResourceRequest.h b/libraries/networking/src/ResourceRequest.h index 550294d79b..042e706291 100644 --- a/libraries/networking/src/ResourceRequest.h +++ b/libraries/networking/src/ResourceRequest.h @@ -90,6 +90,7 @@ public: void setCacheEnabled(bool value) { _cacheEnabled = value; } void setByteRange(ByteRange byteRange) { _byteRange = byteRange; } + static QString toHttpDateString(uint64_t msecsSinceEpoch); public slots: void send(); diff --git a/libraries/script-engine/src/ScriptCache.cpp b/libraries/script-engine/src/ScriptCache.cpp index b23aa48762..0b63803a33 100644 --- a/libraries/script-engine/src/ScriptCache.cpp +++ b/libraries/script-engine/src/ScriptCache.cpp @@ -85,11 +85,25 @@ void ScriptCache::getScriptContents(const QString& scriptOrURL, contentAvailable Lock lock(_containerLock); if (_scriptCache.contains(url) && !forceDownload) { - auto scriptContent = _scriptCache[url]; - lock.unlock(); - qCDebug(scriptengine) << "Found script in cache:" << url.fileName(); - contentAvailable(url.toString(), scriptContent, true, true, STATUS_CACHED); - } else { + auto entry = _scriptCache[url]; + if (url.isLocalFile() || url.scheme().isEmpty()) { + auto modifiedTime = QFileInfo(url.toLocalFile()).lastModified(); + QString localTime = ResourceRequest::toHttpDateString(modifiedTime.toMSecsSinceEpoch()); + QString cachedTime = entry["last-modified"].toString(); + if (cachedTime != localTime) { + forceDownload = true; + qCDebug(scriptengine) << "Found script in cache, but local file modified; reloading:" << url.fileName() + << "(memory:" << cachedTime << "disk:" << localTime << ")"; + } + } + if (!forceDownload) { + lock.unlock(); + qCDebug(scriptengine) << "Found script in cache:" << url.fileName(); + contentAvailable(url.toString(), entry["data"].toString(), true, true, STATUS_CACHED); + return; + } + } + { auto& scriptRequest = _activeScriptRequests[url]; bool alreadyWaiting = scriptRequest.scriptUsers.size() > 0; scriptRequest.scriptUsers.push_back(contentAvailable); @@ -140,7 +154,10 @@ void ScriptCache::scriptContentAvailable(int maxRetries) { _activeScriptRequests.remove(url); - _scriptCache[url] = scriptContent = req->getData(); + _scriptCache[url] = { + { "data", scriptContent = req->getData() }, + { "last-modified", req->property("last-modified") }, + }; } else { auto result = req->getResult(); bool irrecoverable = @@ -177,7 +194,7 @@ void ScriptCache::scriptContentAvailable(int maxRetries) { allCallbacks = scriptRequest.scriptUsers; if (_scriptCache.contains(url)) { - scriptContent = _scriptCache[url]; + scriptContent = _scriptCache[url]["data"].toString(); } _activeScriptRequests.remove(url); qCWarning(scriptengine) << "Error loading script from URL (" << status <<")"; diff --git a/libraries/script-engine/src/ScriptCache.h b/libraries/script-engine/src/ScriptCache.h index 511d392409..4ab4458ee9 100644 --- a/libraries/script-engine/src/ScriptCache.h +++ b/libraries/script-engine/src/ScriptCache.h @@ -60,7 +60,7 @@ private: Mutex _containerLock; QMap _activeScriptRequests; - QHash _scriptCache; + QHash _scriptCache; QMultiMap _scriptUsers; };