mirror of
https://github.com/Mahdi-zarei/nekoray.git
synced 2026-01-09 23:10:34 +08:00
139 lines
5.6 KiB
C++
139 lines
5.6 KiB
C++
#include "include/global/HTTPRequestHelper.hpp"
|
|
|
|
#include <QNetworkProxy>
|
|
#include <QNetworkAccessManager>
|
|
#include <QNetworkReply>
|
|
#include <QNetworkRequest>
|
|
#include <QTimer>
|
|
#include <QFile>
|
|
#include <QApplication>
|
|
|
|
#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<QSslError> &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<QPair<QByteArray, QByteArray>> &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<QSslError> &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
|