Let us clean a few things before getting started

pull/17072/head
Yash Tibrewal 6 years ago
parent d3540ae832
commit 3ece34d45c
  1. 55
      include/grpcpp/impl/codegen/call_op_set.h
  2. 7
      include/grpcpp/impl/codegen/interceptor.h
  3. 59
      include/grpcpp/impl/codegen/interceptor_common.h
  4. 4
      src/cpp/client/client_context.cc

@ -214,11 +214,10 @@ class CallNoOp {
void AddOp(grpc_op* ops, size_t* nops) {} void AddOp(grpc_op* ops, size_t* nops) {}
void FinishOp(bool* status) {} void FinishOp(bool* status) {}
void SetInterceptionHookPoint( void SetInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) {} InterceptorBatchMethodsImpl* interceptor_methods) {}
void SetFinishInterceptionHookPoint( void SetFinishInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) {} InterceptorBatchMethodsImpl* interceptor_methods) {}
void SetHijackingState(InternalInterceptorBatchMethods* interceptor_methods) { void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {}
}
}; };
class CallOpSendInitialMetadata { class CallOpSendInitialMetadata {
@ -265,7 +264,7 @@ class CallOpSendInitialMetadata {
} }
void SetInterceptionHookPoint( void SetInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
if (!send_) return; if (!send_) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA); experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA);
@ -273,9 +272,9 @@ class CallOpSendInitialMetadata {
} }
void SetFinishInterceptionHookPoint( void SetFinishInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) {} InterceptorBatchMethodsImpl* interceptor_methods) {}
void SetHijackingState(InternalInterceptorBatchMethods* interceptor_methods) { void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
hijacked_ = true; hijacked_ = true;
} }
@ -318,7 +317,7 @@ class CallOpSendMessage {
void FinishOp(bool* status) { send_buf_.Clear(); } void FinishOp(bool* status) { send_buf_.Clear(); }
void SetInterceptionHookPoint( void SetInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
if (!send_buf_.Valid()) return; if (!send_buf_.Valid()) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
experimental::InterceptionHookPoints::PRE_SEND_MESSAGE); experimental::InterceptionHookPoints::PRE_SEND_MESSAGE);
@ -326,9 +325,9 @@ class CallOpSendMessage {
} }
void SetFinishInterceptionHookPoint( void SetFinishInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) {} InterceptorBatchMethodsImpl* interceptor_methods) {}
void SetHijackingState(InternalInterceptorBatchMethods* interceptor_methods) { void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
hijacked_ = true; hijacked_ = true;
} }
@ -406,17 +405,17 @@ class CallOpRecvMessage {
} }
void SetInterceptionHookPoint( void SetInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
interceptor_methods->SetRecvMessage(message_); interceptor_methods->SetRecvMessage(message_);
} }
void SetFinishInterceptionHookPoint( void SetFinishInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
if (!got_message) return; if (!got_message) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
experimental::InterceptionHookPoints::POST_RECV_MESSAGE); experimental::InterceptionHookPoints::POST_RECV_MESSAGE);
} }
void SetHijackingState(InternalInterceptorBatchMethods* interceptor_methods) { void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
hijacked_ = true; hijacked_ = true;
if (message_ == nullptr) return; if (message_ == nullptr) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
@ -501,17 +500,17 @@ class CallOpGenericRecvMessage {
} }
void SetInterceptionHookPoint( void SetInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
interceptor_methods->SetRecvMessage(message_); interceptor_methods->SetRecvMessage(message_);
} }
void SetFinishInterceptionHookPoint( void SetFinishInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
if (!got_message) return; if (!got_message) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
experimental::InterceptionHookPoints::POST_RECV_MESSAGE); experimental::InterceptionHookPoints::POST_RECV_MESSAGE);
} }
void SetHijackingState(InternalInterceptorBatchMethods* interceptor_methods) { void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
hijacked_ = true; hijacked_ = true;
if (!deserialize_) return; if (!deserialize_) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
@ -543,16 +542,16 @@ class CallOpClientSendClose {
void FinishOp(bool* status) { send_ = false; } void FinishOp(bool* status) { send_ = false; }
void SetInterceptionHookPoint( void SetInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
if (!send_) return; if (!send_) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
experimental::InterceptionHookPoints::PRE_SEND_CLOSE); experimental::InterceptionHookPoints::PRE_SEND_CLOSE);
} }
void SetFinishInterceptionHookPoint( void SetFinishInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) {} InterceptorBatchMethodsImpl* interceptor_methods) {}
void SetHijackingState(InternalInterceptorBatchMethods* interceptor_methods) { void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
hijacked_ = true; hijacked_ = true;
} }
@ -600,7 +599,7 @@ class CallOpServerSendStatus {
} }
void SetInterceptionHookPoint( void SetInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
if (!send_status_available_) return; if (!send_status_available_) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
experimental::InterceptionHookPoints::PRE_SEND_STATUS); experimental::InterceptionHookPoints::PRE_SEND_STATUS);
@ -610,9 +609,9 @@ class CallOpServerSendStatus {
} }
void SetFinishInterceptionHookPoint( void SetFinishInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) {} InterceptorBatchMethodsImpl* interceptor_methods) {}
void SetHijackingState(InternalInterceptorBatchMethods* interceptor_methods) { void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
hijacked_ = true; hijacked_ = true;
} }
@ -652,19 +651,19 @@ class CallOpRecvInitialMetadata {
} }
void SetInterceptionHookPoint( void SetInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
interceptor_methods->SetRecvInitialMetadata(metadata_map_); interceptor_methods->SetRecvInitialMetadata(metadata_map_);
} }
void SetFinishInterceptionHookPoint( void SetFinishInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
if (metadata_map_ == nullptr) return; if (metadata_map_ == nullptr) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
experimental::InterceptionHookPoints::POST_RECV_INITIAL_METADATA); experimental::InterceptionHookPoints::POST_RECV_INITIAL_METADATA);
metadata_map_ = nullptr; metadata_map_ = nullptr;
} }
void SetHijackingState(InternalInterceptorBatchMethods* interceptor_methods) { void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
hijacked_ = true; hijacked_ = true;
if (metadata_map_ == nullptr) return; if (metadata_map_ == nullptr) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
@ -720,20 +719,20 @@ class CallOpClientRecvStatus {
} }
void SetInterceptionHookPoint( void SetInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
interceptor_methods->SetRecvStatus(recv_status_); interceptor_methods->SetRecvStatus(recv_status_);
interceptor_methods->SetRecvTrailingMetadata(metadata_map_); interceptor_methods->SetRecvTrailingMetadata(metadata_map_);
} }
void SetFinishInterceptionHookPoint( void SetFinishInterceptionHookPoint(
InternalInterceptorBatchMethods* interceptor_methods) { InterceptorBatchMethodsImpl* interceptor_methods) {
if (recv_status_ == nullptr) return; if (recv_status_ == nullptr) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(
experimental::InterceptionHookPoints::POST_RECV_STATUS); experimental::InterceptionHookPoints::POST_RECV_STATUS);
recv_status_ = nullptr; recv_status_ = nullptr;
} }
void SetHijackingState(InternalInterceptorBatchMethods* interceptor_methods) { void SetHijackingState(InterceptorBatchMethodsImpl* interceptor_methods) {
hijacked_ = true; hijacked_ = true;
if (recv_status_ == nullptr) return; if (recv_status_ == nullptr) return;
interceptor_methods->AddInterceptionHookPoint( interceptor_methods->AddInterceptionHookPoint(

@ -56,6 +56,9 @@ enum class InterceptionHookPoints {
POST_RECV_MESSAGE, POST_RECV_MESSAGE,
POST_RECV_STATUS /* client only */, POST_RECV_STATUS /* client only */,
POST_RECV_CLOSE /* server only */, POST_RECV_CLOSE /* server only */,
/* This is a special hook point available to both clients and servers. It is
illegal for an interceptor to block/delay this operation */
PRE_SEND_CANCEL,
NUM_INTERCEPTION_HOOKS NUM_INTERCEPTION_HOOKS
}; };
@ -66,7 +69,9 @@ class InterceptorBatchMethods {
// of type \a type // of type \a type
virtual bool QueryInterceptionHookPoint(InterceptionHookPoints type) = 0; virtual bool QueryInterceptionHookPoint(InterceptionHookPoints type) = 0;
// Calling this will signal that the interceptor is done intercepting the // Calling this will signal that the interceptor is done intercepting the
// current batch of the RPC // current batch of the RPC.
// Proceed is a no-op if the batch contains PRE_SEND_CANCEL. Simply returning
// from the Intercept method does the job of continuing the RPC.
virtual void Proceed() = 0; virtual void Proceed() = 0;
// Calling this indicates that the interceptor has hijacked the RPC (only // Calling this indicates that the interceptor has hijacked the RPC (only
// valid if the batch contains send_initial_metadata on the client side) // valid if the batch contains send_initial_metadata on the client side)

@ -19,7 +19,12 @@
#ifndef GRPCPP_IMPL_CODEGEN_INTERCEPTOR_COMMON_H #ifndef GRPCPP_IMPL_CODEGEN_INTERCEPTOR_COMMON_H
#define GRPCPP_IMPL_CODEGEN_INTERCEPTOR_COMMON_H #define GRPCPP_IMPL_CODEGEN_INTERCEPTOR_COMMON_H
#include <functional>
#include <grpcpp/impl/codegen/call.h>
#include <grpcpp/impl/codegen/call_op_set_interface.h>
#include <grpcpp/impl/codegen/client_interceptor.h> #include <grpcpp/impl/codegen/client_interceptor.h>
#include <grpcpp/impl/codegen/intercepted_channel.h>
#include <grpcpp/impl/codegen/server_interceptor.h> #include <grpcpp/impl/codegen/server_interceptor.h>
#include <grpc/impl/codegen/grpc_types.h> #include <grpc/impl/codegen/grpc_types.h>
@ -27,37 +32,8 @@
namespace grpc { namespace grpc {
namespace internal { namespace internal {
/// Internal methods for setting the state class InterceptorBatchMethodsImpl
class InternalInterceptorBatchMethods
: public experimental::InterceptorBatchMethods { : public experimental::InterceptorBatchMethods {
public:
virtual ~InternalInterceptorBatchMethods() {}
virtual void AddInterceptionHookPoint(
experimental::InterceptionHookPoints type) = 0;
virtual void SetSendMessage(ByteBuffer* buf) = 0;
virtual void SetSendInitialMetadata(
std::multimap<grpc::string, grpc::string>* metadata) = 0;
virtual void SetSendStatus(grpc_status_code* code,
grpc::string* error_details,
grpc::string* error_message) = 0;
virtual void SetSendTrailingMetadata(
std::multimap<grpc::string, grpc::string>* metadata) = 0;
virtual void SetRecvMessage(void* message) = 0;
virtual void SetRecvInitialMetadata(MetadataMap* map) = 0;
virtual void SetRecvStatus(Status* status) = 0;
virtual void SetRecvTrailingMetadata(MetadataMap* map) = 0;
};
class InterceptorBatchMethodsImpl : public InternalInterceptorBatchMethods {
public: public:
InterceptorBatchMethodsImpl() { InterceptorBatchMethodsImpl() {
for (auto i = static_cast<experimental::InterceptionHookPoints>(0); for (auto i = static_cast<experimental::InterceptionHookPoints>(0);
@ -75,7 +51,7 @@ class InterceptorBatchMethodsImpl : public InternalInterceptorBatchMethods {
return hooks_[static_cast<size_t>(type)]; return hooks_[static_cast<size_t>(type)];
} }
void Proceed() override { /* fill this */ void Proceed() override {
if (call_->client_rpc_info() != nullptr) { if (call_->client_rpc_info() != nullptr) {
return ProceedClient(); return ProceedClient();
} }
@ -98,8 +74,7 @@ class InterceptorBatchMethodsImpl : public InternalInterceptorBatchMethods {
rpc_info->RunInterceptor(this, current_interceptor_index_); rpc_info->RunInterceptor(this, current_interceptor_index_);
} }
void AddInterceptionHookPoint( void AddInterceptionHookPoint(experimental::InterceptionHookPoints type) {
experimental::InterceptionHookPoints type) override {
hooks_[static_cast<size_t>(type)] = true; hooks_[static_cast<size_t>(type)] = true;
} }
@ -139,38 +114,38 @@ class InterceptorBatchMethodsImpl : public InternalInterceptorBatchMethods {
return recv_trailing_metadata_->map(); return recv_trailing_metadata_->map();
} }
void SetSendMessage(ByteBuffer* buf) override { send_message_ = buf; } void SetSendMessage(ByteBuffer* buf) { send_message_ = buf; }
void SetSendInitialMetadata( void SetSendInitialMetadata(
std::multimap<grpc::string, grpc::string>* metadata) override { std::multimap<grpc::string, grpc::string>* metadata) {
send_initial_metadata_ = metadata; send_initial_metadata_ = metadata;
} }
void SetSendStatus(grpc_status_code* code, grpc::string* error_details, void SetSendStatus(grpc_status_code* code, grpc::string* error_details,
grpc::string* error_message) override { grpc::string* error_message) {
code_ = code; code_ = code;
error_details_ = error_details; error_details_ = error_details;
error_message_ = error_message; error_message_ = error_message;
} }
void SetSendTrailingMetadata( void SetSendTrailingMetadata(
std::multimap<grpc::string, grpc::string>* metadata) override { std::multimap<grpc::string, grpc::string>* metadata) {
send_trailing_metadata_ = metadata; send_trailing_metadata_ = metadata;
} }
void SetRecvMessage(void* message) override { recv_message_ = message; } void SetRecvMessage(void* message) { recv_message_ = message; }
void SetRecvInitialMetadata(MetadataMap* map) override { void SetRecvInitialMetadata(MetadataMap* map) {
recv_initial_metadata_ = map; recv_initial_metadata_ = map;
} }
void SetRecvStatus(Status* status) override { recv_status_ = status; } void SetRecvStatus(Status* status) { recv_status_ = status; }
void SetRecvTrailingMetadata(MetadataMap* map) override { void SetRecvTrailingMetadata(MetadataMap* map) {
recv_trailing_metadata_ = map; recv_trailing_metadata_ = map;
} }
std::unique_ptr<ChannelInterface> GetInterceptedChannel() override { std::unique_ptr<ChannelInterface> GetInterceptedChannel() {
auto* info = call_->client_rpc_info(); auto* info = call_->client_rpc_info();
if (info == nullptr) { if (info == nullptr) {
return std::unique_ptr<ChannelInterface>(nullptr); return std::unique_ptr<ChannelInterface>(nullptr);

@ -24,6 +24,7 @@
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include <grpcpp/impl/codegen/interceptor_common.h>
#include <grpcpp/impl/grpc_library.h> #include <grpcpp/impl/grpc_library.h>
#include <grpcpp/security/credentials.h> #include <grpcpp/security/credentials.h>
#include <grpcpp/server_context.h> #include <grpcpp/server_context.h>
@ -110,6 +111,9 @@ void ClientContext::set_compression_algorithm(
void ClientContext::TryCancel() { void ClientContext::TryCancel() {
std::unique_lock<std::mutex> lock(mu_); std::unique_lock<std::mutex> lock(mu_);
if (call_) { if (call_) {
// for(size_t i = 0; i < rpc_info_.interceptors_.size(); i++) {
// rpc_info_.RunInterceptor(, 0);
//}
grpc_call_cancel(call_, nullptr); grpc_call_cancel(call_, nullptr);
} else { } else {
call_canceled_ = true; call_canceled_ = true;

Loading…
Cancel
Save