userver: userver/server/component.hpp Source File
Loading...
Searching...
No Matches
component.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/server/component.hpp
4/// @brief @copybrief components::Server
5
6#include <memory>
7
8#include <userver/components/loggable_component_base.hpp>
9#include <userver/engine/task/task_processor_fwd.hpp>
10#include <userver/server/server.hpp>
11#include <userver/utils/statistics/entry.hpp>
12
13USERVER_NAMESPACE_BEGIN
14
15namespace components {
16
17// clang-format off
18
19/// @ingroup userver_components
20///
21/// @brief Component that listens for incoming requests, manages
22/// incoming connections and passes the requests to the appropriate handler.
23///
24/// Starts listening and accepting connections only after **all** the
25/// components are loaded.
26///
27/// All the classes inherited from server::handlers::HttpHandlerBase and
28/// registered in components list bind to the components::Server component.
29///
30/// ## Dynamic config
31/// * @ref USERVER_LOG_REQUEST
32/// * @ref USERVER_LOG_REQUEST_HEADERS
33/// * @ref USERVER_DEADLINE_PROPAGATION_ENABLED
34/// * @ref USERVER_CANCEL_HANDLE_REQUEST_BY_DEADLINE
35///
36/// ## Static options:
37/// Name | Description | Default value
38/// ---- | ----------- | -------------
39/// logger_access | set to logger name from components::Logging component to write access logs into it; do not set to avoid writing access logs | -
40/// logger_access_tskv | set to logger name from components::Logging component to write access logs in TSKV format into it; do not set to avoid writing access logs | -
41/// max_response_size_in_flight | set it to the size of response in bytes and the component will drop bigger responses from handlers that allow throttling | -
42/// server-name | value to send in HTTP Server header | value from utils::GetUserverIdentifier()
43/// listener | (*required*) *see below* | -
44/// listener-monitor | *see below* | -
45/// set-response-server-hostname | set to true to add the `X-YaTaxi-Server-Hostname` header with instance name, set to false to not add the header | false
46///
47/// Server is configured by 'listener' and 'listener-monitor' entries.
48/// 'listener' is a required entry that describes the request processing
49/// socket. 'listener-monitor' is an optional entry that describes the special
50/// monitoring socket, used for getting statistics and processing utility
51/// requests that should succeed even is the main socket is under heavy
52/// pressure.
53///
54/// Each of the 'listener' and 'listener-monitor' may be configured with the
55/// following options:
56///
57/// Name | Description | Default value
58/// ---- | ----------- | -------------
59/// address | IPv6 or IPv4 network interface to bind to | '::' (all the IPv6 and IPv4 local interfaces)
60/// port | port to listen on | 0
61/// unix-socket | unix socket to listen on instead of listening on a port and network address | ''
62/// max_connections | max connections count to keep | 32768
63/// task_processor | task processor to process incoming requests | -
64/// backlog | max count of new connections pending acceptance | 1024
65/// tls.ca | paths to TLS CAs for client authentication | -
66/// tls.cert | path to TLS server certificate | -
67/// tls.private-key | path to TLS server certificate private key | -
68/// tls.private-key-passphrase-name | passphrase name located in secdist's "passphrases" section | -
69/// handler-defaults.max_url_size | max path/URL size or empty to not limit | 8192
70/// handler-defaults.max_request_size | max size of the whole request | 1024 * 1024
71/// handler-defaults.max_headers_size | max request headers size | 65536
72/// handler-defaults.parse_args_from_body | optional field to parse request according to x-www-form-urlencoded rules and make parameters accessible as query parameters | false
73/// handler-defaults.set_tracing_headers | whether to set http tracing headers (X-YaTraceId, X-YaSpanId, X-RequestId) | true
74/// handler-defaults.deadline_propagation_enabled | when `false`, disables HTTP handler deadline propagation | true
75/// handler-defaults.deadline_expired_status_code | the HTTP status code to return if the request deadline expires | 498
76/// connection.in_buffer_size | size of the buffer to preallocate for request receive: bigger values use more RAM and less CPU | 32 * 1024
77/// connection.requests_queue_size_threshold | drop requests from handlers that allow throttling if there's more pending requests than allowed by this value | 100
78/// connection.keepalive_timeout | timeout in seconds to drop connection if there's not data received from it | 600
79/// shards | how many concurrent tasks harvest data from a single socket; do not set if not sure what it is doing | -
80///
81/// @see @ref scripts/docs/en/userver/http_server.md
82
83// clang-format on
84
85class Server final : public LoggableComponentBase {
86 public:
87 /// @ingroup userver_component_names
88 /// @brief The default name of components::Server component
89 static constexpr std::string_view kName = "server";
90
91 Server(const components::ComponentConfig& component_config,
92 const components::ComponentContext& component_context);
93
94 ~Server() override;
95
96 void OnAllComponentsLoaded() override;
97
98 void OnAllComponentsAreStopping() override;
99
100 const server::Server& GetServer() const;
101
102 server::Server& GetServer();
103
104 void AddHandler(const server::handlers::HttpHandlerBase& handler,
105 engine::TaskProcessor& task_processor);
106
107 static yaml_config::Schema GetStaticConfigSchema();
108
109 private:
110 void WriteStatistics(utils::statistics::Writer& writer);
111
112 std::unique_ptr<server::Server> server_;
113 utils::statistics::Entry server_statistics_holder_;
114 utils::statistics::Entry handler_statistics_holder_;
115};
116
117template <>
118inline constexpr bool kHasValidate<Server> = true;
119
120} // namespace components
121
122USERVER_NAMESPACE_END