mirror of
https://github.com/amnezia-vpn/amnezia-client.git
synced 2026-06-21 02:01:03 +07:00
DNS update
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#include "apiNewsController.h"
|
||||
|
||||
#include "core/api/apiUtils.h"
|
||||
#include "core/controllers/gatewayController.h"
|
||||
#include "core/networkUtilities.h"
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
@@ -32,8 +33,6 @@ void ApiNewsController::fetchNews(bool showError)
|
||||
return;
|
||||
}
|
||||
|
||||
auto gatewayController = QSharedPointer<GatewayController>::create(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(),
|
||||
apiDefs::requestTimeoutMsecs, m_settings->isStrictKillSwitchEnabled());
|
||||
QJsonObject payload;
|
||||
payload.insert("locale", m_settings->getAppLanguage().name().split("_").first());
|
||||
|
||||
@@ -45,74 +44,36 @@ void ApiNewsController::fetchNews(bool showError)
|
||||
payload.insert(configKey::serviceType, stacksJson.value(configKey::serviceType));
|
||||
}
|
||||
|
||||
QString baseDomain = "gateway.example.com";
|
||||
QString endpoint = QString("%1v1/news");
|
||||
|
||||
// 1. HTTP (primary transport - async)
|
||||
auto future = gatewayController->postAsync(endpoint, payload);
|
||||
future.then(this, [this, showError, gatewayController, baseDomain, endpoint, payload](QPair<ErrorCode, QByteArray> result) {
|
||||
auto [errorCode, responseBody] = result;
|
||||
|
||||
// HTTP succeeded
|
||||
if (errorCode == ErrorCode::NoError) {
|
||||
QJsonDocument doc = QJsonDocument::fromJson(responseBody);
|
||||
QJsonArray newsArray;
|
||||
if (doc.isArray()) {
|
||||
newsArray = doc.array();
|
||||
} else if (doc.isObject()) {
|
||||
QJsonObject obj = doc.object();
|
||||
if (obj.value("news").isArray()) {
|
||||
newsArray = obj.value("news").toArray();
|
||||
}
|
||||
}
|
||||
m_newsModel->updateModel(newsArray);
|
||||
emit fetchNewsFinished();
|
||||
return;
|
||||
// Use GatewayController with parallel transports
|
||||
GatewayController gatewayController(m_settings->getGatewayEndpoint(),
|
||||
m_settings->isDevGatewayEnv(),
|
||||
apiDefs::requestTimeoutMsecs,
|
||||
m_settings->isStrictKillSwitchEnabled());
|
||||
|
||||
// Load transports config from file or env
|
||||
gatewayController.loadTransportsConfig("gateway.json", "AMNEZIA_GATEWAY");
|
||||
|
||||
QByteArray responseBody;
|
||||
ErrorCode errorCode = gatewayController.postParallel(endpoint, payload, responseBody);
|
||||
|
||||
if (errorCode != ErrorCode::NoError) {
|
||||
emit errorOccurred(errorCode, showError);
|
||||
return;
|
||||
}
|
||||
|
||||
// Parse response
|
||||
QJsonDocument doc = QJsonDocument::fromJson(responseBody);
|
||||
QJsonArray newsArray;
|
||||
if (doc.isArray()) {
|
||||
newsArray = doc.array();
|
||||
} else if (doc.isObject()) {
|
||||
QJsonObject obj = doc.object();
|
||||
if (obj.value("news").isArray()) {
|
||||
newsArray = obj.value("news").toArray();
|
||||
}
|
||||
|
||||
// HTTP failed, try DNS transports as fallback (synchronous)
|
||||
qDebug() << "[Transport] HTTP failed, trying DNS transports as fallback";
|
||||
GatewayController dnsGateway(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs,
|
||||
m_settings->isStrictKillSwitchEnabled());
|
||||
QByteArray dnsResponseBody;
|
||||
ErrorCode dnsError = ErrorCode::UnknownError;
|
||||
|
||||
// 2. DNS UDP
|
||||
dnsGateway.setDnsServer("127.0.0.1", baseDomain, NetworkUtilities::DnsTransport::Udp, 15353);
|
||||
dnsError = dnsGateway.postViaDns(endpoint, payload, dnsResponseBody);
|
||||
if (dnsError != ErrorCode::NoError) {
|
||||
// 3. DNS TCP
|
||||
dnsGateway.setDnsServer("127.0.0.1", baseDomain, NetworkUtilities::DnsTransport::Tcp, 15353);
|
||||
dnsError = dnsGateway.postViaDns(endpoint, payload, dnsResponseBody);
|
||||
}
|
||||
if (dnsError != ErrorCode::NoError) {
|
||||
// 4. DoT
|
||||
dnsGateway.setDnsServer("127.0.0.1", baseDomain, NetworkUtilities::DnsTransport::Tls, 8853);
|
||||
dnsError = dnsGateway.postViaDns(endpoint, payload, dnsResponseBody);
|
||||
}
|
||||
if (dnsError != ErrorCode::NoError) {
|
||||
// 5. DoH
|
||||
dnsGateway.setDnsServer("127.0.0.1", baseDomain, NetworkUtilities::DnsTransport::Https, 80, "/dns-query");
|
||||
dnsError = dnsGateway.postViaDns(endpoint, payload, dnsResponseBody);
|
||||
}
|
||||
|
||||
if (dnsError != ErrorCode::NoError) {
|
||||
emit errorOccurred(dnsError, showError);
|
||||
return;
|
||||
}
|
||||
|
||||
// DNS succeeded
|
||||
QJsonDocument doc = QJsonDocument::fromJson(dnsResponseBody);
|
||||
QJsonArray newsArray;
|
||||
if (doc.isArray()) {
|
||||
newsArray = doc.array();
|
||||
} else if (doc.isObject()) {
|
||||
QJsonObject obj = doc.object();
|
||||
if (obj.value("news").isArray()) {
|
||||
newsArray = obj.value("news").toArray();
|
||||
}
|
||||
}
|
||||
m_newsModel->updateModel(newsArray);
|
||||
emit fetchNewsFinished();
|
||||
});
|
||||
}
|
||||
m_newsModel->updateModel(newsArray);
|
||||
emit fetchNewsFinished();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user