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