diff --git a/CMakeLists.txt b/CMakeLists.txt index ed0c43f..0bdd3cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/main/HTTPRequestHelper.cpp b/main/HTTPRequestHelper.cpp index 08a1a42..2df78cd 100644 --- a/main/HTTPRequestHelper.cpp +++ b/main/HTTPRequestHelper.cpp @@ -1,77 +1,41 @@ #include "HTTPRequestHelper.hpp" #include -#include -#include #include #include +#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 &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>(); + for (const auto &item: resp.header) { + headerPairs.append(std::pair(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; } diff --git a/main/HTTPRequestHelper.hpp b/main/HTTPRequestHelper.hpp index 76760f0..56a940b 100644 --- a/main/HTTPRequestHelper.hpp +++ b/main/HTTPRequestHelper.hpp @@ -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> &header, const QString &name); }; diff --git a/ui/mainwindow.cpp b/ui/mainwindow.cpp index f79ba7b..18c7893 100644 --- a/ui/mainwindow.cpp +++ b/ui/mainwindow.cpp @@ -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());