diff --git a/td/telegram/net/ConnectionCreator.cpp b/td/telegram/net/ConnectionCreator.cpp index 3cbdea4ef..99d0fb004 100644 --- a/td/telegram/net/ConnectionCreator.cpp +++ b/td/telegram/net/ConnectionCreator.cpp @@ -457,6 +457,14 @@ void ConnectionCreator::get_proxy_link(int32 proxy_id, Promise promise) promise.set_value(std::move(url)); } +ActorId ConnectionCreator::get_resolver() const { + if (G()->shared_config().get_option_boolean("expect_blocking", true)) { + return block_get_host_by_name_actor_.get(); + } else { + return get_host_by_name_actor_.get(); + } +} + void ConnectionCreator::ping_proxy(int32 proxy_id, Promise promise) { if (proxy_id == 0) { ProxyInfo proxy{nullptr, IPAddress()}; @@ -507,7 +515,7 @@ void ConnectionCreator::ping_proxy(int32 proxy_id, Promise promise) { } const Proxy &proxy = it->second; bool prefer_ipv6 = G()->shared_config().get_option_boolean("prefer_ipv6"); - send_closure(get_host_by_name_actor_, &GetHostByNameActor::run, proxy.server().str(), proxy.port(), prefer_ipv6, + send_closure(get_resolver(), &GetHostByNameActor::run, proxy.server().str(), proxy.port(), prefer_ipv6, PromiseCreator::lambda([actor_id = actor_id(this), promise = std::move(promise), proxy_id](Result result) mutable { if (result.is_error()) { @@ -1243,10 +1251,11 @@ void ConnectionCreator::start_up() { GetHostByNameActor::Options options; options.scheduler_id = G()->get_gc_scheduler_id(); - options.resolver_types = {GetHostByNameActor::ResolverType::Google, GetHostByNameActor::ResolverType::Native}; options.ok_timeout = 5 * 60 - 1; options.error_timeout = 0; - get_host_by_name_actor_ = create_actor("GetHostByNameActor", std::move(options)); + get_host_by_name_actor_ = create_actor("GetHostByNameActor", options); + options.resolver_types = {GetHostByNameActor::ResolverType::Google, GetHostByNameActor::ResolverType::Native}; + block_get_host_by_name_actor_ = create_actor("GetHostByNameActor", options); ref_cnt_guard_ = create_reference(-1); @@ -1373,7 +1382,7 @@ void ConnectionCreator::loop() { bool prefer_ipv6 = G()->shared_config().get_option_boolean("prefer_ipv6"); VLOG(connections) << "Resolve IP address " << resolve_proxy_query_token_ << " of " << proxy.server(); send_closure( - get_host_by_name_actor_, &GetHostByNameActor::run, proxy.server().str(), proxy.port(), prefer_ipv6, + get_resolver(), &GetHostByNameActor::run, proxy.server().str(), proxy.port(), prefer_ipv6, PromiseCreator::lambda([actor_id = create_reference(resolve_proxy_query_token_)](Result result) { send_closure(std::move(actor_id), &ConnectionCreator::on_proxy_resolved, std::move(result), false); })); diff --git a/td/telegram/net/ConnectionCreator.h b/td/telegram/net/ConnectionCreator.h index d5cde0e36..e9cc76e5f 100644 --- a/td/telegram/net/ConnectionCreator.h +++ b/td/telegram/net/ConnectionCreator.h @@ -185,6 +185,7 @@ class ConnectionCreator : public NetQueryCallback { int32 max_proxy_id_ = 0; int32 active_proxy_id_ = 0; ActorOwn get_host_by_name_actor_; + ActorOwn block_get_host_by_name_actor_; IPAddress proxy_ip_address_; Timestamp resolve_proxy_timestamp_; uint64 resolve_proxy_query_token_{0}; @@ -322,6 +323,8 @@ class ConnectionCreator : public NetQueryCallback { Result find_connection(const ProxyInfo &proxy, DcId dc_id, bool allow_media_only, FindConnectionExtra &extra); + ActorId get_resolver() const; + void ping_proxy_resolved(int32 proxy_id, IPAddress ip_address, Promise promise); void ping_proxy_socket_fd(SocketFd socket_fd, mtproto::TransportType transport_type, Promise promise);