#include "include/global/HTTPRequestHelper.hpp" #include #include #include #include #include #include #include #include "include/global/Configs.hpp" #include "include/ui/mainwindow.h" #include "include/global/DeviceDetailsHelper.hpp" namespace Configs_network { HTTPResponse NetworkRequestHelper::HttpGet(const QString &url, bool sendHwid) { QNetworkRequest request; QNetworkAccessManager accessManager; accessManager.setTransferTimeout(10000); request.setUrl(url); if (Configs::dataStore->net_use_proxy || Configs::dataStore->spmode_system_proxy) { if (Configs::dataStore->started_id < 0) { return HTTPResponse{QObject::tr("Request with proxy but no profile started.")}; } QNetworkProxy p; p.setType(QNetworkProxy::HttpProxy); p.setHostName("127.0.0.1"); p.setPort(Configs::dataStore->inbound_socks_port); accessManager.setProxy(p); } // Set attribute request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy); request.setHeader(QNetworkRequest::KnownHeaders::UserAgentHeader, Configs::dataStore->GetUserAgent()); if (Configs::dataStore->net_insecure) { QSslConfiguration c; c.setPeerVerifyMode(QSslSocket::PeerVerifyMode::VerifyNone); request.setSslConfiguration(c); } //Attach HWID and device info headers if enabled in settings if (sendHwid) { auto details = GetDeviceDetails(); if (!details.hwid.isEmpty()) request.setRawHeader("x-hwid", details.hwid.toUtf8()); if (!details.os.isEmpty()) request.setRawHeader("x-device-os", details.os.toUtf8()); if (!details.osVersion.isEmpty()) request.setRawHeader("x-ver-os", details.osVersion.toUtf8()); if (!details.model.isEmpty()) request.setRawHeader("x-device-model", details.model.toUtf8()); } // auto _reply = accessManager.get(request); connect(_reply, &QNetworkReply::sslErrors, _reply, [](const QList &errors) { QStringList error_str; for (const auto &err: errors) { error_str << err.errorString(); } MW_show_log(QString("SSL Errors: %1 %2").arg(error_str.join(","), Configs::dataStore->net_insecure ? "(Ignored)" : "")); }); // Wait for response QEventLoop loop; connect(_reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); // auto result = HTTPResponse{_reply->error() == QNetworkReply::NetworkError::NoError ? "" : _reply->errorString(), _reply->readAll(), _reply->rawHeaderPairs()}; _reply->deleteLater(); return result; } QString NetworkRequestHelper::GetHeader(const QList> &header, const QString &name) { for (const auto &p: header) { if (QString(p.first).toLower() == name.toLower()) return p.second; } return ""; } QString NetworkRequestHelper::DownloadAsset(const QString &url, const QString &fileName) { QNetworkRequest request; QNetworkAccessManager accessManager; request.setUrl(url); if (Configs::dataStore->net_use_proxy || Configs::dataStore->spmode_system_proxy) { if (Configs::dataStore->started_id < 0) { return QObject::tr("Request with proxy but no profile started."); } QNetworkProxy p; p.setType(QNetworkProxy::HttpProxy); p.setHostName("127.0.0.1"); p.setPort(Configs::dataStore->inbound_socks_port); accessManager.setProxy(p); } if (Configs::dataStore->net_insecure) { QSslConfiguration c; c.setPeerVerifyMode(QSslSocket::PeerVerifyMode::VerifyNone); request.setSslConfiguration(c); } auto _reply = accessManager.get(request); connect(_reply, &QNetworkReply::sslErrors, _reply, [](const QList &errors) { QStringList error_str; for (const auto &err: errors) { error_str << err.errorString(); } MW_show_log(QString("SSL Errors: %1 %2").arg(error_str.join(","), Configs::dataStore->net_insecure ? "(Ignored)" : "")); }); connect(_reply, &QNetworkReply::downloadProgress, _reply, [&](qint64 bytesReceived, qint64 bytesTotal) { runOnUiThread([=]{ GetMainWindow()->setDownloadReport(DownloadProgressReport{fileName, bytesReceived, bytesTotal}, true); GetMainWindow()->UpdateDataView(); }); }); QEventLoop loop; connect(_reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); runOnUiThread([=] { GetMainWindow()->setDownloadReport({}, false); GetMainWindow()->UpdateDataView(true); }); _reply->deleteLater(); if(_reply->error() != QNetworkReply::NetworkError::NoError) { return _reply->errorString(); } auto filePath = Configs::GetBasePath()+ "/" + fileName; auto file = QFile(filePath); if (file.exists()) { file.remove(); } if (!file.open(QIODevice::WriteOnly)) { return QObject::tr("Could not open file."); } file.write(_reply->readAll()); file.close(); return ""; } } // namespace Configs_network