DNS update

This commit is contained in:
svamnezia
2026-02-05 06:46:18 +03:00
parent 6123268846
commit 3a7d285e55
10 changed files with 811 additions and 283 deletions
+30 -69
View File
@@ -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();
}