1 #include "jsnamfactory.h"
3 JSDiskCache::JSDiskCache(QObject *parent) : QNetworkDiskCache(parent) {}
5 void JSDiskCache::updateMetaData(const QNetworkCacheMetaData &meta) {
6 auto meta2 = fixMetadata(meta);
7 QNetworkDiskCache::updateMetaData(meta2);
10 QIODevice *JSDiskCache::prepare(const QNetworkCacheMetaData &meta) {
11 auto meta2 = fixMetadata(meta);
12 return QNetworkDiskCache::prepare(meta2);
15 QNetworkCacheMetaData JSDiskCache::fixMetadata(const QNetworkCacheMetaData &meta) {
16 QNetworkCacheMetaData meta2 = meta;
18 auto now = QDateTime::currentDateTimeUtc();
19 if (meta2.expirationDate() < now) {
20 meta2.setExpirationDate(now.addSecs(3600));
23 // Remove caching headers
24 auto headers = meta2.rawHeaders();
25 for (auto i = headers.begin(); i != headers.end(); ++i) {
26 // qDebug() << i->first << i->second;
27 static const QVector<QByteArray> headersToRemove{"Cache-Control", "Expires", "Pragma"};
28 if (headersToRemove.contains(i->first)) {
29 qDebug() << "Removing" << i->first << i->second;
33 meta2.setRawHeaders(headers);
38 JSNAM::JSNAM(QObject *parent, const JSNAMFactory &factory)
39 : QNetworkAccessManager(parent), factory(factory) {
40 auto cache = new JSDiskCache(this);
41 cache->setCacheDirectory(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) +
44 setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy);
45 #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
46 setTransferTimeout(10000);
50 QNetworkReply *JSNAM::createRequest(QNetworkAccessManager::Operation op,
51 const QNetworkRequest &request,
52 QIODevice *outgoingData) {
54 req2.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache);
56 auto end = factory.getRequestHeaders().cend();
57 for (auto i = factory.getRequestHeaders().cbegin(); i != end; ++i) {
58 if (!req2.hasRawHeader(i.key()))
59 req2.setRawHeader(i.key(), i.value());
61 qDebug() << "Request for" << req2.url() << "already contains header" << i.key()
62 << req2.rawHeader(i.key());
65 qDebug() << req2.url() << req2.rawHeaderList();
66 return QNetworkAccessManager::createRequest(op, req2, outgoingData);
69 QNetworkAccessManager *JSNAMFactory::create(QObject *parent) {
70 qDebug() << "Creating NAM";
71 return new JSNAM(parent, *this);