|
|
|
@ -60,10 +60,13 @@ class RpcMethodHandler : public MethodHandler { |
|
|
|
|
|
|
|
|
|
void RunHandler(const HandlerParameter& param) final { |
|
|
|
|
ResponseType rsp; |
|
|
|
|
if (status_.ok()) { |
|
|
|
|
status_ = CatchingFunctionHandler([this, ¶m, &rsp] { |
|
|
|
|
return func_(service_, param.server_context, &this->req_, &rsp); |
|
|
|
|
Status status = param.status; |
|
|
|
|
if (status.ok()) { |
|
|
|
|
status = CatchingFunctionHandler([this, ¶m, &rsp] { |
|
|
|
|
return func_(service_, param.server_context, |
|
|
|
|
static_cast<RequestType*>(param.request), &rsp); |
|
|
|
|
}); |
|
|
|
|
delete static_cast<RequestType*>(param.request); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
GPR_CODEGEN_ASSERT(!param.server_context->sent_initial_metadata_); |
|
|
|
@ -75,22 +78,24 @@ class RpcMethodHandler : public MethodHandler { |
|
|
|
|
if (param.server_context->compression_level_set()) { |
|
|
|
|
ops.set_compression_level(param.server_context->compression_level()); |
|
|
|
|
} |
|
|
|
|
if (status_.ok()) { |
|
|
|
|
status_ = ops.SendMessage(rsp); |
|
|
|
|
if (status.ok()) { |
|
|
|
|
status = ops.SendMessage(rsp); |
|
|
|
|
} |
|
|
|
|
ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status_); |
|
|
|
|
ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); |
|
|
|
|
param.call->PerformOps(&ops); |
|
|
|
|
param.call->cq()->Pluck(&ops); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void* Deserialize(grpc_byte_buffer* req) final { |
|
|
|
|
void* Deserialize(grpc_byte_buffer* req, Status* status) final { |
|
|
|
|
ByteBuffer buf; |
|
|
|
|
buf.set_buffer(req); |
|
|
|
|
status_ = SerializationTraits<RequestType>::Deserialize(&buf, &req_); |
|
|
|
|
auto* request = new RequestType(); |
|
|
|
|
*status = SerializationTraits<RequestType>::Deserialize(&buf, request); |
|
|
|
|
buf.Release(); |
|
|
|
|
if (status_.ok()) { |
|
|
|
|
return &req_; |
|
|
|
|
if (status->ok()) { |
|
|
|
|
return request; |
|
|
|
|
} |
|
|
|
|
delete request; |
|
|
|
|
return nullptr; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -101,8 +106,6 @@ class RpcMethodHandler : public MethodHandler { |
|
|
|
|
func_; |
|
|
|
|
// The class the above handler function lives in.
|
|
|
|
|
ServiceType* service_; |
|
|
|
|
RequestType req_; |
|
|
|
|
Status status_; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/// A wrapper class of an application provided client streaming handler.
|
|
|
|
@ -160,11 +163,14 @@ class ServerStreamingHandler : public MethodHandler { |
|
|
|
|
: func_(func), service_(service) {} |
|
|
|
|
|
|
|
|
|
void RunHandler(const HandlerParameter& param) final { |
|
|
|
|
if (status_.ok()) { |
|
|
|
|
Status status = param.status; |
|
|
|
|
if (status.ok()) { |
|
|
|
|
ServerWriter<ResponseType> writer(param.call, param.server_context); |
|
|
|
|
status_ = CatchingFunctionHandler([this, ¶m, &writer] { |
|
|
|
|
return func_(service_, param.server_context, &this->req_, &writer); |
|
|
|
|
status = CatchingFunctionHandler([this, ¶m, &writer] { |
|
|
|
|
return func_(service_, param.server_context, |
|
|
|
|
static_cast<RequestType*>(param.request), &writer); |
|
|
|
|
}); |
|
|
|
|
delete static_cast<RequestType*>(param.request); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> ops; |
|
|
|
@ -175,7 +181,7 @@ class ServerStreamingHandler : public MethodHandler { |
|
|
|
|
ops.set_compression_level(param.server_context->compression_level()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status_); |
|
|
|
|
ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); |
|
|
|
|
param.call->PerformOps(&ops); |
|
|
|
|
if (param.server_context->has_pending_ops_) { |
|
|
|
|
param.call->cq()->Pluck(¶m.server_context->pending_ops_); |
|
|
|
@ -183,14 +189,16 @@ class ServerStreamingHandler : public MethodHandler { |
|
|
|
|
param.call->cq()->Pluck(&ops); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void* Deserialize(grpc_byte_buffer* req) final { |
|
|
|
|
void* Deserialize(grpc_byte_buffer* req, Status* status) final { |
|
|
|
|
ByteBuffer buf; |
|
|
|
|
buf.set_buffer(req); |
|
|
|
|
status_ = SerializationTraits<RequestType>::Deserialize(&buf, &req_); |
|
|
|
|
auto* request = new RequestType(); |
|
|
|
|
*status = SerializationTraits<RequestType>::Deserialize(&buf, request); |
|
|
|
|
buf.Release(); |
|
|
|
|
if (status_.ok()) { |
|
|
|
|
return &req_; |
|
|
|
|
if (status->ok()) { |
|
|
|
|
return request; |
|
|
|
|
} |
|
|
|
|
delete request; |
|
|
|
|
return nullptr; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -199,8 +207,6 @@ class ServerStreamingHandler : public MethodHandler { |
|
|
|
|
ServerWriter<ResponseType>*)> |
|
|
|
|
func_; |
|
|
|
|
ServiceType* service_; |
|
|
|
|
RequestType req_; |
|
|
|
|
Status status_; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/// A wrapper class of an application provided bidi-streaming handler.
|
|
|
|
@ -317,7 +323,7 @@ class ErrorMethodHandler : public MethodHandler { |
|
|
|
|
param.call->cq()->Pluck(&ops); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void* Deserialize(grpc_byte_buffer* req) final { |
|
|
|
|
void* Deserialize(grpc_byte_buffer* req, Status* status) final { |
|
|
|
|
// We have to destroy any request payload
|
|
|
|
|
if (req != nullptr) { |
|
|
|
|
g_core_codegen_interface->grpc_byte_buffer_destroy(req); |
|
|
|
|