mirror of
https://github.com/Mahdi-zarei/nekoray.git
synced 2025-12-19 13:50:12 +08:00
feat: Migrate to cpr(libcurl c++ wrapper) for HTTP Requests
This commit is contained in:
parent
c5da6e88de
commit
6b82a75d85
@ -66,6 +66,12 @@ list(APPEND NKR_EXTERNAL_TARGETS yaml-cpp)
|
||||
find_package(ZXing CONFIG REQUIRED)
|
||||
list(APPEND NKR_EXTERNAL_TARGETS ZXing::ZXing)
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(cpr GIT_REPOSITORY https://github.com/libcpr/cpr.git
|
||||
GIT_TAG b5a21decc0cf25773fb5d742101da6b72639aa51) # Replace with your desired git commit from: https://github.com/libcpr/cpr/releases
|
||||
FetchContent_MakeAvailable(cpr)
|
||||
list(APPEND NKR_EXTERNAL_TARGETS cpr::cpr)
|
||||
|
||||
set(QHOTKEY_INSTALL OFF)
|
||||
set(BUILD_SHARED_LIBS OFF)
|
||||
add_subdirectory(3rdparty/QHotkey)
|
||||
|
||||
@ -1,77 +1,41 @@
|
||||
#include "HTTPRequestHelper.hpp"
|
||||
|
||||
#include <QByteArray>
|
||||
#include <QNetworkProxy>
|
||||
#include <QEventLoop>
|
||||
#include <QMetaEnum>
|
||||
#include <QTimer>
|
||||
#include "cpr/cpr.h"
|
||||
|
||||
#include "main/NekoGui.hpp"
|
||||
|
||||
namespace NekoGui_network {
|
||||
|
||||
NekoHTTPResponse NetworkRequestHelper::HttpGet(const QUrl &url) {
|
||||
QNetworkRequest request;
|
||||
QNetworkAccessManager accessManager;
|
||||
request.setUrl(url);
|
||||
// Set proxy
|
||||
NekoHTTPResponse NetworkRequestHelper::HttpGet(const QString &url) {
|
||||
cpr::Session session;
|
||||
if (NekoGui::dataStore->sub_use_proxy) {
|
||||
QNetworkProxy p;
|
||||
// Note: sing-box mixed socks5 protocol error
|
||||
p.setType(IS_NEKO_BOX ? QNetworkProxy::HttpProxy : QNetworkProxy::Socks5Proxy);
|
||||
p.setHostName("127.0.0.1");
|
||||
p.setPort(NekoGui::dataStore->inbound_socks_port);
|
||||
session.SetProxies({{"http", "127.0.0.1:" + QString(Int2String(NekoGui::dataStore->inbound_socks_port)).toStdString()},
|
||||
{"https", "127.0.0.1:" + QString(Int2String(NekoGui::dataStore->inbound_socks_port)).toStdString()}});
|
||||
if (NekoGui::dataStore->inbound_auth->NeedAuth()) {
|
||||
p.setUser(NekoGui::dataStore->inbound_auth->username);
|
||||
p.setPassword(NekoGui::dataStore->inbound_auth->password);
|
||||
session.SetProxyAuth(cpr::ProxyAuthentication{{"http",
|
||||
cpr::EncodedAuthentication{NekoGui::dataStore->inbound_auth->username.toStdString(), NekoGui::dataStore->inbound_auth->password.toStdString()}}});
|
||||
}
|
||||
accessManager.setProxy(p);
|
||||
if (NekoGui::dataStore->started_id < 0) {
|
||||
return NekoHTTPResponse{QObject::tr("Request with proxy but no profile started.")};
|
||||
}
|
||||
}
|
||||
if (accessManager.proxy().type() == QNetworkProxy::Socks5Proxy) {
|
||||
auto cap = accessManager.proxy().capabilities();
|
||||
accessManager.proxy().setCapabilities(cap | QNetworkProxy::HostNameLookupCapability);
|
||||
}
|
||||
// Set attribute
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
|
||||
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);
|
||||
#endif
|
||||
request.setHeader(QNetworkRequest::KnownHeaders::UserAgentHeader, NekoGui::dataStore->GetUserAgent());
|
||||
if (NekoGui::dataStore->sub_insecure) {
|
||||
QSslConfiguration c;
|
||||
c.setPeerVerifyMode(QSslSocket::PeerVerifyMode::VerifyNone);
|
||||
request.setSslConfiguration(c);
|
||||
session.SetVerifySsl(cpr::VerifySsl{false});
|
||||
}
|
||||
//
|
||||
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(","), NekoGui::dataStore->sub_insecure ? "(Ignored)" : ""));
|
||||
});
|
||||
// Wait for response
|
||||
auto abortTimer = new QTimer;
|
||||
abortTimer->setSingleShot(true);
|
||||
abortTimer->setInterval(10000);
|
||||
QObject::connect(abortTimer, &QTimer::timeout, _reply, &QNetworkReply::abort);
|
||||
abortTimer->start();
|
||||
{
|
||||
QEventLoop loop;
|
||||
QObject::connect(_reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
|
||||
loop.exec();
|
||||
session.SetUserAgent(cpr::UserAgent{NekoGui::dataStore->GetUserAgent().toStdString()});
|
||||
session.SetTimeout(cpr::Timeout(10000));
|
||||
session.SetUrl(cpr::Url(url.toStdString()));
|
||||
auto resp = session.Get();
|
||||
auto headerPairs = QList<QPair<QByteArray, QByteArray>>();
|
||||
for (const auto &item: resp.header) {
|
||||
headerPairs.append(std::pair<QByteArray, QByteArray>(QByteArray(item.first.c_str()), QByteArray(item.second.c_str())));
|
||||
}
|
||||
if (abortTimer != nullptr) {
|
||||
abortTimer->stop();
|
||||
abortTimer->deleteLater();
|
||||
}
|
||||
//
|
||||
auto result = NekoHTTPResponse{_reply->error() == QNetworkReply::NetworkError::NoError ? "" : _reply->errorString(),
|
||||
_reply->readAll(), _reply->rawHeaderPairs()};
|
||||
_reply->deleteLater();
|
||||
auto err = resp.error.message.empty() ? (resp.status_code == 200 ? "" : resp.status_line) : resp.error.message;
|
||||
auto result = NekoHTTPResponse{ err.c_str(),
|
||||
resp.text.c_str(), headerPairs};
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@ namespace NekoGui_network {
|
||||
;
|
||||
|
||||
public:
|
||||
static NekoHTTPResponse HttpGet(const QUrl &url);
|
||||
static NekoHTTPResponse HttpGet(const QString &url);
|
||||
|
||||
static QString GetHeader(const QList<QPair<QByteArray, QByteArray>> &header, const QString &name);
|
||||
};
|
||||
|
||||
@ -326,11 +326,17 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
|
||||
connect(ui->menu_server, &QMenu::aboutToShow, this, [=](){
|
||||
if (!speedtestRunning.tryLock()) {
|
||||
ui->menu_server->addAction(ui->menu_stop_testing);
|
||||
return;
|
||||
} else {
|
||||
speedtestRunning.unlock();
|
||||
ui->menu_server->removeAction(ui->menu_stop_testing);
|
||||
}
|
||||
|
||||
auto currGroup = NekoGui::profileManager->GetGroup(NekoGui::dataStore->current_group);
|
||||
if (currGroup != nullptr && !currGroup->url.isEmpty()) {
|
||||
ui->menu_server->addAction(ui->menu_update_subscription);
|
||||
} else {
|
||||
ui->menu_server->removeAction(ui->menu_update_subscription);
|
||||
}
|
||||
});
|
||||
connect(ui->actionUrl_Test_Selected, &QAction::triggered, this, [=]() {
|
||||
speedtest_current_group(get_now_selected_list());
|
||||
|
||||
Loading…
Reference in New Issue
Block a user