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