From 816dc3af95f5a474cb46048b7084fb532e7f4d28 Mon Sep 17 00:00:00 2001 From: vkamn Date: Thu, 21 Aug 2025 12:28:03 +0800 Subject: [PATCH] feat: add ping before request to proxy (#1805) --- client/core/controllers/gatewayController.cpp | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/client/core/controllers/gatewayController.cpp b/client/core/controllers/gatewayController.cpp index ade5979b7..58a1ed60b 100644 --- a/client/core/controllers/gatewayController.cpp +++ b/client/core/controllers/gatewayController.cpp @@ -61,7 +61,7 @@ ErrorCode GatewayController::get(const QString &endpoint, QByteArray &responseBo request.setTransferTimeout(m_requestTimeoutMsecs); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); - request.setUrl(QString(endpoint).arg(m_gatewayEndpoint)); + request.setUrl(QString(endpoint).arg(m_proxyUrl.isEmpty() ? m_gatewayEndpoint : m_proxyUrl)); // bypass killSwitch exceptions for API-gateway #ifdef AMNEZIA_DESKTOP @@ -123,7 +123,7 @@ ErrorCode GatewayController::post(const QString &endpoint, const QJsonObject api request.setTransferTimeout(m_requestTimeoutMsecs); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); - request.setUrl(endpoint.arg(m_gatewayEndpoint)); + request.setUrl(endpoint.arg(m_proxyUrl.isEmpty() ? m_gatewayEndpoint : m_proxyUrl)); // bypass killSwitch exceptions for API-gateway #ifdef AMNEZIA_DESKTOP @@ -366,6 +366,36 @@ void GatewayController::bypassProxy(const QString &endpoint, QNetworkReply *repl return false; }; + if (m_proxyUrl.isEmpty()) { + QNetworkRequest request; + request.setTransferTimeout(1000); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + + QEventLoop wait; + QList sslErrors; + QNetworkReply *reply; + + for (const QString &proxyUrl : proxyUrls) { + request.setUrl(proxyUrl + "lmbd-health"); + reply = amnApp->networkManager()->get(request); + + connect(reply, &QNetworkReply::finished, &wait, &QEventLoop::quit); + connect(reply, &QNetworkReply::sslErrors, [this, &sslErrors](const QList &errors) { sslErrors = errors; }); + wait.exec(); + + if (reply->error() == QNetworkReply::NetworkError::NoError) { + reply->deleteLater(); + + m_proxyUrl = proxyUrl; + if (!m_proxyUrl.isEmpty()) { + break; + } + } else { + reply->deleteLater(); + } + } + } + if (!m_proxyUrl.isEmpty()) { if (bypassFunction(endpoint, m_proxyUrl, reply, requestFunction, replyProcessingFunction)) { return;