From 633fc9fba8558884b1c8e242f5c1a32c205708ad Mon Sep 17 00:00:00 2001 From: larteyoh Date: Fri, 10 May 2024 13:36:57 +0000 Subject: [PATCH] set network access manager factory for qml --- src/gui/main.cpp | 1 + src/gui/proxy_manager.cpp | 21 +++++++++++++++++++++ src/gui/proxy_manager.hpp | 5 ++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 058b4b7..72f23a9 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -122,6 +122,7 @@ int main(int argc, char *argv[]) engine.rootContext()->setContextProperty("DaemonManager", daemonManager); ProxyManager * proxyManager = new ProxyManager(&engine); engine.rootContext()->setContextProperty("ProxyManager", proxyManager); + engine.setNetworkAccessManagerFactory(proxyManager); // we can also register an instance of a class instead of the class itself WalletController *wallet = new WalletController(&engine); engine.rootContext()->setContextProperty("Wallet", wallet);//new WalletController());//qmlRegisterUncreatableType("neroshop.Wallet", 1, 0, "Wallet", "Wallet cannot be instantiated directly.");//qmlRegisterType("neroshop.Wallet", 1, 0, "Wallet"); // Usage: import neroshop.Wallet ... Wallet { id: wallet } diff --git a/src/gui/proxy_manager.cpp b/src/gui/proxy_manager.cpp index 4541c1e..618dd87 100644 --- a/src/gui/proxy_manager.cpp +++ b/src/gui/proxy_manager.cpp @@ -1,6 +1,7 @@ #include "proxy_manager.hpp" #include +#include #include #include #include @@ -37,6 +38,24 @@ neroshop::ProxyManager::ProxyManager(QObject* parent) : QObject(parent), m_torEn neroshop::ProxyManager::~ProxyManager() {} +QNetworkAccessManager * neroshop::ProxyManager::create(QObject *parent) { + QNetworkAccessManager *networkAccessManager = new QNetworkAccessManager(parent); + QNetworkDiskCache *diskCache = new QNetworkDiskCache(parent); + diskCache->setCacheDirectory("requestCache"); + networkAccessManager->setCache(diskCache); + + if(hasTor() || isTorRunning()) { + QNetworkProxy torProxy; + torProxy.setType(QNetworkProxy::Socks5Proxy); + torProxy.setHostName("127.0.0.1"); + torProxy.setPort(9050); + networkAccessManager->setProxy(torProxy); + // Standard QML components like Image or XmlHttpRequest can now make network requests over Tor + } + + return networkAccessManager; +} + void neroshop::ProxyManager::useDefaultProxy() { QNetworkProxy::setApplicationProxy(QNetworkProxy()); @@ -330,6 +349,8 @@ void neroshop::ProxyManager::onReplyFinished(QNetworkReply * reply) { // Reply received successfully QByteArray data = reply->readAll(); ////qDebug() << "Data received:" << data; + QVariant fromCache = reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute); + qDebug() << "page from cache?" << fromCache.toBool(); } else { // Error occurred qDebug() << "Network error: " << reply->errorString(); diff --git a/src/gui/proxy_manager.hpp b/src/gui/proxy_manager.hpp index bf2d043..39791d0 100644 --- a/src/gui/proxy_manager.hpp +++ b/src/gui/proxy_manager.hpp @@ -5,12 +5,13 @@ #include #include +#include #include #include namespace neroshop { -class ProxyManager : public QObject { +class ProxyManager : public QObject, public QQmlNetworkAccessManagerFactory { Q_OBJECT Q_PROPERTY(bool torEnabled READ isTorEnabled NOTIFY networkProxyChanged) Q_PROPERTY(QString torOutput READ getTorOutput NOTIFY torOutputChanged) @@ -18,6 +19,8 @@ public: ProxyManager(QObject *parent = nullptr); ~ProxyManager(); + QNetworkAccessManager * create(QObject *parent) override; + Q_INVOKABLE void useDefaultProxy(); Q_INVOKABLE void useTorProxy(); Q_INVOKABLE void useI2PProxy();