All checks were successful
Desktop source guards / guards (push) Successful in 8s
По логу ПК 02.10 первый запуск тратил 1+2+4 с бюджетов на прямые релеи, до которых не доходил даже TCP, и только после их подавления пробовал фронты Cloudflare. В VM релей, отвечавший отказом сразу, вообще не подавлялся: две минуты попыток с растущей паузой, фронты не открывались. - Пока релей датацентра не ответил в этой сети или сбоит, сессия через 500 мс открывает рядом с ним тестовое соединение через фронт. Работающий релей успевает раньше, и фронт не открывается вовсе. - Релей сохраняет более высокий приоритет: подключившемуся фронту даётся обычное ожидание лучшего соединения, бюджет на подключение не меньше 4,5 с, чтобы фронт успел пройти TLS и апгрейд. - Релей, проигравший гонку без TCP, считается недоступным, как при истёкшем бюджете. Через несколько раундов он подавляется, и фронты набираются сразу, без гонки и ожидания. - Отказ релея на уровне TCP (сброс, reject, нет такого хоста) учитывается так же, как таймаут. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
73 lines
1.8 KiB
C++
73 lines
1.8 KiB
C++
/*
|
|
This file is part of Telegram Desktop,
|
|
the official desktop application for the Telegram messaging service.
|
|
|
|
For license and copyright information please follow this link:
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
*/
|
|
#include "mtproto/proxy/socket_factory.h"
|
|
|
|
#include "mtproto/proxy/mtproxy/tls_socket.h"
|
|
#include "mtproto/proxy/wss/socket.h"
|
|
#include "mtproto/details/mtproto_web_proxy_socket.h"
|
|
#include "mtproto/transport/details/mtproto_tcp_socket.h"
|
|
|
|
namespace MTP::details {
|
|
|
|
std::unique_ptr<AbstractSocket> CreateProxyAwareSocket(
|
|
not_null<RuntimeEnvironment*> runtime,
|
|
not_null<QThread*> thread,
|
|
const bytes::vector &secret,
|
|
const ProxyData &proxy,
|
|
bool protocolForFiles,
|
|
const ProxyStealthOptions &stealth,
|
|
int16 protocolDcId,
|
|
ProxyConnectionAttempt mtproxyAttempt,
|
|
MtProxyAttemptPlan mtproxyPlan,
|
|
crl::time mtproxyAttemptStartedAt,
|
|
bool wssFront) {
|
|
if (proxy.type == ProxyData::Type::Web) {
|
|
return std::make_unique<WebProxySocket>(
|
|
runtime,
|
|
thread,
|
|
proxy,
|
|
mtproxyAttempt.use);
|
|
}
|
|
const auto networkProxy = ToNetworkProxy(proxy);
|
|
if (stealth.transport == ProxyTransport::Wss) {
|
|
auto route = WssCustomRoute(stealth);
|
|
if (!route && wssFront) {
|
|
route = WssFrontRoute(protocolDcId);
|
|
}
|
|
if (!route) {
|
|
route = WssOfficialRoute(protocolDcId);
|
|
}
|
|
if (route) {
|
|
return std::make_unique<WssSocket>(
|
|
runtime,
|
|
thread,
|
|
networkProxy,
|
|
protocolForFiles,
|
|
std::move(*route));
|
|
}
|
|
}
|
|
if (secret.size() >= 21 && secret[0] == bytes::type(0xEE)) {
|
|
return std::make_unique<TlsSocket>(
|
|
runtime,
|
|
thread,
|
|
secret,
|
|
proxy,
|
|
protocolForFiles,
|
|
stealth,
|
|
mtproxyAttempt,
|
|
std::move(mtproxyPlan),
|
|
mtproxyAttemptStartedAt);
|
|
}
|
|
return std::make_unique<TcpSocket>(
|
|
runtime,
|
|
thread,
|
|
networkProxy,
|
|
protocolForFiles);
|
|
}
|
|
|
|
} // namespace MTP::details
|