]> git.sur5r.net Git - minitube/blob - lib/js/jsnamfactory.cpp
New upstream version 3.8
[minitube] / lib / js / jsnamfactory.cpp
1 #include "jsnamfactory.h"
2
3 JSDiskCache::JSDiskCache(QObject *parent) : QNetworkDiskCache(parent) {}
4
5 void JSDiskCache::updateMetaData(const QNetworkCacheMetaData &meta) {
6     auto meta2 = fixMetadata(meta);
7     QNetworkDiskCache::updateMetaData(meta2);
8 }
9
10 QIODevice *JSDiskCache::prepare(const QNetworkCacheMetaData &meta) {
11     auto meta2 = fixMetadata(meta);
12     return QNetworkDiskCache::prepare(meta2);
13 }
14
15 QNetworkCacheMetaData JSDiskCache::fixMetadata(const QNetworkCacheMetaData &meta) {
16     QNetworkCacheMetaData meta2 = meta;
17
18     auto now = QDateTime::currentDateTimeUtc();
19     if (meta2.expirationDate() < now) {
20         meta2.setExpirationDate(now.addSecs(3600));
21     }
22
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;
30             headers.erase(i);
31         }
32     }
33     meta2.setRawHeaders(headers);
34
35     return meta2;
36 }
37
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) +
42                              "/js");
43     setCache(cache);
44     setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy);
45 #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
46     setTransferTimeout(10000);
47 #endif
48 }
49
50 QNetworkReply *JSNAM::createRequest(QNetworkAccessManager::Operation op,
51                                     const QNetworkRequest &request,
52                                     QIODevice *outgoingData) {
53     auto req2 = request;
54     req2.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache);
55
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());
60         else
61             qDebug() << "Request for" << req2.url() << "already contains header" << i.key()
62                      << req2.rawHeader(i.key());
63     }
64
65     qDebug() << req2.url() << req2.rawHeaderList();
66     return QNetworkAccessManager::createRequest(op, req2, outgoingData);
67 }
68
69 QNetworkAccessManager *JSNAMFactory::create(QObject *parent) {
70     qDebug() << "Creating NAM";
71     return new JSNAM(parent, *this);
72 }