From e1c6f2bf383876a31cd3e3f9e6edcaa19dc0a7dd Mon Sep 17 00:00:00 2001 From: Dan Leinir Turthra Jensen Date: Wed, 9 Feb 2022 16:17:58 +0000 Subject: [PATCH] Add conditional cache preference to http requests If we have a cache that's older than 7 days, assume that it's out of date and actually try again. If it's younger than that, assume that it's just the same, and prefer our cached version, if we have one. The logic here is an attempt at striking a balance between using our cache to its fullest potential (as in, reducing server-side load and network roundtrips in general) while also handling the situation where the information that we are fed about the cache is not entirely correct (such as the case where we're told there's no expiration date, but the data in fact does change). 7 days seems a sensible sort of deadline for that, though we could change that later if we need to. This was born out of a discussion on another kns review[1] Assume that no cache expiration time will be longer than 7 days, but otherwise prefer the cache This is mildly hacky, but if we don't do this, we end up with infinite cache expirations in some cases, which of course isn't really acceptable... See ed62ee20 for a situation where that happened. [1] https://invent.kde.org/frameworks/knewstuff/-/merge_requests/166#note_394067 --- src/core/jobs/httpworker.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/core/jobs/httpworker.cpp b/src/core/jobs/httpworker.cpp index b52161f6..208e1ef0 100644 --- a/src/core/jobs/httpworker.cpp +++ b/src/core/jobs/httpworker.cpp @@ -41,7 +41,6 @@ public: return nam.get(request); } -private: QNetworkDiskCache cache; }; @@ -101,6 +100,17 @@ static void addUserAgent(QNetworkRequest &request) agentHeader += QStringLiteral("-%1/%2").arg(QCoreApplication::instance()->applicationName(), QCoreApplication::instance()->applicationVersion()); } request.setHeader(QNetworkRequest::UserAgentHeader, agentHeader); + + // Assume that no cache expiration time will be longer than a week, but otherwise prefer the cache + // This is mildly hacky, but if we don't do this, we end up with infinite cache expirations in some + // cases, which of course isn't really acceptable... See ed62ee20 for a situation where that happened. + QNetworkCacheMetaData cacheMeta{s_httpWorkerNAM->cache.metaData(request.url())}; + if (cacheMeta.isValid()) { + const QDateTime nextWeek{QDateTime::currentDateTime().addDays(7)}; + if (cacheMeta.expirationDate().isValid() && cacheMeta.expirationDate() < nextWeek) { + request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); + } + } } void HTTPWorker::startRequest() -- GitLab