6#ifdef USERVER_TVM2_HTTP_CLIENT
7#error Use clients::Http from clients/http.hpp instead
12#include <userver/moodycamel/concurrentqueue_fwd.h>
14#include <userver/clients/dns/resolver_fwd.hpp>
15#include <userver/clients/http/config.hpp>
16#include <userver/clients/http/plugin.hpp>
17#include <userver/clients/http/request.hpp>
18#include <userver/engine/task/task_processor_fwd.hpp>
19#include <userver/rcu/rcu.hpp>
20#include <userver/utils/fast_pimpl.hpp>
21#include <userver/utils/not_null.hpp>
22#include <userver/utils/periodic_task.hpp>
23#include <userver/utils/swappingsmart.hpp>
24#include <userver/yaml_config/fwd.hpp>
26USERVER_NAMESPACE_BEGIN
32namespace server::http {
33class HeadersPropagator;
39class ConnectRateLimiter;
51struct TestsuiteConfig;
54struct InstanceStatistics;
55class DestinationStatistics;
69 Client(ClientSettings settings, engine::TaskProcessor& fs_task_processor,
70 impl::PluginPipeline&& plugin_pipeline);
87 void SetMultiplexingEnabled(
bool enabled);
90 void SetMaxHostConnections(size_t max_host_connections);
93 PoolStatistics GetPoolStatistics()
const;
97 void SetDestinationMetricsAutoMaxSize(size_t max_size);
100 const http::DestinationStatistics& GetDestinationStatistics()
const;
103 void SetTestsuiteConfig(
const TestsuiteConfig& config);
106 void SetAllowedUrlsExtra(std::vector<std::string>&& urls);
109 void SetConfig(
const impl::Config&);
135 InstanceStatistics GetMultiStatistics(size_t n)
const;
137 size_t FindMultiIndex(
const curl::multi*)
const;
141 friend class impl::EasyWrapper;
142 void IncPending()
noexcept { ++pending_tasks_; }
143 void DecPending()
noexcept { --pending_tasks_; }
144 void PushIdleEasy(std::shared_ptr<curl::easy>&& easy)
noexcept;
146 std::shared_ptr<curl::easy> TryDequeueIdle()
noexcept;
148 std::atomic<std::size_t> pending_tasks_{0};
151 CancellationPolicy cancellation_policy_;
153 std::shared_ptr<DestinationStatistics> destination_statistics_;
154 std::unique_ptr<engine::ev::ThreadPool> thread_pool_;
155 std::vector<Statistics> statistics_;
156 std::vector<std::unique_ptr<curl::multi>> multis_;
158 static constexpr size_t kIdleQueueSize = 616;
159 static constexpr size_t kIdleQueueAlignment = 8;
160 using IdleQueueTraits = moodycamel::ConcurrentQueueDefaultTraits;
161 using IdleQueueValue = std::shared_ptr<curl::easy>;
163 moodycamel::ConcurrentQueue<IdleQueueValue, IdleQueueTraits>;
164 utils::FastPimpl<IdleQueue, kIdleQueueSize, kIdleQueueAlignment> idle_queue_;
166 engine::TaskProcessor& fs_task_processor_;
167 std::optional<std::string> user_agent_;
168 rcu::Variable<std::string> proxy_;
171 utils::PeriodicTask easy_reinit_task_;
174 std::shared_ptr<
const TestsuiteConfig> testsuite_config_;
175 rcu::Variable<std::vector<std::string>> allowed_urls_extra_;
177 std::shared_ptr<curl::ConnectRateLimiter> connect_rate_limiter_;
179 clients::dns::Resolver* resolver_{
nullptr};
181 const server::http::HeadersPropagator* headers_propagator_{
nullptr};
182 impl::PluginPipeline plugin_pipeline_;