userver: userver/server/middlewares/configuration.hpp Source File
Loading...
Searching...
No Matches
configuration.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/server/middlewares/configuration.hpp
4/// @brief Utility functions/classes for middleware pipelines configuration
5
6#include <string>
7#include <vector>
8
9#include <userver/components/component_base.hpp>
10
11USERVER_NAMESPACE_BEGIN
12
13namespace components {
14class ComponentList;
15}
16
17namespace server::middlewares {
18
19/// @ingroup userver_middlewares
20///
21/// @brief Returns a list of middleware-components which userver uses by
22/// default in http server.
23///
24/// The list contains a bunch of middlewares into which most of
25/// http-handler functionality is split (metrics, tracing, deadline-propagation
26/// etc. etc.)
28
29/// @ingroup userver_middlewares
30///
31/// @brief Returns a list of middleware-components required by userver to start
32/// a http server.
33///
34/// Components in this list don't have any useful functionality, they are
35/// just infrastructure.
37
38using MiddlewaresList = std::vector<std::string>;
39
40/// @ingroup userver_middlewares
41///
42/// @brief Returns the default userver-provided middleware pipeline.
43MiddlewaresList DefaultPipeline();
44
45/// @ingroup userver_middlewares
46///
47/// @brief Returns a minimal middleware pipeline sufficient for correct HTTP
48/// handling.
49///
50/// The list keeps only exceptions handling, and omits tracing and
51/// business-logic middlewares such as auth, rate-limit, baggage, decompression
52/// and deadline propagation. Useful for simple handlers (e.g. ping) or
53/// benchmarks.
54MiddlewaresList MinimalPipeline();
55
56/// @ingroup userver_middlewares userver_base_classes
57///
58/// @brief Base class to build a server-wide middleware pipeline.
59/// One may inherit from it and implement any custom logic, if desired.
61public:
62 static constexpr std::string_view kName{"default-server-middleware-pipeline-builder"};
63
64 PipelineBuilder(const components::ComponentConfig&, const components::ComponentContext&);
65
66 /// @brief The method to build a server-wide middleware pipeline,
67 /// one may override it if custom behavior is desired.
68 /// @param userver_middleware_pipeline default userver-provided middleware
69 /// pipeline
70 ///
71 /// @note We recommend against omitting/modifying default userver pipeline,
72 /// but leave a possibility to do so.
73 virtual MiddlewaresList BuildPipeline(MiddlewaresList userver_middleware_pipeline) const {
74 auto& resulting_pipeline = userver_middleware_pipeline;
75 const auto& middlewares_to_append = GetMiddlewaresToAppend();
76
77 resulting_pipeline.insert(resulting_pipeline.end(), middlewares_to_append.begin(), middlewares_to_append.end());
78
79 return resulting_pipeline;
80 }
81
82 static yaml_config::Schema GetStaticConfigSchema();
83
84protected:
85 const MiddlewaresList& GetMiddlewaresToAppend() const;
86
87private:
88 MiddlewaresList middlewares_to_append_;
89};
90
91/// @ingroup userver_middlewares userver_base_classes
92///
93/// @brief Server-wide middleware pipeline builder based on @ref MinimalPipeline.
94///
95/// Set `server.middleware-pipeline-builder` to
96/// `minimal-server-middleware-pipeline-builder` to use it. Same `append` config
97/// as @ref PipelineBuilder is supported.
99public:
100 static constexpr std::string_view kName{"minimal-server-middleware-pipeline-builder"};
101
102 using PipelineBuilder::PipelineBuilder;
103
104 MiddlewaresList BuildPipeline(MiddlewaresList userver_middleware_pipeline) const override;
105
106 static yaml_config::Schema GetStaticConfigSchema();
107};
108
109/// @ingroup userver_middlewares userver_base_classes
110///
111/// @brief Base class to build a per-handler middleware pipeline.
112/// One may inherit from it and implement any custom logic, if desired.
113/// By default the behavior is to use the server-wide pipeline.
115public:
116 static constexpr std::string_view kName{"default-handler-middleware-pipeline-builder"};
117
118 HandlerPipelineBuilder(const components::ComponentConfig&, const components::ComponentContext&);
119
120 /// @brief The method to configure build a per-handler middleware pipeline,
121 /// one may override it if custom behavior is desired.
122 ///
123 /// For example, a ping/ handler doesn't necessary need any business-logic
124 /// related functionality, and could use just MinimalPipeline() for itself.
125 ///
126 /// @param server_middleware_pipeline the server-wide middleware pipeline
127 virtual MiddlewaresList BuildPipeline(MiddlewaresList server_middleware_pipeline) const {
128 return server_middleware_pipeline;
129 }
130};
131
132} // namespace server::middlewares
133
134template <>
135inline constexpr bool components::kHasValidate<server::middlewares::PipelineBuilder> = true;
136
137template <>
138inline constexpr auto components::kConfigFileMode<server::middlewares::PipelineBuilder> = ConfigFileMode::kNotRequired;
139
140template <>
141inline constexpr bool components::kHasValidate<server::middlewares::MinimalPipelineBuilder> = true;
142
143template <>
144inline constexpr auto
145 components::kConfigFileMode<server::middlewares::MinimalPipelineBuilder> = ConfigFileMode::kNotRequired;
146
147template <>
148inline constexpr bool components::kHasValidate<server::middlewares::HandlerPipelineBuilder> = true;
149
150template <>
151inline constexpr auto
152 components::kConfigFileMode<server::middlewares::HandlerPipelineBuilder> = ConfigFileMode::kNotRequired;
153
154USERVER_NAMESPACE_END