diff --git a/BUILD b/BUILD index ec8bed94f53..7892cd46496 100644 --- a/BUILD +++ b/BUILD @@ -415,7 +415,9 @@ GRPCXX_PUBLIC_HDRS = [ "include/grpcpp/create_channel_posix.h", "include/grpcpp/ext/health_check_service_server_builder_option.h", "include/grpcpp/generic/async_generic_service.h", + "include/grpcpp/generic/callback_generic_service.h", "include/grpcpp/generic/generic_stub.h", + "include/grpcpp/generic/generic_stub_callback.h", "include/grpcpp/grpcpp.h", "include/grpcpp/health_check_service_interface.h", "include/grpcpp/impl/call_hook.h", @@ -1260,6 +1262,7 @@ grpc_cc_library( visibility = ["@grpc:public"], deps = [ "channel_arg_names", + "generic_stub_internal", "gpr", "grpc++_base_unsecure", "grpc++_codegen_proto", @@ -2470,6 +2473,7 @@ grpc_cc_library( "channel_stack_builder", "config", "exec_ctx", + "generic_stub_internal", "gpr", "grpc", "grpc++_codegen_proto", @@ -2558,6 +2562,7 @@ grpc_cc_library( "channel_stack_builder", "config", "exec_ctx", + "generic_stub_internal", "gpr", "grpc_base", "grpc_core_credentials_header", @@ -2955,6 +2960,41 @@ grpc_cc_library( ], ) +grpc_cc_library( + name = "generic_stub_internal", + hdrs = [ + "include/grpcpp/impl/generic_stub_internal.h", + ], + language = "c++", + deps = [ + "grpc++_public_hdrs", + ], +) + +grpc_cc_library( + name = "generic_stub_callback", + hdrs = [ + "include/grpcpp/generic/generic_stub_callback.h", + ], + language = "c++", + visibility = ["@grpc:public"], + deps = [ + "generic_stub_internal", + ], +) + +grpc_cc_library( + name = "callback_generic_service", + hdrs = [ + "include/grpcpp/generic/callback_generic_service.h", + ], + language = "c++", + visibility = ["@grpc:public"], + deps = [ + "grpc++_public_hdrs", + ], +) + grpc_cc_library( name = "work_serializer", srcs = [ diff --git a/CMakeLists.txt b/CMakeLists.txt index 00d7dec71a4..4708ab40ded 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4253,7 +4253,9 @@ foreach(_hdr include/grpcpp/ext/health_check_service_server_builder_option.h include/grpcpp/ext/server_metric_recorder.h include/grpcpp/generic/async_generic_service.h + include/grpcpp/generic/callback_generic_service.h include/grpcpp/generic/generic_stub.h + include/grpcpp/generic/generic_stub_callback.h include/grpcpp/grpcpp.h include/grpcpp/health_check_service_interface.h include/grpcpp/impl/call.h @@ -4314,6 +4316,7 @@ foreach(_hdr include/grpcpp/impl/completion_queue_tag.h include/grpcpp/impl/create_auth_context.h include/grpcpp/impl/delegating_channel.h + include/grpcpp/impl/generic_stub_internal.h include/grpcpp/impl/grpc_library.h include/grpcpp/impl/intercepted_channel.h include/grpcpp/impl/interceptor_common.h @@ -4996,7 +4999,9 @@ foreach(_hdr include/grpcpp/ext/health_check_service_server_builder_option.h include/grpcpp/ext/server_metric_recorder.h include/grpcpp/generic/async_generic_service.h + include/grpcpp/generic/callback_generic_service.h include/grpcpp/generic/generic_stub.h + include/grpcpp/generic/generic_stub_callback.h include/grpcpp/grpcpp.h include/grpcpp/health_check_service_interface.h include/grpcpp/impl/call.h @@ -5057,6 +5062,7 @@ foreach(_hdr include/grpcpp/impl/completion_queue_tag.h include/grpcpp/impl/create_auth_context.h include/grpcpp/impl/delegating_channel.h + include/grpcpp/impl/generic_stub_internal.h include/grpcpp/impl/grpc_library.h include/grpcpp/impl/intercepted_channel.h include/grpcpp/impl/interceptor_common.h diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index dad0979993b..8b8cad64122 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -3713,7 +3713,9 @@ libs: - include/grpcpp/ext/health_check_service_server_builder_option.h - include/grpcpp/ext/server_metric_recorder.h - include/grpcpp/generic/async_generic_service.h + - include/grpcpp/generic/callback_generic_service.h - include/grpcpp/generic/generic_stub.h + - include/grpcpp/generic/generic_stub_callback.h - include/grpcpp/grpcpp.h - include/grpcpp/health_check_service_interface.h - include/grpcpp/impl/call.h @@ -3774,6 +3776,7 @@ libs: - include/grpcpp/impl/completion_queue_tag.h - include/grpcpp/impl/create_auth_context.h - include/grpcpp/impl/delegating_channel.h + - include/grpcpp/impl/generic_stub_internal.h - include/grpcpp/impl/grpc_library.h - include/grpcpp/impl/intercepted_channel.h - include/grpcpp/impl/interceptor_common.h @@ -4143,7 +4146,9 @@ libs: - include/grpcpp/ext/health_check_service_server_builder_option.h - include/grpcpp/ext/server_metric_recorder.h - include/grpcpp/generic/async_generic_service.h + - include/grpcpp/generic/callback_generic_service.h - include/grpcpp/generic/generic_stub.h + - include/grpcpp/generic/generic_stub_callback.h - include/grpcpp/grpcpp.h - include/grpcpp/health_check_service_interface.h - include/grpcpp/impl/call.h @@ -4204,6 +4209,7 @@ libs: - include/grpcpp/impl/completion_queue_tag.h - include/grpcpp/impl/create_auth_context.h - include/grpcpp/impl/delegating_channel.h + - include/grpcpp/impl/generic_stub_internal.h - include/grpcpp/impl/grpc_library.h - include/grpcpp/impl/intercepted_channel.h - include/grpcpp/impl/interceptor_common.h diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index dcbb22b52a1..842fef4262a 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -103,7 +103,9 @@ Pod::Spec.new do |s| 'include/grpcpp/ext/health_check_service_server_builder_option.h', 'include/grpcpp/ext/server_metric_recorder.h', 'include/grpcpp/generic/async_generic_service.h', + 'include/grpcpp/generic/callback_generic_service.h', 'include/grpcpp/generic/generic_stub.h', + 'include/grpcpp/generic/generic_stub_callback.h', 'include/grpcpp/grpcpp.h', 'include/grpcpp/health_check_service_interface.h', 'include/grpcpp/impl/call.h', @@ -160,6 +162,7 @@ Pod::Spec.new do |s| 'include/grpcpp/impl/completion_queue_tag.h', 'include/grpcpp/impl/create_auth_context.h', 'include/grpcpp/impl/delegating_channel.h', + 'include/grpcpp/impl/generic_stub_internal.h', 'include/grpcpp/impl/grpc_library.h', 'include/grpcpp/impl/intercepted_channel.h', 'include/grpcpp/impl/interceptor_common.h', diff --git a/include/grpcpp/generic/async_generic_service.h b/include/grpcpp/generic/async_generic_service.h index 77525d13b2a..68013caf223 100644 --- a/include/grpcpp/generic/async_generic_service.h +++ b/include/grpcpp/generic/async_generic_service.h @@ -20,10 +20,9 @@ #define GRPCPP_GENERIC_ASYNC_GENERIC_SERVICE_H #include -#include +#include #include #include -#include struct grpc_server; @@ -78,57 +77,6 @@ class AsyncGenericService final { grpc::Server* server_; }; -/// \a ServerGenericBidiReactor is the reactor class for bidi streaming RPCs -/// invoked on a CallbackGenericService. It is just a ServerBidi reactor with -/// ByteBuffer arguments. -using ServerGenericBidiReactor = ServerBidiReactor; - -class GenericCallbackServerContext final : public grpc::CallbackServerContext { - public: - const std::string& method() const { return method_; } - const std::string& host() const { return host_; } - - private: - friend class grpc::Server; - - std::string method_; - std::string host_; -}; - -/// \a CallbackGenericService is the base class for generic services implemented -/// using the callback API and registered through the ServerBuilder using -/// RegisterCallbackGenericService. -class CallbackGenericService { - public: - CallbackGenericService() {} - virtual ~CallbackGenericService() {} - - /// The "method handler" for the generic API. This function should be - /// overridden to provide a ServerGenericBidiReactor that implements the - /// application-level interface for this RPC. Unimplemented by default. - virtual ServerGenericBidiReactor* CreateReactor( - GenericCallbackServerContext* /*ctx*/) { - class Reactor : public ServerGenericBidiReactor { - public: - Reactor() { this->Finish(Status(StatusCode::UNIMPLEMENTED, "")); } - void OnDone() override { delete this; } - }; - return new Reactor; - } - - private: - friend class grpc::Server; - - internal::CallbackBidiHandler* Handler() { - return new internal::CallbackBidiHandler( - [this](grpc::CallbackServerContext* ctx) { - return CreateReactor(static_cast(ctx)); - }); - } - - grpc::Server* server_{nullptr}; -}; - } // namespace grpc #endif // GRPCPP_GENERIC_ASYNC_GENERIC_SERVICE_H diff --git a/include/grpcpp/generic/callback_generic_service.h b/include/grpcpp/generic/callback_generic_service.h new file mode 100644 index 00000000000..db080a79e7d --- /dev/null +++ b/include/grpcpp/generic/callback_generic_service.h @@ -0,0 +1,84 @@ +// +// +// Copyright 2024 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_GENERIC_CALLBACK_GENERIC_SERVICE_H +#define GRPCPP_GENERIC_CALLBACK_GENERIC_SERVICE_H + +#include +#include +#include +#include + +struct grpc_server; + +namespace grpc { + +/// \a ServerGenericBidiReactor is the reactor class for bidi streaming RPCs +/// invoked on a CallbackGenericService. It is just a ServerBidi reactor with +/// ByteBuffer arguments. +using ServerGenericBidiReactor = ServerBidiReactor; + +class GenericCallbackServerContext final : public grpc::CallbackServerContext { + public: + const std::string& method() const { return method_; } + const std::string& host() const { return host_; } + + private: + friend class grpc::Server; + + std::string method_; + std::string host_; +}; + +/// \a CallbackGenericService is the base class for generic services implemented +/// using the callback API and registered through the ServerBuilder using +/// RegisterCallbackGenericService. +class CallbackGenericService { + public: + CallbackGenericService() {} + virtual ~CallbackGenericService() {} + + /// The "method handler" for the generic API. This function should be + /// overridden to provide a ServerGenericBidiReactor that implements the + /// application-level interface for this RPC. Unimplemented by default. + virtual ServerGenericBidiReactor* CreateReactor( + GenericCallbackServerContext* /*ctx*/) { + class Reactor : public ServerGenericBidiReactor { + public: + Reactor() { this->Finish(Status(StatusCode::UNIMPLEMENTED, "")); } + void OnDone() override { delete this; } + }; + return new Reactor; + } + + private: + friend class grpc::Server; + + internal::CallbackBidiHandler* Handler() { + return new internal::CallbackBidiHandler( + [this](grpc::CallbackServerContext* ctx) { + return CreateReactor(static_cast(ctx)); + }); + } + + grpc::Server* server_{nullptr}; +}; + +} // namespace grpc + +#endif // GRPCPP_GENERIC_CALLBACK_GENERIC_SERVICE_H diff --git a/include/grpcpp/generic/generic_stub.h b/include/grpcpp/generic/generic_stub.h index a44232bc519..bc06c602d76 100644 --- a/include/grpcpp/generic/generic_stub.h +++ b/include/grpcpp/generic/generic_stub.h @@ -19,15 +19,12 @@ #ifndef GRPCPP_GENERIC_GENERIC_STUB_H #define GRPCPP_GENERIC_GENERIC_STUB_H -#include - #include +#include #include #include #include #include -#include -#include #include namespace grpc { @@ -42,10 +39,12 @@ typedef ClientAsyncResponseReader GenericClientAsyncResponseReader; /// by name. In practice, the Request and Response types should be basic /// types like grpc::ByteBuffer or proto::MessageLite (the base protobuf). template -class TemplatedGenericStub final { +class TemplatedGenericStub final + : public internal::TemplatedGenericStubCallbackInternal { public: - explicit TemplatedGenericStub(std::shared_ptr channel) - : channel_(channel) {} + using internal::TemplatedGenericStubCallbackInternal< + RequestType, ResponseType>::TemplatedGenericStubCallbackInternal; /// Setup a call to a named method \a method using \a context, but don't /// start it. Let it be started explicitly with StartCall and a tag. @@ -74,6 +73,9 @@ class TemplatedGenericStub final { context, request)); } + using internal::TemplatedGenericStubCallbackInternal< + RequestType, ResponseType>::PrepareUnaryCall; + /// DEPRECATED for multi-threaded use /// Begin a call to a named method \a method using \a context. /// A tag \a tag will be delivered to \a cq when the call has been started @@ -87,72 +89,9 @@ class TemplatedGenericStub final { true, tag); } - /// Setup and start a unary call to a named method \a method using - /// \a context and specifying the \a request and \a response buffers. - void UnaryCall(ClientContext* context, const std::string& method, - StubOptions options, const RequestType* request, - ResponseType* response, - std::function on_completion) { - UnaryCallInternal(context, method, options, request, response, - std::move(on_completion)); - } - - /// Setup a unary call to a named method \a method using - /// \a context and specifying the \a request and \a response buffers. - /// Like any other reactor-based RPC, it will not be activated until - /// StartCall is invoked on its reactor. - void PrepareUnaryCall(ClientContext* context, const std::string& method, - StubOptions options, const RequestType* request, - ResponseType* response, ClientUnaryReactor* reactor) { - PrepareUnaryCallInternal(context, method, options, request, response, - reactor); - } - - /// Setup a call to a named method \a method using \a context and tied to - /// \a reactor . Like any other bidi streaming RPC, it will not be activated - /// until StartCall is invoked on its reactor. - void PrepareBidiStreamingCall( - ClientContext* context, const std::string& method, StubOptions options, - ClientBidiReactor* reactor) { - PrepareBidiStreamingCallInternal(context, method, options, reactor); - } - private: - std::shared_ptr channel_; - - void UnaryCallInternal(ClientContext* context, const std::string& method, - StubOptions options, const RequestType* request, - ResponseType* response, - std::function on_completion) { - internal::CallbackUnaryCall( - channel_.get(), - grpc::internal::RpcMethod(method.c_str(), options.suffix_for_stats(), - grpc::internal::RpcMethod::NORMAL_RPC), - context, request, response, std::move(on_completion)); - } - - void PrepareUnaryCallInternal(ClientContext* context, - const std::string& method, StubOptions options, - const RequestType* request, - ResponseType* response, - ClientUnaryReactor* reactor) { - internal::ClientCallbackUnaryFactory::Create( - channel_.get(), - grpc::internal::RpcMethod(method.c_str(), options.suffix_for_stats(), - grpc::internal::RpcMethod::NORMAL_RPC), - context, request, response, reactor); - } - - void PrepareBidiStreamingCallInternal( - ClientContext* context, const std::string& method, StubOptions options, - ClientBidiReactor* reactor) { - internal::ClientCallbackReaderWriterFactory:: - Create(channel_.get(), - grpc::internal::RpcMethod( - method.c_str(), options.suffix_for_stats(), - grpc::internal::RpcMethod::BIDI_STREAMING), - context, reactor); - } + using internal::TemplatedGenericStubCallbackInternal::channel_; std::unique_ptr> CallInternal(grpc::ChannelInterface* channel, ClientContext* context, diff --git a/include/grpcpp/generic/generic_stub_callback.h b/include/grpcpp/generic/generic_stub_callback.h new file mode 100644 index 00000000000..c039e2a4433 --- /dev/null +++ b/include/grpcpp/generic/generic_stub_callback.h @@ -0,0 +1,44 @@ +// +// +// Copyright 2024 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_GENERIC_GENERIC_STUB_CALLBACK_H +#define GRPCPP_GENERIC_GENERIC_STUB_CALLBACK_H + +#include +#include + +namespace grpc { + +/// Generic stubs provide a type-unaware interface to call gRPC methods +/// by name. In practice, the Request and Response types should be basic +/// types like grpc::ByteBuffer or proto::MessageLite (the base protobuf). +template +class TemplatedGenericStubCallback final + : public internal::TemplatedGenericStubCallbackInternal { + public: + using internal::TemplatedGenericStubCallbackInternal< + RequestType, ResponseType>::TemplatedGenericStubCallbackInternal; +}; + +typedef TemplatedGenericStubCallback + GenericStubCallback; + +} // namespace grpc + +#endif // GRPCPP_GENERIC_GENERIC_STUB_CALLBACK_H diff --git a/include/grpcpp/impl/generic_stub_internal.h b/include/grpcpp/impl/generic_stub_internal.h new file mode 100644 index 00000000000..ba8c929d8fe --- /dev/null +++ b/include/grpcpp/impl/generic_stub_internal.h @@ -0,0 +1,125 @@ +// +// +// Copyright 2024 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_IMPL_GENERIC_STUB_INTERNAL_H +#define GRPCPP_IMPL_GENERIC_STUB_INTERNAL_H + +#include + +#include +#include +#include +#include +#include +#include + +namespace grpc { + +template +class TemplatedGenericStub; +template +class TemplatedGenericStubCallback; + +namespace internal { + +/// Generic stubs provide a type-unaware interface to call gRPC methods +/// by name. In practice, the Request and Response types should be basic +/// types like grpc::ByteBuffer or proto::MessageLite (the base protobuf). +template +class TemplatedGenericStubCallbackInternal { + public: + explicit TemplatedGenericStubCallbackInternal( + std::shared_ptr channel) + : channel_(channel) {} + + /// Setup and start a unary call to a named method \a method using + /// \a context and specifying the \a request and \a response buffers. + void UnaryCall(ClientContext* context, const std::string& method, + StubOptions options, const RequestType* request, + ResponseType* response, + std::function on_completion) { + UnaryCallInternal(context, method, options, request, response, + std::move(on_completion)); + } + + /// Setup a unary call to a named method \a method using + /// \a context and specifying the \a request and \a response buffers. + /// Like any other reactor-based RPC, it will not be activated until + /// StartCall is invoked on its reactor. + void PrepareUnaryCall(ClientContext* context, const std::string& method, + StubOptions options, const RequestType* request, + ResponseType* response, ClientUnaryReactor* reactor) { + PrepareUnaryCallInternal(context, method, options, request, response, + reactor); + } + + /// Setup a call to a named method \a method using \a context and tied to + /// \a reactor . Like any other bidi streaming RPC, it will not be activated + /// until StartCall is invoked on its reactor. + void PrepareBidiStreamingCall( + ClientContext* context, const std::string& method, StubOptions options, + ClientBidiReactor* reactor) { + PrepareBidiStreamingCallInternal(context, method, options, reactor); + } + + private: + template + friend class grpc::TemplatedGenericStub; + template + friend class grpc::TemplatedGenericStubCallback; + std::shared_ptr channel_; + + void UnaryCallInternal(ClientContext* context, const std::string& method, + StubOptions options, const RequestType* request, + ResponseType* response, + std::function on_completion) { + internal::CallbackUnaryCall( + channel_.get(), + grpc::internal::RpcMethod(method.c_str(), options.suffix_for_stats(), + grpc::internal::RpcMethod::NORMAL_RPC), + context, request, response, std::move(on_completion)); + } + + void PrepareUnaryCallInternal(ClientContext* context, + const std::string& method, StubOptions options, + const RequestType* request, + ResponseType* response, + ClientUnaryReactor* reactor) { + internal::ClientCallbackUnaryFactory::Create( + channel_.get(), + grpc::internal::RpcMethod(method.c_str(), options.suffix_for_stats(), + grpc::internal::RpcMethod::NORMAL_RPC), + context, request, response, reactor); + } + + void PrepareBidiStreamingCallInternal( + ClientContext* context, const std::string& method, StubOptions options, + ClientBidiReactor* reactor) { + internal::ClientCallbackReaderWriterFactory:: + Create(channel_.get(), + grpc::internal::RpcMethod( + method.c_str(), options.suffix_for_stats(), + grpc::internal::RpcMethod::BIDI_STREAMING), + context, reactor); + } +}; + +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_GENERIC_STUB_INTERNAL_H diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index 01b0f97652a..edf845fb46a 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -965,7 +965,9 @@ include/grpcpp/ext/call_metric_recorder.h \ include/grpcpp/ext/health_check_service_server_builder_option.h \ include/grpcpp/ext/server_metric_recorder.h \ include/grpcpp/generic/async_generic_service.h \ +include/grpcpp/generic/callback_generic_service.h \ include/grpcpp/generic/generic_stub.h \ +include/grpcpp/generic/generic_stub_callback.h \ include/grpcpp/grpcpp.h \ include/grpcpp/health_check_service_interface.h \ include/grpcpp/impl/call.h \ @@ -1026,6 +1028,7 @@ include/grpcpp/impl/codegen/time.h \ include/grpcpp/impl/completion_queue_tag.h \ include/grpcpp/impl/create_auth_context.h \ include/grpcpp/impl/delegating_channel.h \ +include/grpcpp/impl/generic_stub_internal.h \ include/grpcpp/impl/grpc_library.h \ include/grpcpp/impl/intercepted_channel.h \ include/grpcpp/impl/interceptor_common.h \ diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index c3797ac0f86..3bceffda967 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -965,7 +965,9 @@ include/grpcpp/ext/call_metric_recorder.h \ include/grpcpp/ext/health_check_service_server_builder_option.h \ include/grpcpp/ext/server_metric_recorder.h \ include/grpcpp/generic/async_generic_service.h \ +include/grpcpp/generic/callback_generic_service.h \ include/grpcpp/generic/generic_stub.h \ +include/grpcpp/generic/generic_stub_callback.h \ include/grpcpp/grpcpp.h \ include/grpcpp/health_check_service_interface.h \ include/grpcpp/impl/call.h \ @@ -1026,6 +1028,7 @@ include/grpcpp/impl/codegen/time.h \ include/grpcpp/impl/completion_queue_tag.h \ include/grpcpp/impl/create_auth_context.h \ include/grpcpp/impl/delegating_channel.h \ +include/grpcpp/impl/generic_stub_internal.h \ include/grpcpp/impl/grpc_library.h \ include/grpcpp/impl/intercepted_channel.h \ include/grpcpp/impl/interceptor_common.h \