GRPC C++  1.30.0
server_interceptor.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2018 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_IMPL_CODEGEN_SERVER_INTERCEPTOR_H
20 #define GRPCPP_IMPL_CODEGEN_SERVER_INTERCEPTOR_H
21 
22 #include <atomic>
23 #include <vector>
24 
28 
29 namespace grpc_impl {
30 class ServerContextBase;
31 } // namespace grpc_impl
32 
33 namespace grpc {
34 
35 namespace internal {
36 class InterceptorBatchMethodsImpl;
37 }
38 
39 namespace experimental {
40 class ServerRpcInfo;
41 
42 // A factory interface for creation of server interceptors. A vector of
43 // factories can be provided to ServerBuilder which will be used to create a new
44 // vector of server interceptors per RPC. Server interceptor authors should
45 // create a subclass of ServerInterceptorFactorInterface which creates objects
46 // of their interceptors.
48  public:
50  // Returns a pointer to an Interceptor object on successful creation, nullptr
51  // otherwise. If nullptr is returned, this server interceptor factory is
52  // ignored for the purposes of that RPC.
54 };
55 
61  public:
64 
66 
67  // Delete all copy and move constructors and assignments
68  ServerRpcInfo(const ServerRpcInfo&) = delete;
69  ServerRpcInfo& operator=(const ServerRpcInfo&) = delete;
70  ServerRpcInfo(ServerRpcInfo&&) = delete;
72 
73  // Getter methods
74 
76  const char* method() const { return method_; }
77 
79  Type type() const { return type_; }
80 
84 
85  private:
86  static_assert(Type::UNARY ==
87  static_cast<Type>(internal::RpcMethod::NORMAL_RPC),
88  "violated expectation about Type enum");
89  static_assert(Type::CLIENT_STREAMING ==
90  static_cast<Type>(internal::RpcMethod::CLIENT_STREAMING),
91  "violated expectation about Type enum");
92  static_assert(Type::SERVER_STREAMING ==
93  static_cast<Type>(internal::RpcMethod::SERVER_STREAMING),
94  "violated expectation about Type enum");
95  static_assert(Type::BIDI_STREAMING ==
96  static_cast<Type>(internal::RpcMethod::BIDI_STREAMING),
97  "violated expectation about Type enum");
98 
101  : ctx_(ctx), method_(method), type_(static_cast<Type>(type)) {}
102 
103  // Runs interceptor at pos \a pos.
104  void RunInterceptor(
105  experimental::InterceptorBatchMethods* interceptor_methods, size_t pos) {
106  GPR_CODEGEN_ASSERT(pos < interceptors_.size());
107  interceptors_[pos]->Intercept(interceptor_methods);
108  }
109 
110  void RegisterInterceptors(
111  const std::vector<
112  std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>&
113  creators) {
114  for (const auto& creator : creators) {
115  auto* interceptor = creator->CreateServerInterceptor(this);
116  if (interceptor != nullptr) {
117  interceptors_.push_back(
118  std::unique_ptr<experimental::Interceptor>(interceptor));
119  }
120  }
121  }
122 
123  void Ref() { ref_.fetch_add(1, std::memory_order_relaxed); }
124  void Unref() {
125  if (GPR_UNLIKELY(ref_.fetch_sub(1, std::memory_order_acq_rel) == 1)) {
126  delete this;
127  }
128  }
129 
130  grpc_impl::ServerContextBase* ctx_ = nullptr;
131  const char* method_ = nullptr;
132  const Type type_;
133  std::atomic<intptr_t> ref_{1};
134  std::vector<std::unique_ptr<experimental::Interceptor>> interceptors_;
135 
138 };
139 
140 } // namespace experimental
141 } // namespace grpc
142 
143 #endif // GRPCPP_IMPL_CODEGEN_SERVER_INTERCEPTOR_H
grpc::experimental::ServerRpcInfo::server_context
grpc_impl::ServerContextBase * server_context()
Return a pointer to the underlying ServerContext structure associated with the RPC to support feature...
Definition: server_interceptor.h:83
grpc::experimental::ServerRpcInfo::Type::BIDI_STREAMING
grpc::experimental::ServerRpcInfo::Type::SERVER_STREAMING
grpc
This header provides an object that reads bytes directly from a grpc::ByteBuffer, via the ZeroCopyInp...
Definition: alarm.h:24
grpc::experimental::ServerRpcInfo::method
const char * method() const
Return the fully-specified method name.
Definition: server_interceptor.h:76
grpc_impl::ServerContextBase
Base class of ServerContext. Experimental until callback API is final.
Definition: server_context_impl.h:123
grpc::experimental::ServerRpcInfo::Type::UNARY
grpc::experimental::ServerRpcInfo::~ServerRpcInfo
~ServerRpcInfo()
Definition: server_interceptor.h:65
grpc::internal::RpcMethod::CLIENT_STREAMING
Definition: rpc_method.h:33
grpc::experimental::ServerRpcInfo::Type::CLIENT_STREAMING
grpc::internal::RpcMethod::BIDI_STREAMING
Definition: rpc_method.h:35
GPR_UNLIKELY
#define GPR_UNLIKELY(x)
Definition: port_platform.h:713
grpc::experimental::ServerRpcInfo::operator=
ServerRpcInfo & operator=(const ServerRpcInfo &)=delete
grpc::internal::RpcMethod::SERVER_STREAMING
Definition: rpc_method.h:34
grpc::experimental::ServerRpcInfo::ServerRpcInfo
ServerRpcInfo(const ServerRpcInfo &)=delete
rpc_method.h
grpc::internal::RpcMethod::RpcType
RpcType
Definition: rpc_method.h:31
grpc::internal::RpcMethod::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:60
grpc::experimental::ServerContextBase
::grpc_impl::ServerContextBase ServerContextBase
Definition: server_context.h:36
grpc::experimental::Interceptor
Interface for an interceptor.
Definition: interceptor.h:217
string_ref.h
grpc::experimental::ServerInterceptorFactoryInterface
Definition: server_interceptor.h:47
grpc::experimental::ServerInterceptorFactoryInterface::CreateServerInterceptor
virtual Interceptor * CreateServerInterceptor(ServerRpcInfo *info)=0
grpc::experimental::ServerInterceptorFactoryInterface::~ServerInterceptorFactoryInterface
virtual ~ServerInterceptorFactoryInterface()
Definition: server_interceptor.h:49
grpc::experimental::InterceptorBatchMethods
Class that is passed as an argument to the Intercept method of the application's Interceptor interfac...
Definition: interceptor.h:93
grpc_impl
An Alarm posts the user-provided tag to its associated completion queue or invokes the user-provided ...
Definition: alarm_impl.h:33
GPR_CODEGEN_ASSERT
#define GPR_CODEGEN_ASSERT(x)
Codegen specific version of GPR_ASSERT.
Definition: core_codegen_interface.h:146
grpc::experimental::ServerRpcInfo::type
Type type() const
Return the type of the RPC (unary or a streaming flavor)
Definition: server_interceptor.h:79
grpc::experimental::ServerRpcInfo::Type
Type
Type categorizes RPCs by unary or streaming type.
Definition: server_interceptor.h:63
grpc::internal::InterceptorBatchMethodsImpl
Definition: interceptor_common.h:36
interceptor.h