xref: /aosp_15_r20/external/grpc-grpc/spm-cpp-include/grpcpp/server_context.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker //
5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker //
11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker //
17*cc02d7e2SAndroid Build Coastguard Worker //
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker #ifndef GRPCPP_SERVER_CONTEXT_H
20*cc02d7e2SAndroid Build Coastguard Worker #define GRPCPP_SERVER_CONTEXT_H
21*cc02d7e2SAndroid Build Coastguard Worker 
22*cc02d7e2SAndroid Build Coastguard Worker #include <atomic>
23*cc02d7e2SAndroid Build Coastguard Worker #include <cassert>
24*cc02d7e2SAndroid Build Coastguard Worker #include <map>
25*cc02d7e2SAndroid Build Coastguard Worker #include <memory>
26*cc02d7e2SAndroid Build Coastguard Worker #include <type_traits>
27*cc02d7e2SAndroid Build Coastguard Worker #include <vector>
28*cc02d7e2SAndroid Build Coastguard Worker 
29*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/grpc.h>
30*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/impl/call.h>
31*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/impl/compression_types.h>
32*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/port_platform.h>
33*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/call.h>
34*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/call_op_set.h>
35*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/codegen/create_auth_context.h>
36*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/codegen/metadata_map.h>
37*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/completion_queue_tag.h>
38*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/metadata_map.h>
39*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/rpc_service_method.h>
40*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/security/auth_context.h>
41*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/callback_common.h>
42*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/config.h>
43*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/message_allocator.h>
44*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/server_callback.h>
45*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/server_interceptor.h>
46*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/status.h>
47*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/string_ref.h>
48*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/time.h>
49*cc02d7e2SAndroid Build Coastguard Worker 
50*cc02d7e2SAndroid Build Coastguard Worker struct grpc_metadata;
51*cc02d7e2SAndroid Build Coastguard Worker struct grpc_call;
52*cc02d7e2SAndroid Build Coastguard Worker struct census_context;
53*cc02d7e2SAndroid Build Coastguard Worker 
54*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
55*cc02d7e2SAndroid Build Coastguard Worker template <class W, class R>
56*cc02d7e2SAndroid Build Coastguard Worker class ServerAsyncReader;
57*cc02d7e2SAndroid Build Coastguard Worker template <class W>
58*cc02d7e2SAndroid Build Coastguard Worker class ServerAsyncWriter;
59*cc02d7e2SAndroid Build Coastguard Worker template <class W>
60*cc02d7e2SAndroid Build Coastguard Worker class ServerAsyncResponseWriter;
61*cc02d7e2SAndroid Build Coastguard Worker template <class W, class R>
62*cc02d7e2SAndroid Build Coastguard Worker class ServerAsyncReaderWriter;
63*cc02d7e2SAndroid Build Coastguard Worker template <class R>
64*cc02d7e2SAndroid Build Coastguard Worker class ServerReader;
65*cc02d7e2SAndroid Build Coastguard Worker template <class W>
66*cc02d7e2SAndroid Build Coastguard Worker class ServerWriter;
67*cc02d7e2SAndroid Build Coastguard Worker 
68*cc02d7e2SAndroid Build Coastguard Worker namespace internal {
69*cc02d7e2SAndroid Build Coastguard Worker template <class ServiceType, class RequestType, class ResponseType>
70*cc02d7e2SAndroid Build Coastguard Worker class BidiStreamingHandler;
71*cc02d7e2SAndroid Build Coastguard Worker template <class RequestType, class ResponseType>
72*cc02d7e2SAndroid Build Coastguard Worker class CallbackUnaryHandler;
73*cc02d7e2SAndroid Build Coastguard Worker template <class RequestType, class ResponseType>
74*cc02d7e2SAndroid Build Coastguard Worker class CallbackClientStreamingHandler;
75*cc02d7e2SAndroid Build Coastguard Worker template <class RequestType, class ResponseType>
76*cc02d7e2SAndroid Build Coastguard Worker class CallbackServerStreamingHandler;
77*cc02d7e2SAndroid Build Coastguard Worker template <class RequestType, class ResponseType>
78*cc02d7e2SAndroid Build Coastguard Worker class CallbackBidiHandler;
79*cc02d7e2SAndroid Build Coastguard Worker template <class ServiceType, class RequestType, class ResponseType>
80*cc02d7e2SAndroid Build Coastguard Worker class ClientStreamingHandler;
81*cc02d7e2SAndroid Build Coastguard Worker template <class ResponseType>
82*cc02d7e2SAndroid Build Coastguard Worker void UnaryRunHandlerHelper(const MethodHandler::HandlerParameter&,
83*cc02d7e2SAndroid Build Coastguard Worker                            ResponseType*, Status&);
84*cc02d7e2SAndroid Build Coastguard Worker template <class ServiceType, class RequestType, class ResponseType,
85*cc02d7e2SAndroid Build Coastguard Worker           class BaseRequestType, class BaseResponseType>
86*cc02d7e2SAndroid Build Coastguard Worker class RpcMethodHandler;
87*cc02d7e2SAndroid Build Coastguard Worker template <class Base>
88*cc02d7e2SAndroid Build Coastguard Worker class FinishOnlyReactor;
89*cc02d7e2SAndroid Build Coastguard Worker template <class W, class R>
90*cc02d7e2SAndroid Build Coastguard Worker class ServerReaderWriterBody;
91*cc02d7e2SAndroid Build Coastguard Worker template <class ServiceType, class RequestType, class ResponseType>
92*cc02d7e2SAndroid Build Coastguard Worker class ServerStreamingHandler;
93*cc02d7e2SAndroid Build Coastguard Worker class ServerReactor;
94*cc02d7e2SAndroid Build Coastguard Worker template <class Streamer, bool WriteNeeded>
95*cc02d7e2SAndroid Build Coastguard Worker class TemplatedBidiStreamingHandler;
96*cc02d7e2SAndroid Build Coastguard Worker template <grpc::StatusCode code>
97*cc02d7e2SAndroid Build Coastguard Worker class ErrorMethodHandler;
98*cc02d7e2SAndroid Build Coastguard Worker }  // namespace internal
99*cc02d7e2SAndroid Build Coastguard Worker 
100*cc02d7e2SAndroid Build Coastguard Worker class ClientContext;
101*cc02d7e2SAndroid Build Coastguard Worker class CompletionQueue;
102*cc02d7e2SAndroid Build Coastguard Worker class GenericServerContext;
103*cc02d7e2SAndroid Build Coastguard Worker class Server;
104*cc02d7e2SAndroid Build Coastguard Worker class ServerInterface;
105*cc02d7e2SAndroid Build Coastguard Worker class ContextAllocator;
106*cc02d7e2SAndroid Build Coastguard Worker class GenericCallbackServerContext;
107*cc02d7e2SAndroid Build Coastguard Worker 
108*cc02d7e2SAndroid Build Coastguard Worker namespace internal {
109*cc02d7e2SAndroid Build Coastguard Worker class Call;
110*cc02d7e2SAndroid Build Coastguard Worker }  // namespace internal
111*cc02d7e2SAndroid Build Coastguard Worker 
112*cc02d7e2SAndroid Build Coastguard Worker namespace testing {
113*cc02d7e2SAndroid Build Coastguard Worker class InteropServerContextInspector;
114*cc02d7e2SAndroid Build Coastguard Worker class ServerContextTestSpouse;
115*cc02d7e2SAndroid Build Coastguard Worker class DefaultReactorTestPeer;
116*cc02d7e2SAndroid Build Coastguard Worker }  // namespace testing
117*cc02d7e2SAndroid Build Coastguard Worker 
118*cc02d7e2SAndroid Build Coastguard Worker namespace experimental {
119*cc02d7e2SAndroid Build Coastguard Worker class CallMetricRecorder;
120*cc02d7e2SAndroid Build Coastguard Worker class ServerMetricRecorder;
121*cc02d7e2SAndroid Build Coastguard Worker }  // namespace experimental
122*cc02d7e2SAndroid Build Coastguard Worker 
123*cc02d7e2SAndroid Build Coastguard Worker /// Base class of ServerContext.
124*cc02d7e2SAndroid Build Coastguard Worker class ServerContextBase {
125*cc02d7e2SAndroid Build Coastguard Worker  public:
126*cc02d7e2SAndroid Build Coastguard Worker   virtual ~ServerContextBase();
127*cc02d7e2SAndroid Build Coastguard Worker 
128*cc02d7e2SAndroid Build Coastguard Worker   /// Return the deadline for the server call.
deadline()129*cc02d7e2SAndroid Build Coastguard Worker   std::chrono::system_clock::time_point deadline() const {
130*cc02d7e2SAndroid Build Coastguard Worker     return grpc::Timespec2Timepoint(deadline_);
131*cc02d7e2SAndroid Build Coastguard Worker   }
132*cc02d7e2SAndroid Build Coastguard Worker 
133*cc02d7e2SAndroid Build Coastguard Worker   /// Return a \a gpr_timespec representation of the server call's deadline.
raw_deadline()134*cc02d7e2SAndroid Build Coastguard Worker   gpr_timespec raw_deadline() const { return deadline_; }
135*cc02d7e2SAndroid Build Coastguard Worker 
136*cc02d7e2SAndroid Build Coastguard Worker   /// Add the (\a key, \a value) pair to the initial metadata
137*cc02d7e2SAndroid Build Coastguard Worker   /// associated with a server call. These are made available at the client side
138*cc02d7e2SAndroid Build Coastguard Worker   /// by the \a grpc::ClientContext::GetServerInitialMetadata() method.
139*cc02d7e2SAndroid Build Coastguard Worker   ///
140*cc02d7e2SAndroid Build Coastguard Worker   /// \warning This method should only be called before sending initial metadata
141*cc02d7e2SAndroid Build Coastguard Worker   /// to the client (which can happen explicitly, or implicitly when sending a
142*cc02d7e2SAndroid Build Coastguard Worker   /// a response message or status to the client).
143*cc02d7e2SAndroid Build Coastguard Worker   ///
144*cc02d7e2SAndroid Build Coastguard Worker   /// \param key The metadata key. If \a value is binary data, it must
145*cc02d7e2SAndroid Build Coastguard Worker   /// end in "-bin".
146*cc02d7e2SAndroid Build Coastguard Worker   /// \param value The metadata value. If its value is binary, the key name
147*cc02d7e2SAndroid Build Coastguard Worker   /// must end in "-bin".
148*cc02d7e2SAndroid Build Coastguard Worker   ///
149*cc02d7e2SAndroid Build Coastguard Worker   /// Metadata must conform to the following format:
150*cc02d7e2SAndroid Build Coastguard Worker   ///
151*cc02d7e2SAndroid Build Coastguard Worker   ///\verbatim
152*cc02d7e2SAndroid Build Coastguard Worker   /// Custom-Metadata -> Binary-Header / ASCII-Header
153*cc02d7e2SAndroid Build Coastguard Worker   /// Binary-Header -> {Header-Name "-bin" } {binary value}
154*cc02d7e2SAndroid Build Coastguard Worker   /// ASCII-Header -> Header-Name ASCII-Value
155*cc02d7e2SAndroid Build Coastguard Worker   /// Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - .
156*cc02d7e2SAndroid Build Coastguard Worker   /// ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII
157*cc02d7e2SAndroid Build Coastguard Worker   ///\endverbatim
158*cc02d7e2SAndroid Build Coastguard Worker   ///
159*cc02d7e2SAndroid Build Coastguard Worker   void AddInitialMetadata(const std::string& key, const std::string& value);
160*cc02d7e2SAndroid Build Coastguard Worker 
161*cc02d7e2SAndroid Build Coastguard Worker   /// Add the (\a key, \a value) pair to the initial metadata
162*cc02d7e2SAndroid Build Coastguard Worker   /// associated with a server call. These are made available at the client
163*cc02d7e2SAndroid Build Coastguard Worker   /// side by the \a grpc::ClientContext::GetServerTrailingMetadata() method.
164*cc02d7e2SAndroid Build Coastguard Worker   ///
165*cc02d7e2SAndroid Build Coastguard Worker   /// \warning This method should only be called before sending trailing
166*cc02d7e2SAndroid Build Coastguard Worker   /// metadata to the client (which happens when the call is finished and a
167*cc02d7e2SAndroid Build Coastguard Worker   /// status is sent to the client).
168*cc02d7e2SAndroid Build Coastguard Worker   ///
169*cc02d7e2SAndroid Build Coastguard Worker   /// \param key The metadata key. If \a value is binary data,
170*cc02d7e2SAndroid Build Coastguard Worker   /// it must end in "-bin".
171*cc02d7e2SAndroid Build Coastguard Worker   /// \param value The metadata value. If its value is binary, the key name
172*cc02d7e2SAndroid Build Coastguard Worker   /// must end in "-bin".
173*cc02d7e2SAndroid Build Coastguard Worker   ///
174*cc02d7e2SAndroid Build Coastguard Worker   /// Metadata must conform to the following format:
175*cc02d7e2SAndroid Build Coastguard Worker   ///
176*cc02d7e2SAndroid Build Coastguard Worker   ///\verbatim
177*cc02d7e2SAndroid Build Coastguard Worker   /// Custom-Metadata -> Binary-Header / ASCII-Header
178*cc02d7e2SAndroid Build Coastguard Worker   /// Binary-Header -> {Header-Name "-bin" } {binary value}
179*cc02d7e2SAndroid Build Coastguard Worker   /// ASCII-Header -> Header-Name ASCII-Value
180*cc02d7e2SAndroid Build Coastguard Worker   /// Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - .
181*cc02d7e2SAndroid Build Coastguard Worker   /// ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII
182*cc02d7e2SAndroid Build Coastguard Worker   ///\endverbatim
183*cc02d7e2SAndroid Build Coastguard Worker   ///
184*cc02d7e2SAndroid Build Coastguard Worker   void AddTrailingMetadata(const std::string& key, const std::string& value);
185*cc02d7e2SAndroid Build Coastguard Worker 
186*cc02d7e2SAndroid Build Coastguard Worker   /// Return whether this RPC failed before the server could provide its status
187*cc02d7e2SAndroid Build Coastguard Worker   /// back to the client. This could be because of explicit API cancellation
188*cc02d7e2SAndroid Build Coastguard Worker   /// from the client-side or server-side, because of deadline exceeded, network
189*cc02d7e2SAndroid Build Coastguard Worker   /// connection reset, HTTP/2 parameter configuration (e.g., max message size,
190*cc02d7e2SAndroid Build Coastguard Worker   /// max connection age), etc. It does NOT include failure due to a non-OK
191*cc02d7e2SAndroid Build Coastguard Worker   /// status return from the server application's request handler, including
192*cc02d7e2SAndroid Build Coastguard Worker   /// Status::CANCELLED.
193*cc02d7e2SAndroid Build Coastguard Worker   ///
194*cc02d7e2SAndroid Build Coastguard Worker   /// IsCancelled is always safe to call when using sync or callback API.
195*cc02d7e2SAndroid Build Coastguard Worker   /// When using async API, it is only safe to call IsCancelled after
196*cc02d7e2SAndroid Build Coastguard Worker   /// the AsyncNotifyWhenDone tag has been delivered. Thread-safe.
197*cc02d7e2SAndroid Build Coastguard Worker   bool IsCancelled() const;
198*cc02d7e2SAndroid Build Coastguard Worker 
199*cc02d7e2SAndroid Build Coastguard Worker   /// Cancel the Call from the server. This is a best-effort API and
200*cc02d7e2SAndroid Build Coastguard Worker   /// depending on when it is called, the RPC may still appear successful to
201*cc02d7e2SAndroid Build Coastguard Worker   /// the client. For example, if TryCancel() is called on a separate thread, it
202*cc02d7e2SAndroid Build Coastguard Worker   /// might race with the server handler which might return success to the
203*cc02d7e2SAndroid Build Coastguard Worker   /// client before TryCancel() was even started by the thread.
204*cc02d7e2SAndroid Build Coastguard Worker   ///
205*cc02d7e2SAndroid Build Coastguard Worker   /// It is the caller's responsibility to prevent such races and ensure that if
206*cc02d7e2SAndroid Build Coastguard Worker   /// TryCancel() is called, the serverhandler must return Status::CANCELLED.
207*cc02d7e2SAndroid Build Coastguard Worker   /// The only exception is that if the serverhandler is already returning an
208*cc02d7e2SAndroid Build Coastguard Worker   /// error status code, it is ok to not return Status::CANCELLED even if
209*cc02d7e2SAndroid Build Coastguard Worker   /// TryCancel() was called. Additionally, it is illegal to invoke TryCancel()
210*cc02d7e2SAndroid Build Coastguard Worker   /// before the call has actually begun, i.e., before metadata has been
211*cc02d7e2SAndroid Build Coastguard Worker   /// received from the client.
212*cc02d7e2SAndroid Build Coastguard Worker   ///
213*cc02d7e2SAndroid Build Coastguard Worker   /// For reasons such as the above, it is generally preferred to explicitly
214*cc02d7e2SAndroid Build Coastguard Worker   /// finish an RPC by returning Status::CANCELLED rather than using TryCancel.
215*cc02d7e2SAndroid Build Coastguard Worker   ///
216*cc02d7e2SAndroid Build Coastguard Worker   /// Note that TryCancel() does not change any of the tags that are pending
217*cc02d7e2SAndroid Build Coastguard Worker   /// on the completion queue. All pending tags will still be delivered
218*cc02d7e2SAndroid Build Coastguard Worker   /// (though their ok result may reflect the effect of cancellation).
219*cc02d7e2SAndroid Build Coastguard Worker   void TryCancel() const;
220*cc02d7e2SAndroid Build Coastguard Worker 
221*cc02d7e2SAndroid Build Coastguard Worker   /// Return a collection of initial metadata key-value pairs sent from the
222*cc02d7e2SAndroid Build Coastguard Worker   /// client. Note that keys may happen more than
223*cc02d7e2SAndroid Build Coastguard Worker   /// once (ie, a \a std::multimap is returned).
224*cc02d7e2SAndroid Build Coastguard Worker   ///
225*cc02d7e2SAndroid Build Coastguard Worker   /// It is safe to use this method after initial metadata has been received,
226*cc02d7e2SAndroid Build Coastguard Worker   /// Calls always begin with the client sending initial metadata, so this is
227*cc02d7e2SAndroid Build Coastguard Worker   /// safe to access as soon as the call has begun on the server side.
228*cc02d7e2SAndroid Build Coastguard Worker   ///
229*cc02d7e2SAndroid Build Coastguard Worker   /// \return A multimap of initial metadata key-value pairs from the server.
client_metadata()230*cc02d7e2SAndroid Build Coastguard Worker   const std::multimap<grpc::string_ref, grpc::string_ref>& client_metadata()
231*cc02d7e2SAndroid Build Coastguard Worker       const {
232*cc02d7e2SAndroid Build Coastguard Worker     return *client_metadata_.map();
233*cc02d7e2SAndroid Build Coastguard Worker   }
234*cc02d7e2SAndroid Build Coastguard Worker 
235*cc02d7e2SAndroid Build Coastguard Worker   /// Return the compression algorithm to be used by the server call.
compression_level()236*cc02d7e2SAndroid Build Coastguard Worker   grpc_compression_level compression_level() const {
237*cc02d7e2SAndroid Build Coastguard Worker     return compression_level_;
238*cc02d7e2SAndroid Build Coastguard Worker   }
239*cc02d7e2SAndroid Build Coastguard Worker 
240*cc02d7e2SAndroid Build Coastguard Worker   /// Set \a level to be the compression level used for the server call.
241*cc02d7e2SAndroid Build Coastguard Worker   ///
242*cc02d7e2SAndroid Build Coastguard Worker   /// \param level The compression level used for the server call.
set_compression_level(grpc_compression_level level)243*cc02d7e2SAndroid Build Coastguard Worker   void set_compression_level(grpc_compression_level level) {
244*cc02d7e2SAndroid Build Coastguard Worker     compression_level_set_ = true;
245*cc02d7e2SAndroid Build Coastguard Worker     compression_level_ = level;
246*cc02d7e2SAndroid Build Coastguard Worker   }
247*cc02d7e2SAndroid Build Coastguard Worker 
248*cc02d7e2SAndroid Build Coastguard Worker   /// Return a bool indicating whether the compression level for this call
249*cc02d7e2SAndroid Build Coastguard Worker   /// has been set (either implicitly or through a previous call to
250*cc02d7e2SAndroid Build Coastguard Worker   /// \a set_compression_level.
compression_level_set()251*cc02d7e2SAndroid Build Coastguard Worker   bool compression_level_set() const { return compression_level_set_; }
252*cc02d7e2SAndroid Build Coastguard Worker 
253*cc02d7e2SAndroid Build Coastguard Worker   /// Return the compression algorithm the server call will request be used.
254*cc02d7e2SAndroid Build Coastguard Worker   /// Note that the gRPC runtime may decide to ignore this request, for example,
255*cc02d7e2SAndroid Build Coastguard Worker   /// due to resource constraints, or if the server is aware the client doesn't
256*cc02d7e2SAndroid Build Coastguard Worker   /// support the requested algorithm.
compression_algorithm()257*cc02d7e2SAndroid Build Coastguard Worker   grpc_compression_algorithm compression_algorithm() const {
258*cc02d7e2SAndroid Build Coastguard Worker     return compression_algorithm_;
259*cc02d7e2SAndroid Build Coastguard Worker   }
260*cc02d7e2SAndroid Build Coastguard Worker   /// Set \a algorithm to be the compression algorithm used for the server call.
261*cc02d7e2SAndroid Build Coastguard Worker   ///
262*cc02d7e2SAndroid Build Coastguard Worker   /// \param algorithm The compression algorithm used for the server call.
263*cc02d7e2SAndroid Build Coastguard Worker   void set_compression_algorithm(grpc_compression_algorithm algorithm);
264*cc02d7e2SAndroid Build Coastguard Worker 
265*cc02d7e2SAndroid Build Coastguard Worker   /// Set the serialized load reporting costs in \a cost_data for the call.
266*cc02d7e2SAndroid Build Coastguard Worker   void SetLoadReportingCosts(const std::vector<std::string>& cost_data);
267*cc02d7e2SAndroid Build Coastguard Worker 
268*cc02d7e2SAndroid Build Coastguard Worker   /// Return the authentication context for this server call.
269*cc02d7e2SAndroid Build Coastguard Worker   ///
270*cc02d7e2SAndroid Build Coastguard Worker   /// \see grpc::AuthContext.
auth_context()271*cc02d7e2SAndroid Build Coastguard Worker   std::shared_ptr<const grpc::AuthContext> auth_context() const {
272*cc02d7e2SAndroid Build Coastguard Worker     if (auth_context_ == nullptr) {
273*cc02d7e2SAndroid Build Coastguard Worker       auth_context_ = grpc::CreateAuthContext(call_.call);
274*cc02d7e2SAndroid Build Coastguard Worker     }
275*cc02d7e2SAndroid Build Coastguard Worker     return auth_context_;
276*cc02d7e2SAndroid Build Coastguard Worker   }
277*cc02d7e2SAndroid Build Coastguard Worker 
278*cc02d7e2SAndroid Build Coastguard Worker   /// Return the peer uri in a string.
279*cc02d7e2SAndroid Build Coastguard Worker   /// WARNING: this value is never authenticated or subject to any security
280*cc02d7e2SAndroid Build Coastguard Worker   /// related code. It must not be used for any authentication related
281*cc02d7e2SAndroid Build Coastguard Worker   /// functionality. Instead, use auth_context.
282*cc02d7e2SAndroid Build Coastguard Worker   std::string peer() const;
283*cc02d7e2SAndroid Build Coastguard Worker 
284*cc02d7e2SAndroid Build Coastguard Worker   /// Get the census context associated with this server call.
285*cc02d7e2SAndroid Build Coastguard Worker   const struct census_context* census_context() const;
286*cc02d7e2SAndroid Build Coastguard Worker 
287*cc02d7e2SAndroid Build Coastguard Worker   /// Should be used for framework-level extensions only.
288*cc02d7e2SAndroid Build Coastguard Worker   /// Applications never need to call this method.
c_call()289*cc02d7e2SAndroid Build Coastguard Worker   grpc_call* c_call() { return call_.call; }
290*cc02d7e2SAndroid Build Coastguard Worker 
291*cc02d7e2SAndroid Build Coastguard Worker   /// Get the \a CallMetricRecorder object for the current RPC.
292*cc02d7e2SAndroid Build Coastguard Worker   /// Use it to record metrics during your RPC to send back to the
293*cc02d7e2SAndroid Build Coastguard Worker   /// client in order to make load balancing decisions. This will
294*cc02d7e2SAndroid Build Coastguard Worker   /// return nullptr if the feature hasn't been enabled using
295*cc02d7e2SAndroid Build Coastguard Worker   /// \a EnableCallMetricRecording.
ExperimentalGetCallMetricRecorder()296*cc02d7e2SAndroid Build Coastguard Worker   experimental::CallMetricRecorder* ExperimentalGetCallMetricRecorder() {
297*cc02d7e2SAndroid Build Coastguard Worker     return call_metric_recorder_;
298*cc02d7e2SAndroid Build Coastguard Worker   }
299*cc02d7e2SAndroid Build Coastguard Worker 
300*cc02d7e2SAndroid Build Coastguard Worker   /// EXPERIMENTAL API
301*cc02d7e2SAndroid Build Coastguard Worker   /// Returns the call's authority.
302*cc02d7e2SAndroid Build Coastguard Worker   grpc::string_ref ExperimentalGetAuthority() const;
303*cc02d7e2SAndroid Build Coastguard Worker 
304*cc02d7e2SAndroid Build Coastguard Worker  protected:
305*cc02d7e2SAndroid Build Coastguard Worker   /// Async only. Has to be called before the rpc starts.
306*cc02d7e2SAndroid Build Coastguard Worker   /// Returns the tag in completion queue when the rpc finishes.
307*cc02d7e2SAndroid Build Coastguard Worker   /// IsCancelled() can then be called to check whether the rpc was cancelled.
308*cc02d7e2SAndroid Build Coastguard Worker   /// Note: the tag will only be returned if call starts.
309*cc02d7e2SAndroid Build Coastguard Worker   /// If the call never starts, this tag will not be returned.
AsyncNotifyWhenDone(void * tag)310*cc02d7e2SAndroid Build Coastguard Worker   void AsyncNotifyWhenDone(void* tag) {
311*cc02d7e2SAndroid Build Coastguard Worker     has_notify_when_done_tag_ = true;
312*cc02d7e2SAndroid Build Coastguard Worker     async_notify_when_done_tag_ = tag;
313*cc02d7e2SAndroid Build Coastguard Worker   }
314*cc02d7e2SAndroid Build Coastguard Worker 
315*cc02d7e2SAndroid Build Coastguard Worker   /// NOTE: This is an API for advanced users who need custom allocators.
316*cc02d7e2SAndroid Build Coastguard Worker   /// Get and maybe mutate the allocator state associated with the current RPC.
317*cc02d7e2SAndroid Build Coastguard Worker   /// Currently only applicable for callback unary RPC methods.
GetRpcAllocatorState()318*cc02d7e2SAndroid Build Coastguard Worker   RpcAllocatorState* GetRpcAllocatorState() { return message_allocator_state_; }
319*cc02d7e2SAndroid Build Coastguard Worker 
320*cc02d7e2SAndroid Build Coastguard Worker   /// Get a library-owned default unary reactor for use in minimal reaction
321*cc02d7e2SAndroid Build Coastguard Worker   /// cases. This supports typical unary RPC usage of providing a response and
322*cc02d7e2SAndroid Build Coastguard Worker   /// status. It supports immediate Finish (finish from within the method
323*cc02d7e2SAndroid Build Coastguard Worker   /// handler) or delayed Finish (finish called after the method handler
324*cc02d7e2SAndroid Build Coastguard Worker   /// invocation). It does not support reacting to cancellation or completion,
325*cc02d7e2SAndroid Build Coastguard Worker   /// or early sending of initial metadata. Since this is a library-owned
326*cc02d7e2SAndroid Build Coastguard Worker   /// reactor, it should not be delete'd or freed in any way. This is more
327*cc02d7e2SAndroid Build Coastguard Worker   /// efficient than creating a user-owned reactor both because of avoiding an
328*cc02d7e2SAndroid Build Coastguard Worker   /// allocation and because its minimal reactions are optimized using a core
329*cc02d7e2SAndroid Build Coastguard Worker   /// surface flag that allows their reactions to run inline without any
330*cc02d7e2SAndroid Build Coastguard Worker   /// thread-hop.
331*cc02d7e2SAndroid Build Coastguard Worker   ///
332*cc02d7e2SAndroid Build Coastguard Worker   /// This method should not be called more than once or called after return
333*cc02d7e2SAndroid Build Coastguard Worker   /// from the method handler.
DefaultReactor()334*cc02d7e2SAndroid Build Coastguard Worker   grpc::ServerUnaryReactor* DefaultReactor() {
335*cc02d7e2SAndroid Build Coastguard Worker     // Short-circuit the case where a default reactor was already set up by
336*cc02d7e2SAndroid Build Coastguard Worker     // the TestPeer.
337*cc02d7e2SAndroid Build Coastguard Worker     if (test_unary_ != nullptr) {
338*cc02d7e2SAndroid Build Coastguard Worker       return reinterpret_cast<Reactor*>(&default_reactor_);
339*cc02d7e2SAndroid Build Coastguard Worker     }
340*cc02d7e2SAndroid Build Coastguard Worker     new (&default_reactor_) Reactor;
341*cc02d7e2SAndroid Build Coastguard Worker #ifndef NDEBUG
342*cc02d7e2SAndroid Build Coastguard Worker     bool old = false;
343*cc02d7e2SAndroid Build Coastguard Worker     assert(default_reactor_used_.compare_exchange_strong(
344*cc02d7e2SAndroid Build Coastguard Worker         old, true, std::memory_order_relaxed));
345*cc02d7e2SAndroid Build Coastguard Worker #else
346*cc02d7e2SAndroid Build Coastguard Worker     default_reactor_used_.store(true, std::memory_order_relaxed);
347*cc02d7e2SAndroid Build Coastguard Worker #endif
348*cc02d7e2SAndroid Build Coastguard Worker     return reinterpret_cast<Reactor*>(&default_reactor_);
349*cc02d7e2SAndroid Build Coastguard Worker   }
350*cc02d7e2SAndroid Build Coastguard Worker 
351*cc02d7e2SAndroid Build Coastguard Worker   /// Constructors for use by derived classes
352*cc02d7e2SAndroid Build Coastguard Worker   ServerContextBase();
353*cc02d7e2SAndroid Build Coastguard Worker   ServerContextBase(gpr_timespec deadline, grpc_metadata_array* arr);
354*cc02d7e2SAndroid Build Coastguard Worker 
set_context_allocator(ContextAllocator * context_allocator)355*cc02d7e2SAndroid Build Coastguard Worker   void set_context_allocator(ContextAllocator* context_allocator) {
356*cc02d7e2SAndroid Build Coastguard Worker     context_allocator_ = context_allocator;
357*cc02d7e2SAndroid Build Coastguard Worker   }
358*cc02d7e2SAndroid Build Coastguard Worker 
context_allocator()359*cc02d7e2SAndroid Build Coastguard Worker   ContextAllocator* context_allocator() const { return context_allocator_; }
360*cc02d7e2SAndroid Build Coastguard Worker 
361*cc02d7e2SAndroid Build Coastguard Worker  private:
362*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::testing::InteropServerContextInspector;
363*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::testing::ServerContextTestSpouse;
364*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::testing::DefaultReactorTestPeer;
365*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::ServerInterface;
366*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::Server;
367*cc02d7e2SAndroid Build Coastguard Worker   template <class W, class R>
368*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::ServerAsyncReader;
369*cc02d7e2SAndroid Build Coastguard Worker   template <class W>
370*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::ServerAsyncWriter;
371*cc02d7e2SAndroid Build Coastguard Worker   template <class W>
372*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::ServerAsyncResponseWriter;
373*cc02d7e2SAndroid Build Coastguard Worker   template <class W, class R>
374*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::ServerAsyncReaderWriter;
375*cc02d7e2SAndroid Build Coastguard Worker   template <class R>
376*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::ServerReader;
377*cc02d7e2SAndroid Build Coastguard Worker   template <class W>
378*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::ServerWriter;
379*cc02d7e2SAndroid Build Coastguard Worker   template <class W, class R>
380*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::internal::ServerReaderWriterBody;
381*cc02d7e2SAndroid Build Coastguard Worker   template <class ResponseType>
382*cc02d7e2SAndroid Build Coastguard Worker   friend void grpc::internal::UnaryRunHandlerHelper(
383*cc02d7e2SAndroid Build Coastguard Worker       const internal::MethodHandler::HandlerParameter& param, ResponseType* rsp,
384*cc02d7e2SAndroid Build Coastguard Worker       Status& status);
385*cc02d7e2SAndroid Build Coastguard Worker   template <class ServiceType, class RequestType, class ResponseType,
386*cc02d7e2SAndroid Build Coastguard Worker             class BaseRequestType, class BaseResponseType>
387*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::internal::RpcMethodHandler;
388*cc02d7e2SAndroid Build Coastguard Worker   template <class ServiceType, class RequestType, class ResponseType>
389*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::internal::ClientStreamingHandler;
390*cc02d7e2SAndroid Build Coastguard Worker   template <class ServiceType, class RequestType, class ResponseType>
391*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::internal::ServerStreamingHandler;
392*cc02d7e2SAndroid Build Coastguard Worker   template <class Streamer, bool WriteNeeded>
393*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::internal::TemplatedBidiStreamingHandler;
394*cc02d7e2SAndroid Build Coastguard Worker   template <class RequestType, class ResponseType>
395*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::internal::CallbackUnaryHandler;
396*cc02d7e2SAndroid Build Coastguard Worker   template <class RequestType, class ResponseType>
397*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::internal::CallbackClientStreamingHandler;
398*cc02d7e2SAndroid Build Coastguard Worker   template <class RequestType, class ResponseType>
399*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::internal::CallbackServerStreamingHandler;
400*cc02d7e2SAndroid Build Coastguard Worker   template <class RequestType, class ResponseType>
401*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::internal::CallbackBidiHandler;
402*cc02d7e2SAndroid Build Coastguard Worker   template <grpc::StatusCode code>
403*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::internal::ErrorMethodHandler;
404*cc02d7e2SAndroid Build Coastguard Worker   template <class Base>
405*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::internal::FinishOnlyReactor;
406*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::ClientContext;
407*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::GenericServerContext;
408*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::GenericCallbackServerContext;
409*cc02d7e2SAndroid Build Coastguard Worker 
410*cc02d7e2SAndroid Build Coastguard Worker   /// Prevent copying.
411*cc02d7e2SAndroid Build Coastguard Worker   ServerContextBase(const ServerContextBase&);
412*cc02d7e2SAndroid Build Coastguard Worker   ServerContextBase& operator=(const ServerContextBase&);
413*cc02d7e2SAndroid Build Coastguard Worker 
414*cc02d7e2SAndroid Build Coastguard Worker   class CompletionOp;
415*cc02d7e2SAndroid Build Coastguard Worker 
416*cc02d7e2SAndroid Build Coastguard Worker   void BeginCompletionOp(
417*cc02d7e2SAndroid Build Coastguard Worker       grpc::internal::Call* call, std::function<void(bool)> callback,
418*cc02d7e2SAndroid Build Coastguard Worker       grpc::internal::ServerCallbackCall* callback_controller);
419*cc02d7e2SAndroid Build Coastguard Worker   /// Return the tag queued by BeginCompletionOp()
420*cc02d7e2SAndroid Build Coastguard Worker   grpc::internal::CompletionQueueTag* GetCompletionOpTag();
421*cc02d7e2SAndroid Build Coastguard Worker 
set_call(grpc_call * call,bool call_metric_recording_enabled,experimental::ServerMetricRecorder * server_metric_recorder)422*cc02d7e2SAndroid Build Coastguard Worker   void set_call(grpc_call* call, bool call_metric_recording_enabled,
423*cc02d7e2SAndroid Build Coastguard Worker                 experimental::ServerMetricRecorder* server_metric_recorder) {
424*cc02d7e2SAndroid Build Coastguard Worker     call_.call = call;
425*cc02d7e2SAndroid Build Coastguard Worker     if (call_metric_recording_enabled) {
426*cc02d7e2SAndroid Build Coastguard Worker       CreateCallMetricRecorder(server_metric_recorder);
427*cc02d7e2SAndroid Build Coastguard Worker     }
428*cc02d7e2SAndroid Build Coastguard Worker   }
429*cc02d7e2SAndroid Build Coastguard Worker 
430*cc02d7e2SAndroid Build Coastguard Worker   void BindDeadlineAndMetadata(gpr_timespec deadline, grpc_metadata_array* arr);
431*cc02d7e2SAndroid Build Coastguard Worker 
initial_metadata_flags()432*cc02d7e2SAndroid Build Coastguard Worker   uint32_t initial_metadata_flags() const { return 0; }
433*cc02d7e2SAndroid Build Coastguard Worker 
set_server_rpc_info(const char * method,grpc::internal::RpcMethod::RpcType type,const std::vector<std::unique_ptr<grpc::experimental::ServerInterceptorFactoryInterface>> & creators)434*cc02d7e2SAndroid Build Coastguard Worker   grpc::experimental::ServerRpcInfo* set_server_rpc_info(
435*cc02d7e2SAndroid Build Coastguard Worker       const char* method, grpc::internal::RpcMethod::RpcType type,
436*cc02d7e2SAndroid Build Coastguard Worker       const std::vector<std::unique_ptr<
437*cc02d7e2SAndroid Build Coastguard Worker           grpc::experimental::ServerInterceptorFactoryInterface>>& creators) {
438*cc02d7e2SAndroid Build Coastguard Worker     if (!creators.empty()) {
439*cc02d7e2SAndroid Build Coastguard Worker       rpc_info_ = new grpc::experimental::ServerRpcInfo(this, method, type);
440*cc02d7e2SAndroid Build Coastguard Worker       rpc_info_->RegisterInterceptors(creators);
441*cc02d7e2SAndroid Build Coastguard Worker     }
442*cc02d7e2SAndroid Build Coastguard Worker     return rpc_info_;
443*cc02d7e2SAndroid Build Coastguard Worker   }
444*cc02d7e2SAndroid Build Coastguard Worker 
set_message_allocator_state(RpcAllocatorState * allocator_state)445*cc02d7e2SAndroid Build Coastguard Worker   void set_message_allocator_state(RpcAllocatorState* allocator_state) {
446*cc02d7e2SAndroid Build Coastguard Worker     message_allocator_state_ = allocator_state;
447*cc02d7e2SAndroid Build Coastguard Worker   }
448*cc02d7e2SAndroid Build Coastguard Worker 
MaybeMarkCancelledOnRead()449*cc02d7e2SAndroid Build Coastguard Worker   void MaybeMarkCancelledOnRead() {
450*cc02d7e2SAndroid Build Coastguard Worker     if (grpc_call_failed_before_recv_message(call_.call)) {
451*cc02d7e2SAndroid Build Coastguard Worker       marked_cancelled_.store(true, std::memory_order_release);
452*cc02d7e2SAndroid Build Coastguard Worker     }
453*cc02d7e2SAndroid Build Coastguard Worker   }
454*cc02d7e2SAndroid Build Coastguard Worker 
455*cc02d7e2SAndroid Build Coastguard Worker   // This should be called only once and only when call metric recording is
456*cc02d7e2SAndroid Build Coastguard Worker   // enabled.
457*cc02d7e2SAndroid Build Coastguard Worker   void CreateCallMetricRecorder(
458*cc02d7e2SAndroid Build Coastguard Worker       experimental::ServerMetricRecorder* server_metric_recorder = nullptr);
459*cc02d7e2SAndroid Build Coastguard Worker 
460*cc02d7e2SAndroid Build Coastguard Worker   struct CallWrapper {
461*cc02d7e2SAndroid Build Coastguard Worker     ~CallWrapper();
462*cc02d7e2SAndroid Build Coastguard Worker 
463*cc02d7e2SAndroid Build Coastguard Worker     grpc_call* call = nullptr;
464*cc02d7e2SAndroid Build Coastguard Worker   };
465*cc02d7e2SAndroid Build Coastguard Worker 
466*cc02d7e2SAndroid Build Coastguard Worker   // NOTE: call_ must be the first data member of this object so that its
467*cc02d7e2SAndroid Build Coastguard Worker   //       destructor is the last to be called, since its destructor may unref
468*cc02d7e2SAndroid Build Coastguard Worker   //       the underlying core call which holds the arena that may be used to
469*cc02d7e2SAndroid Build Coastguard Worker   //       hold this object.
470*cc02d7e2SAndroid Build Coastguard Worker   CallWrapper call_;
471*cc02d7e2SAndroid Build Coastguard Worker 
472*cc02d7e2SAndroid Build Coastguard Worker   CompletionOp* completion_op_ = nullptr;
473*cc02d7e2SAndroid Build Coastguard Worker   bool has_notify_when_done_tag_ = false;
474*cc02d7e2SAndroid Build Coastguard Worker   void* async_notify_when_done_tag_ = nullptr;
475*cc02d7e2SAndroid Build Coastguard Worker   grpc::internal::CallbackWithSuccessTag completion_tag_;
476*cc02d7e2SAndroid Build Coastguard Worker 
477*cc02d7e2SAndroid Build Coastguard Worker   gpr_timespec deadline_;
478*cc02d7e2SAndroid Build Coastguard Worker   grpc::CompletionQueue* cq_ = nullptr;
479*cc02d7e2SAndroid Build Coastguard Worker   bool sent_initial_metadata_ = false;
480*cc02d7e2SAndroid Build Coastguard Worker   mutable std::shared_ptr<const grpc::AuthContext> auth_context_;
481*cc02d7e2SAndroid Build Coastguard Worker   mutable grpc::internal::MetadataMap client_metadata_;
482*cc02d7e2SAndroid Build Coastguard Worker   std::multimap<std::string, std::string> initial_metadata_;
483*cc02d7e2SAndroid Build Coastguard Worker   std::multimap<std::string, std::string> trailing_metadata_;
484*cc02d7e2SAndroid Build Coastguard Worker 
485*cc02d7e2SAndroid Build Coastguard Worker   bool compression_level_set_ = false;
486*cc02d7e2SAndroid Build Coastguard Worker   grpc_compression_level compression_level_;
487*cc02d7e2SAndroid Build Coastguard Worker   grpc_compression_algorithm compression_algorithm_;
488*cc02d7e2SAndroid Build Coastguard Worker 
489*cc02d7e2SAndroid Build Coastguard Worker   grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata,
490*cc02d7e2SAndroid Build Coastguard Worker                             grpc::internal::CallOpSendMessage>
491*cc02d7e2SAndroid Build Coastguard Worker       pending_ops_;
492*cc02d7e2SAndroid Build Coastguard Worker   bool has_pending_ops_ = false;
493*cc02d7e2SAndroid Build Coastguard Worker 
494*cc02d7e2SAndroid Build Coastguard Worker   grpc::experimental::ServerRpcInfo* rpc_info_ = nullptr;
495*cc02d7e2SAndroid Build Coastguard Worker   RpcAllocatorState* message_allocator_state_ = nullptr;
496*cc02d7e2SAndroid Build Coastguard Worker   ContextAllocator* context_allocator_ = nullptr;
497*cc02d7e2SAndroid Build Coastguard Worker   experimental::CallMetricRecorder* call_metric_recorder_ = nullptr;
498*cc02d7e2SAndroid Build Coastguard Worker 
499*cc02d7e2SAndroid Build Coastguard Worker   class Reactor : public grpc::ServerUnaryReactor {
500*cc02d7e2SAndroid Build Coastguard Worker    public:
OnCancel()501*cc02d7e2SAndroid Build Coastguard Worker     void OnCancel() override {}
OnDone()502*cc02d7e2SAndroid Build Coastguard Worker     void OnDone() override {}
503*cc02d7e2SAndroid Build Coastguard Worker     // Override InternalInlineable for this class since its reactions are
504*cc02d7e2SAndroid Build Coastguard Worker     // trivial and thus do not need to be run from the executor (triggering a
505*cc02d7e2SAndroid Build Coastguard Worker     // thread hop). This should only be used by internal reactors (thus the
506*cc02d7e2SAndroid Build Coastguard Worker     // name) and not by user application code.
InternalInlineable()507*cc02d7e2SAndroid Build Coastguard Worker     bool InternalInlineable() override { return true; }
508*cc02d7e2SAndroid Build Coastguard Worker   };
509*cc02d7e2SAndroid Build Coastguard Worker 
SetupTestDefaultReactor(std::function<void (grpc::Status)> func)510*cc02d7e2SAndroid Build Coastguard Worker   void SetupTestDefaultReactor(std::function<void(grpc::Status)> func) {
511*cc02d7e2SAndroid Build Coastguard Worker     // NOLINTNEXTLINE(modernize-make-unique)
512*cc02d7e2SAndroid Build Coastguard Worker     test_unary_.reset(new TestServerCallbackUnary(this, std::move(func)));
513*cc02d7e2SAndroid Build Coastguard Worker   }
test_status_set()514*cc02d7e2SAndroid Build Coastguard Worker   bool test_status_set() const {
515*cc02d7e2SAndroid Build Coastguard Worker     return (test_unary_ != nullptr) && test_unary_->status_set();
516*cc02d7e2SAndroid Build Coastguard Worker   }
test_status()517*cc02d7e2SAndroid Build Coastguard Worker   grpc::Status test_status() const { return test_unary_->status(); }
518*cc02d7e2SAndroid Build Coastguard Worker 
519*cc02d7e2SAndroid Build Coastguard Worker   class TestServerCallbackUnary : public grpc::ServerCallbackUnary {
520*cc02d7e2SAndroid Build Coastguard Worker    public:
TestServerCallbackUnary(ServerContextBase * ctx,std::function<void (grpc::Status)> func)521*cc02d7e2SAndroid Build Coastguard Worker     TestServerCallbackUnary(ServerContextBase* ctx,
522*cc02d7e2SAndroid Build Coastguard Worker                             std::function<void(grpc::Status)> func)
523*cc02d7e2SAndroid Build Coastguard Worker         : reactor_(ctx->DefaultReactor()),
524*cc02d7e2SAndroid Build Coastguard Worker           func_(std::move(func)),
525*cc02d7e2SAndroid Build Coastguard Worker           call_(ctx->c_call()) {
526*cc02d7e2SAndroid Build Coastguard Worker       this->BindReactor(reactor_);
527*cc02d7e2SAndroid Build Coastguard Worker     }
Finish(grpc::Status s)528*cc02d7e2SAndroid Build Coastguard Worker     void Finish(grpc::Status s) override {
529*cc02d7e2SAndroid Build Coastguard Worker       status_ = s;
530*cc02d7e2SAndroid Build Coastguard Worker       func_(std::move(s));
531*cc02d7e2SAndroid Build Coastguard Worker       status_set_.store(true, std::memory_order_release);
532*cc02d7e2SAndroid Build Coastguard Worker     }
SendInitialMetadata()533*cc02d7e2SAndroid Build Coastguard Worker     void SendInitialMetadata() override {}
534*cc02d7e2SAndroid Build Coastguard Worker 
status_set()535*cc02d7e2SAndroid Build Coastguard Worker     bool status_set() const {
536*cc02d7e2SAndroid Build Coastguard Worker       return status_set_.load(std::memory_order_acquire);
537*cc02d7e2SAndroid Build Coastguard Worker     }
status()538*cc02d7e2SAndroid Build Coastguard Worker     grpc::Status status() const { return status_; }
539*cc02d7e2SAndroid Build Coastguard Worker 
540*cc02d7e2SAndroid Build Coastguard Worker    private:
CallOnDone()541*cc02d7e2SAndroid Build Coastguard Worker     void CallOnDone() override {}
542*cc02d7e2SAndroid Build Coastguard Worker 
call()543*cc02d7e2SAndroid Build Coastguard Worker     grpc_call* call() override { return call_; }
544*cc02d7e2SAndroid Build Coastguard Worker 
reactor()545*cc02d7e2SAndroid Build Coastguard Worker     grpc::internal::ServerReactor* reactor() override { return reactor_; }
546*cc02d7e2SAndroid Build Coastguard Worker 
547*cc02d7e2SAndroid Build Coastguard Worker     grpc::ServerUnaryReactor* const reactor_;
548*cc02d7e2SAndroid Build Coastguard Worker     std::atomic_bool status_set_{false};
549*cc02d7e2SAndroid Build Coastguard Worker     grpc::Status status_;
550*cc02d7e2SAndroid Build Coastguard Worker     const std::function<void(grpc::Status s)> func_;
551*cc02d7e2SAndroid Build Coastguard Worker     grpc_call* call_;
552*cc02d7e2SAndroid Build Coastguard Worker   };
553*cc02d7e2SAndroid Build Coastguard Worker 
554*cc02d7e2SAndroid Build Coastguard Worker   alignas(Reactor) char default_reactor_[sizeof(Reactor)];
555*cc02d7e2SAndroid Build Coastguard Worker   std::atomic_bool default_reactor_used_{false};
556*cc02d7e2SAndroid Build Coastguard Worker 
557*cc02d7e2SAndroid Build Coastguard Worker   std::atomic_bool marked_cancelled_{false};
558*cc02d7e2SAndroid Build Coastguard Worker 
559*cc02d7e2SAndroid Build Coastguard Worker   std::unique_ptr<TestServerCallbackUnary> test_unary_;
560*cc02d7e2SAndroid Build Coastguard Worker };
561*cc02d7e2SAndroid Build Coastguard Worker 
562*cc02d7e2SAndroid Build Coastguard Worker /// A ServerContext or CallbackServerContext allows the code implementing a
563*cc02d7e2SAndroid Build Coastguard Worker /// service handler to:
564*cc02d7e2SAndroid Build Coastguard Worker ///
565*cc02d7e2SAndroid Build Coastguard Worker /// - Add custom initial and trailing metadata key-value pairs that will
566*cc02d7e2SAndroid Build Coastguard Worker ///   propagated to the client side.
567*cc02d7e2SAndroid Build Coastguard Worker /// - Control call settings such as compression and authentication.
568*cc02d7e2SAndroid Build Coastguard Worker /// - Access metadata coming from the client.
569*cc02d7e2SAndroid Build Coastguard Worker /// - Get performance metrics (ie, census).
570*cc02d7e2SAndroid Build Coastguard Worker ///
571*cc02d7e2SAndroid Build Coastguard Worker /// Context settings are only relevant to the call handler they are supplied to,
572*cc02d7e2SAndroid Build Coastguard Worker /// that is to say, they aren't sticky across multiple calls. Some of these
573*cc02d7e2SAndroid Build Coastguard Worker /// settings, such as the compression options, can be made persistent at server
574*cc02d7e2SAndroid Build Coastguard Worker /// construction time by specifying the appropriate \a ChannelArguments
575*cc02d7e2SAndroid Build Coastguard Worker /// to a \a grpc::ServerBuilder, via \a ServerBuilder::AddChannelArgument.
576*cc02d7e2SAndroid Build Coastguard Worker ///
577*cc02d7e2SAndroid Build Coastguard Worker /// \warning ServerContext instances should \em not be reused across rpcs.
578*cc02d7e2SAndroid Build Coastguard Worker class ServerContext : public ServerContextBase {
579*cc02d7e2SAndroid Build Coastguard Worker  public:
ServerContext()580*cc02d7e2SAndroid Build Coastguard Worker   ServerContext() {}  // for async calls
581*cc02d7e2SAndroid Build Coastguard Worker 
582*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::AddInitialMetadata;
583*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::AddTrailingMetadata;
584*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::auth_context;
585*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::c_call;
586*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::census_context;
587*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::client_metadata;
588*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::compression_algorithm;
589*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::compression_level;
590*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::compression_level_set;
591*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::deadline;
592*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::IsCancelled;
593*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::peer;
594*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::raw_deadline;
595*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::set_compression_algorithm;
596*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::set_compression_level;
597*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::SetLoadReportingCosts;
598*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::TryCancel;
599*cc02d7e2SAndroid Build Coastguard Worker 
600*cc02d7e2SAndroid Build Coastguard Worker   // Sync/CQ-based Async ServerContext only
601*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::AsyncNotifyWhenDone;
602*cc02d7e2SAndroid Build Coastguard Worker 
603*cc02d7e2SAndroid Build Coastguard Worker  private:
604*cc02d7e2SAndroid Build Coastguard Worker   // Constructor for internal use by server only
605*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::Server;
ServerContext(gpr_timespec deadline,grpc_metadata_array * arr)606*cc02d7e2SAndroid Build Coastguard Worker   ServerContext(gpr_timespec deadline, grpc_metadata_array* arr)
607*cc02d7e2SAndroid Build Coastguard Worker       : ServerContextBase(deadline, arr) {}
608*cc02d7e2SAndroid Build Coastguard Worker 
609*cc02d7e2SAndroid Build Coastguard Worker   // CallbackServerContext only
610*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::DefaultReactor;
611*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::GetRpcAllocatorState;
612*cc02d7e2SAndroid Build Coastguard Worker 
613*cc02d7e2SAndroid Build Coastguard Worker   /// Prevent copying.
614*cc02d7e2SAndroid Build Coastguard Worker   ServerContext(const ServerContext&) = delete;
615*cc02d7e2SAndroid Build Coastguard Worker   ServerContext& operator=(const ServerContext&) = delete;
616*cc02d7e2SAndroid Build Coastguard Worker };
617*cc02d7e2SAndroid Build Coastguard Worker 
618*cc02d7e2SAndroid Build Coastguard Worker class CallbackServerContext : public ServerContextBase {
619*cc02d7e2SAndroid Build Coastguard Worker  public:
620*cc02d7e2SAndroid Build Coastguard Worker   /// Public constructors are for direct use only by mocking tests. In practice,
621*cc02d7e2SAndroid Build Coastguard Worker   /// these objects will be owned by the library.
CallbackServerContext()622*cc02d7e2SAndroid Build Coastguard Worker   CallbackServerContext() {}
623*cc02d7e2SAndroid Build Coastguard Worker 
624*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::AddInitialMetadata;
625*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::AddTrailingMetadata;
626*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::auth_context;
627*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::c_call;
628*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::census_context;
629*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::client_metadata;
630*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::compression_algorithm;
631*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::compression_level;
632*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::compression_level_set;
633*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::context_allocator;
634*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::deadline;
635*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::IsCancelled;
636*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::peer;
637*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::raw_deadline;
638*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::set_compression_algorithm;
639*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::set_compression_level;
640*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::set_context_allocator;
641*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::SetLoadReportingCosts;
642*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::TryCancel;
643*cc02d7e2SAndroid Build Coastguard Worker 
644*cc02d7e2SAndroid Build Coastguard Worker   // CallbackServerContext only
645*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::DefaultReactor;
646*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::GetRpcAllocatorState;
647*cc02d7e2SAndroid Build Coastguard Worker 
648*cc02d7e2SAndroid Build Coastguard Worker  private:
649*cc02d7e2SAndroid Build Coastguard Worker   // Sync/CQ-based Async ServerContext only
650*cc02d7e2SAndroid Build Coastguard Worker   using ServerContextBase::AsyncNotifyWhenDone;
651*cc02d7e2SAndroid Build Coastguard Worker 
652*cc02d7e2SAndroid Build Coastguard Worker   /// Prevent copying.
653*cc02d7e2SAndroid Build Coastguard Worker   CallbackServerContext(const CallbackServerContext&) = delete;
654*cc02d7e2SAndroid Build Coastguard Worker   CallbackServerContext& operator=(const CallbackServerContext&) = delete;
655*cc02d7e2SAndroid Build Coastguard Worker };
656*cc02d7e2SAndroid Build Coastguard Worker 
657*cc02d7e2SAndroid Build Coastguard Worker /// A CallbackServerContext allows users to use the contents of the
658*cc02d7e2SAndroid Build Coastguard Worker /// CallbackServerContext or GenericCallbackServerContext structure for the
659*cc02d7e2SAndroid Build Coastguard Worker /// callback API.
660*cc02d7e2SAndroid Build Coastguard Worker /// The library will invoke the allocator any time a new call is initiated.
661*cc02d7e2SAndroid Build Coastguard Worker /// and call the Release method after the server OnDone.
662*cc02d7e2SAndroid Build Coastguard Worker class ContextAllocator {
663*cc02d7e2SAndroid Build Coastguard Worker  public:
~ContextAllocator()664*cc02d7e2SAndroid Build Coastguard Worker   virtual ~ContextAllocator() {}
665*cc02d7e2SAndroid Build Coastguard Worker 
NewCallbackServerContext()666*cc02d7e2SAndroid Build Coastguard Worker   virtual CallbackServerContext* NewCallbackServerContext() { return nullptr; }
667*cc02d7e2SAndroid Build Coastguard Worker 
NewGenericCallbackServerContext()668*cc02d7e2SAndroid Build Coastguard Worker   virtual GenericCallbackServerContext* NewGenericCallbackServerContext() {
669*cc02d7e2SAndroid Build Coastguard Worker     return nullptr;
670*cc02d7e2SAndroid Build Coastguard Worker   }
671*cc02d7e2SAndroid Build Coastguard Worker 
Release(CallbackServerContext *)672*cc02d7e2SAndroid Build Coastguard Worker   virtual void Release(CallbackServerContext*) {}
673*cc02d7e2SAndroid Build Coastguard Worker 
Release(GenericCallbackServerContext *)674*cc02d7e2SAndroid Build Coastguard Worker   virtual void Release(GenericCallbackServerContext*) {}
675*cc02d7e2SAndroid Build Coastguard Worker };
676*cc02d7e2SAndroid Build Coastguard Worker 
677*cc02d7e2SAndroid Build Coastguard Worker }  // namespace grpc
678*cc02d7e2SAndroid Build Coastguard Worker 
679*cc02d7e2SAndroid Build Coastguard Worker static_assert(
680*cc02d7e2SAndroid Build Coastguard Worker     std::is_base_of<grpc::ServerContextBase, grpc::ServerContext>::value,
681*cc02d7e2SAndroid Build Coastguard Worker     "improper base class");
682*cc02d7e2SAndroid Build Coastguard Worker static_assert(std::is_base_of<grpc::ServerContextBase,
683*cc02d7e2SAndroid Build Coastguard Worker                               grpc::CallbackServerContext>::value,
684*cc02d7e2SAndroid Build Coastguard Worker               "improper base class");
685*cc02d7e2SAndroid Build Coastguard Worker static_assert(sizeof(grpc::ServerContextBase) == sizeof(grpc::ServerContext),
686*cc02d7e2SAndroid Build Coastguard Worker               "wrong size");
687*cc02d7e2SAndroid Build Coastguard Worker static_assert(sizeof(grpc::ServerContextBase) ==
688*cc02d7e2SAndroid Build Coastguard Worker                   sizeof(grpc::CallbackServerContext),
689*cc02d7e2SAndroid Build Coastguard Worker               "wrong size");
690*cc02d7e2SAndroid Build Coastguard Worker 
691*cc02d7e2SAndroid Build Coastguard Worker #endif  // GRPCPP_SERVER_CONTEXT_H
692