GRPC C++  1.62.0
server_interceptor.h
Go to the documentation of this file.
1 //
2 //
3 // Copyright 2015 gRPC authors.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 //
18 
19 #ifndef GRPCPP_SUPPORT_SERVER_INTERCEPTOR_H
20 #define GRPCPP_SUPPORT_SERVER_INTERCEPTOR_H
21 
22 #include <atomic>
23 #include <vector>
24 
25 #include <grpc/support/log.h>
26 #include <grpcpp/impl/rpc_method.h>
29 
30 namespace grpc {
31 class ServerContextBase;
32 namespace internal {
33 class InterceptorBatchMethodsImpl;
34 }
35 
36 namespace experimental {
37 class ServerRpcInfo;
38 
39 // A factory interface for creation of server interceptors. A vector of
40 // factories can be provided to ServerBuilder which will be used to create a new
41 // vector of server interceptors per RPC. Server interceptor authors should
42 // create a subclass of ServerInterceptorFactorInterface which creates objects
43 // of their interceptors.
45  public:
47  // Returns a pointer to an Interceptor object on successful creation, nullptr
48  // otherwise. If nullptr is returned, this server interceptor factory is
49  // ignored for the purposes of that RPC.
51 };
52 
58  public:
61 
63 
64  // Delete all copy and move constructors and assignments
65  ServerRpcInfo(const ServerRpcInfo&) = delete;
66  ServerRpcInfo& operator=(const ServerRpcInfo&) = delete;
67  ServerRpcInfo(ServerRpcInfo&&) = delete;
69 
70  // Getter methods
71 
73  const char* method() const { return method_; }
74 
76  Type type() const { return type_; }
77 
80  ServerContextBase* server_context() { return ctx_; }
81 
82  private:
83  static_assert(Type::UNARY ==
85  "violated expectation about Type enum");
86  static_assert(Type::CLIENT_STREAMING ==
88  "violated expectation about Type enum");
89  static_assert(Type::SERVER_STREAMING ==
91  "violated expectation about Type enum");
92  static_assert(Type::BIDI_STREAMING ==
94  "violated expectation about Type enum");
95 
96  ServerRpcInfo(ServerContextBase* ctx, const char* method,
98  : ctx_(ctx), method_(method), type_(static_cast<Type>(type)) {}
99 
100  // Runs interceptor at pos \a pos.
101  void RunInterceptor(
102  experimental::InterceptorBatchMethods* interceptor_methods, size_t pos) {
103  GPR_ASSERT(pos < interceptors_.size());
104  interceptors_[pos]->Intercept(interceptor_methods);
105  }
106 
107  void RegisterInterceptors(
108  const std::vector<
109  std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>&
110  creators) {
111  for (const auto& creator : creators) {
112  auto* interceptor = creator->CreateServerInterceptor(this);
113  if (interceptor != nullptr) {
114  interceptors_.push_back(
115  std::unique_ptr<experimental::Interceptor>(interceptor));
116  }
117  }
118  }
119 
120  void Ref() { ref_.fetch_add(1, std::memory_order_relaxed); }
121  void Unref() {
122  if (GPR_UNLIKELY(ref_.fetch_sub(1, std::memory_order_acq_rel) == 1)) {
123  delete this;
124  }
125  }
126 
127  ServerContextBase* ctx_ = nullptr;
128  const char* method_ = nullptr;
129  const Type type_;
130  std::atomic<intptr_t> ref_{1};
131  std::vector<std::unique_ptr<experimental::Interceptor>> interceptors_;
132 
135 };
136 
137 } // namespace experimental
138 } // namespace grpc
139 
140 #endif // GRPCPP_SUPPORT_SERVER_INTERCEPTOR_H
interceptor.h
grpc::experimental::ServerRpcInfo::Type::BIDI_STREAMING
@ BIDI_STREAMING
grpc::experimental::ServerRpcInfo::Type::SERVER_STREAMING
@ SERVER_STREAMING
grpc
An Alarm posts the user-provided tag to its associated completion queue or invokes the user-provided ...
Definition: alarm.h:33
grpc::experimental::ServerRpcInfo::method
const char * method() const
Return the fully-specified method name.
Definition: server_interceptor.h:73
GPR_ASSERT
#define GPR_ASSERT(x)
abort() the process if x is zero, having written a line to the log.
Definition: log.h:95
grpc::ServerContextBase
Base class of ServerContext.
Definition: server_context.h:124
rpc_method.h
grpc::experimental::ServerRpcInfo::Type::UNARY
@ UNARY
grpc::experimental::ServerRpcInfo::~ServerRpcInfo
~ServerRpcInfo()
Definition: server_interceptor.h:62
grpc::internal::RpcMethod::CLIENT_STREAMING
@ CLIENT_STREAMING
Definition: rpc_method.h:33
GPR_UNLIKELY
#define GPR_UNLIKELY(x)
Definition: port_platform.h:828
grpc::experimental::ServerRpcInfo::Type::CLIENT_STREAMING
@ CLIENT_STREAMING
log.h
grpc::internal::RpcMethod::BIDI_STREAMING
@ BIDI_STREAMING
Definition: rpc_method.h:35
grpc::experimental::ServerRpcInfo::server_context
ServerContextBase * server_context()
Return a pointer to the underlying ServerContext structure associated with the RPC to support feature...
Definition: server_interceptor.h:80
grpc::experimental::ServerRpcInfo::operator=
ServerRpcInfo & operator=(const ServerRpcInfo &)=delete
grpc::internal::RpcMethod::SERVER_STREAMING
@ SERVER_STREAMING
Definition: rpc_method.h:34
grpc::experimental::ServerRpcInfo::ServerRpcInfo
ServerRpcInfo(const ServerRpcInfo &)=delete
grpc::internal::RpcMethod::RpcType
RpcType
Definition: rpc_method.h:31
grpc::internal::RpcMethod::NORMAL_RPC
@ NORMAL_RPC
Definition: rpc_method.h:32
grpc::experimental::ServerRpcInfo
ServerRpcInfo represents the state of a particular RPC as it appears to an interceptor.
Definition: server_interceptor.h:57
grpc::experimental::Interceptor
Interface for an interceptor.
Definition: interceptor.h:218
grpc::experimental::ServerInterceptorFactoryInterface
Definition: server_interceptor.h:44
grpc::experimental::ServerInterceptorFactoryInterface::CreateServerInterceptor
virtual Interceptor * CreateServerInterceptor(ServerRpcInfo *info)=0
grpc::experimental::ServerInterceptorFactoryInterface::~ServerInterceptorFactoryInterface
virtual ~ServerInterceptorFactoryInterface()
Definition: server_interceptor.h:46
grpc::experimental::InterceptorBatchMethods
Class that is passed as an argument to the Intercept method of the application's Interceptor interfac...
Definition: interceptor.h:95
grpc::experimental::ServerRpcInfo::type
Type type() const
Return the type of the RPC (unary or a streaming flavor)
Definition: server_interceptor.h:76
grpc::experimental::ServerRpcInfo::Type
Type
Type categorizes RPCs by unary or streaming type.
Definition: server_interceptor.h:60
grpc::internal::InterceptorBatchMethodsImpl
Definition: interceptor_common.h:36
string_ref.h