]> git.sur5r.net Git - minitube/blob - lib/js/jsnamfactory.cpp
New upstream version 3.9.1
[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 #ifndef QT_NO_DEBUG_OUTPUT
66     qDebug() << req2.url();
67     for (const auto &h : req2.rawHeaderList())
68         qDebug() << h << req2.rawHeader(h);
69 #endif
70
71     auto reply = QNetworkAccessManager::createRequest(op, req2, outgoingData);
72
73 #ifndef QT_NO_DEBUG_OUTPUT
74     connect(reply, &QNetworkReply::finished, this, [reply] {
75         qDebug() << "finished"
76                  << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toUInt()
77                  << reply->url() << reply->rawHeaderPairs();
78     });
79     connect(reply, &QNetworkReply::redirectAllowed, this,
80             [reply] { qDebug() << "redirectAllowed" << reply->url(); });
81 #endif
82
83     return reply;
84 }
85
86 QNetworkAccessManager *JSNAMFactory::create(QObject *parent) {
87     qDebug() << "Creating NAM";
88     return new JSNAM(parent, *this);
89 }