@@ -22,9 +22,38 @@ class Handler final : public server::handlers::HttpHandlerBase {
2222 }
2323};
2424
25+ // / [Middlewares sample - minimal implementation]
26+ class NoopMiddleware final : public server::middlewares::HttpMiddlewareBase {
27+ private:
28+ void HandleRequest (server::http::HttpRequest& request,
29+ server::request::RequestContext& context) const override {
30+ Next (request, context);
31+ }
32+ };
33+ // / [Middlewares sample - minimal implementation]
34+
35+ // / [Middlewares sample - minimal factory implementation]
36+ class NoopMiddlewareFactory final
37+ : public server::middlewares::HttpMiddlewareFactoryBase {
38+ public:
39+ static constexpr std::string_view kName {" noop-middleware" };
40+
41+ using HttpMiddlewareFactoryBase::HttpMiddlewareFactoryBase;
42+
43+ private:
44+ std::unique_ptr<server::middlewares::HttpMiddlewareBase> Create (
45+ const server::handlers::HttpHandlerBase&,
46+ yaml_config::YamlConfig) const override {
47+ return std::make_unique<NoopMiddleware>();
48+ }
49+ };
50+ // / [Middlewares sample - minimal factory implementation]
51+
52+ // / [Middlewares sample - some middleware implementation]
2553class SomeServerMiddleware final
2654 : public server::middlewares::HttpMiddlewareBase {
2755 public:
56+ // This will be used as a kName for the SimpleHttpMiddlewareFactory
2857 static constexpr std::string_view kName {" server-middleware" };
2958
3059 // Handler isn't interesting to us, but we could use it if needed.
@@ -37,17 +66,19 @@ class SomeServerMiddleware final
3766 server::request::RequestContext& context) const override {
3867 Next (request, context);
3968
40- // In case the header is needed even in a presence of downstream exceptions,
41- // this should be wrapped in a scope guard (utils::ScopeGuard, for example)
4269 request.GetHttpResponse ().SetHeader (kCustomServerHeader , " 1" );
4370 }
4471
4572 static constexpr http::headers::PredefinedHeader kCustomServerHeader {
4673 " X-Some-Server-Header" };
4774};
75+ // / [Middlewares sample - some middleware implementation]
76+ // / [Middlewares sample - some middleware factory implementation]
4877using SomeServerMiddlewareFactory =
4978 server::middlewares::SimpleHttpMiddlewareFactory<SomeServerMiddleware>;
79+ // / [Middlewares sample - some middleware factory implementation]
5080
81+ // / [Middlewares sample - configurable middleware implementation]
5182class SomeHandlerMiddleware final
5283 : public server::middlewares::HttpMiddlewareBase {
5384 public:
@@ -79,7 +110,9 @@ class SomeHandlerMiddleware final
79110
80111 const std::string header_value_;
81112};
113+ // / [Middlewares sample - configurable middleware implementation]
82114
115+ // / [Middlewares sample - configurable middleware factory implementation]
83116class SomeHandlerMiddlewareFactory final
84117 : public server::middlewares::HttpMiddlewareFactoryBase {
85118 public:
@@ -108,22 +141,28 @@ additionalProperties: false
108141 .As <yaml_config::Schema>();
109142 }
110143};
144+ // / [Middlewares sample - configurable middleware factory implementation]
111145
146+ // / [Middlewares sample - custom handler pipeline builder]
112147class CustomHandlerPipelineBuilder final
113148 : public server::middlewares::HandlerPipelineBuilder {
114149 public:
115150 using HandlerPipelineBuilder::HandlerPipelineBuilder;
116151
117152 server::middlewares::MiddlewaresList BuildPipeline (
118- server::middlewares::MiddlewaresList pipeline) const override {
153+ server::middlewares::MiddlewaresList server_middleware_pipeline)
154+ const override {
119155 // We could do any kind of transformation here.
120156 // For the sake of example (and what we assume to be the most common case),
121- // we just add one more middleware to the pipeline.
157+ // we just add some middleware to the pipeline.
158+ auto & pipeline = server_middleware_pipeline;
122159 pipeline.emplace_back (SomeHandlerMiddleware::kName );
160+ pipeline.emplace_back (NoopMiddlewareFactory::kName );
123161
124162 return pipeline;
125163 }
126164};
165+ // / [Middlewares sample - custom handler pipeline builder]
127166
128167} // namespace samples::http_middlewares
129168
@@ -137,6 +176,11 @@ constexpr auto components::kConfigFileMode<
137176 samples::http_middlewares::SomeHandlerMiddlewareFactory> =
138177 components::ConfigFileMode::kNotRequired ;
139178
179+ template <>
180+ constexpr auto components::kConfigFileMode <
181+ samples::http_middlewares::NoopMiddlewareFactory> =
182+ components::ConfigFileMode::kNotRequired ;
183+
140184int main (int argc, char * argv[]) {
141185 const auto component_list =
142186 components::MinimalServerComponentList ()
@@ -147,11 +191,15 @@ int main(int argc, char* argv[]) {
147191 .Append <samples::http_middlewares::Handler>(
148192 " handler-with-another-middleware-configuration" )
149193 // middlewares
194+ // clang-format off
195+ // / [Middlewares sample - custom handler pipeline builder registration]
196+ .Append <samples::http_middlewares::CustomHandlerPipelineBuilder>(
197+ " custom-handler-pipeline-builder" )
198+ // / [Middlewares sample - custom handler pipeline builder registration]
199+ // clang-format on
150200 .Append <samples::http_middlewares::SomeServerMiddlewareFactory>()
151201 .Append <samples::http_middlewares::SomeHandlerMiddlewareFactory>()
152- // configuration
153- .Append <samples::http_middlewares::CustomHandlerPipelineBuilder>(
154- " custom-handler-pipeline-builder" );
202+ .Append <samples::http_middlewares::NoopMiddlewareFactory>();
155203
156204 return utils::DaemonMain (argc, argv, component_list);
157205}
0 commit comments