userver: userver/server/middlewares/http_middleware_base.hpp Source File
Loading...
Searching...
No Matches
http_middleware_base.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/server/middlewares/http_middleware_base.hpp
4/// @brief Base classes for implementing custom middlewares
5
6#include <memory>
7
8#include <userver/components/component_base.hpp>
9#include <userver/server/http/http_request.hpp>
10#include <userver/yaml_config/schema.hpp>
11#include <userver/yaml_config/yaml_config.hpp>
12
13USERVER_NAMESPACE_BEGIN
14
15namespace server {
16
17namespace request {
18class RequestContext;
19}
20
21namespace handlers {
22class HttpHandlerBase;
23}
24
25/// HTTP server middlewares
26namespace middlewares {
27
28/// @ingroup userver_middlewares userver_base_classes
29///
30/// @brief Base class for a http middleware
32public:
33 HttpMiddlewareBase();
34 virtual ~HttpMiddlewareBase();
35
36protected:
37 /// @brief Override this method to implement a middleware logic
38 virtual void HandleRequest(http::HttpRequest& request, request::RequestContext& context) const = 0;
39
40 /// @brief The method to invoke the next middleware in a pipeline
41 void Next(http::HttpRequest& request, request::RequestContext& context) const;
42
43private:
44 friend class handlers::HttpHandlerBase;
45
46 std::unique_ptr<HttpMiddlewareBase> next_{nullptr};
47};
48
49/// @ingroup userver_middlewares userver_base_classes
50///
51/// @brief Base class for a http middleware-factory
53public:
54 HttpMiddlewareFactoryBase(const components::ComponentConfig&, const components::ComponentContext&);
55
56 std::unique_ptr<HttpMiddlewareBase> CreateChecked(
57 const handlers::HttpHandlerBase& handler,
58 yaml_config::YamlConfig middleware_config
59 ) const;
60
61protected:
62 /// @brief This method should return the schema of a middleware configuration,
63 /// if any. You may override it
64 virtual yaml_config::Schema GetMiddlewareConfigSchema() const { return yaml_config::Schema::EmptyObject(); }
65
66 /// @brief Override this method to create an instance of a middleware
67 virtual std::unique_ptr<HttpMiddlewareBase> Create(
68 const handlers::HttpHandlerBase&,
69 yaml_config::YamlConfig middleware_config
70 ) const = 0;
71};
72
73/// @ingroup userver_middlewares
74///
75/// @brief A short-cut for defining a middleware-factory
76template <typename Middleware>
77class SimpleHttpMiddlewareFactory final : public HttpMiddlewareFactoryBase {
78public:
79 static constexpr std::string_view kName = Middleware::kName;
80
81 using HttpMiddlewareFactoryBase::HttpMiddlewareFactoryBase;
82
83private:
84 std::unique_ptr<HttpMiddlewareBase> Create(const handlers::HttpHandlerBase& handler, yaml_config::YamlConfig)
85 const override {
86 return std::make_unique<Middleware>(handler);
87 }
88};
89
90} // namespace middlewares
91} // namespace server
92
93template <typename Middleware>
94inline constexpr bool components::kHasValidate<server::middlewares::SimpleHttpMiddlewareFactory<Middleware>> = true;
95
96template <typename Middleware>
97inline constexpr auto components::kConfigFileMode<
98 server::middlewares::SimpleHttpMiddlewareFactory<Middleware>> = ConfigFileMode::kNotRequired;
99
100USERVER_NAMESPACE_END