userver: userver/ugrpc/server/middlewares/base.hpp Source File
Loading...
Searching...
No Matches
base.hpp
1#pragma once
2
3/// @file userver/ugrpc/server/middlewares/middleware_base.hpp
4/// @brief @copybrief ugrpc::server::MiddlewareBase
5
6#include <memory>
7#include <vector>
8
9#include <userver/components/component_base.hpp>
10#include <userver/utils/function_ref.hpp>
11
12#include <userver/ugrpc/server/middlewares/fwd.hpp>
13#include <userver/ugrpc/server/rpc.hpp>
14
15USERVER_NAMESPACE_BEGIN
16
17namespace ugrpc::server {
18
19/// @brief Context for middleware-specific data during gRPC call
20class MiddlewareCallContext final {
21 public:
22 /// @cond
23 MiddlewareCallContext(const Middlewares& middlewares, CallAnyBase& call,
24 utils::function_ref<void()> user_call,
25 const dynamic_config::Snapshot& config,
26 ::google::protobuf::Message* request);
27 /// @endcond
28
29 /// @brief Call next plugin, or gRPC handler if none
30 void Next();
31
32 /// @brief Get original gRPC Call
33 CallAnyBase& GetCall() const;
34
35 /// @brief Get values extracted from dynamic_config. Snapshot will be
36 /// deleted when the last middleware completes
37 const dynamic_config::Snapshot& GetInitialDynamicConfig() const;
38
39 private:
40 void ClearMiddlewaresResources();
41
42 Middlewares::const_iterator middleware_;
43 Middlewares::const_iterator middleware_end_;
44 utils::function_ref<void()> user_call_;
45
46 CallAnyBase& call_;
47
48 std::optional<dynamic_config::Snapshot> config_;
49 ::google::protobuf::Message* request_;
50 bool is_called_from_handle_{false};
51};
52
53/// @ingroup userver_base_classes
54///
55/// @brief Base class for server gRPC middleware
56class MiddlewareBase {
57 public:
58 MiddlewareBase();
59 MiddlewareBase(const MiddlewareBase&) = delete;
60 MiddlewareBase& operator=(const MiddlewareBase&) = delete;
61 MiddlewareBase& operator=(MiddlewareBase&&) = delete;
62
63 virtual ~MiddlewareBase();
64
65 /// @brief Handles the gRPC request
66 /// @note You should call context.Next() inside, otherwise the call will be
67 /// dropped
68 virtual void Handle(MiddlewareCallContext& context) const = 0;
69
70 /// @brief Request hook. The function is invoked on each request
71 virtual void CallRequestHook(const MiddlewareCallContext& context,
72 google::protobuf::Message& request);
73
74 /// @brief Response hook. The function is invoked on each response
75 virtual void CallResponseHook(const MiddlewareCallContext& context,
76 google::protobuf::Message& response);
77};
78
79/// @ingroup userver_base_classes
80///
81/// @brief Base class for middleware component
83 using components::ComponentBase::ComponentBase;
84
85 public:
86 /// @brief Returns a middleware according to the component's settings
87 virtual std::shared_ptr<MiddlewareBase> GetMiddleware() = 0;
88};
89
90} // namespace ugrpc::server
91
92USERVER_NAMESPACE_END