ZaStoGram_desktop/Telegram/SourceFiles/mtproto/proxy/socket_factory.cpp
loop-uh de04277eb8
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>
2026-10-02 21:27:00 +03:00

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