// // // Copyright 2015 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_SUPPORT_INTERCEPTOR_H #define GRPCPP_SUPPORT_INTERCEPTOR_H #include <map> #include <memory> #include <string> #include <grpc/impl/grpc_types.h> #include <grpcpp/impl/metadata_map.h> #include <grpcpp/support/byte_buffer.h> #include <grpcpp/support/config.h> #include <grpcpp/support/string_ref.h> namespace grpc { class ChannelInterface; class Status; namespace experimental { /// An enumeration of different possible points at which the \a Intercept /// method of the \a Interceptor interface may be called. Any given call /// to \a Intercept will include one or more of these hook points, and /// each hook point makes certain types of information available to the /// interceptor. /// In these enumeration names, PRE_SEND means that an interception has taken /// place between the time the application provided a certain type of data /// (e.g., initial metadata, status) and the time that that data goes to the /// other side. POST_SEND means that the data has been committed for going to /// the other side (even if it has not yet been received at the other side). /// PRE_RECV means an interception between the time that a certain /// operation has been requested and it is available. POST_RECV means that a /// result is available but has not yet been passed back to the application. /// A batch of interception points will only contain either PRE or POST hooks /// but not both types. For example, a batch with PRE_SEND hook points will not /// contain POST_RECV or POST_SEND ops. Likewise, a batch with POST_* ops can /// not contain PRE_* ops. enum class InterceptionHookPoints { … }; /// Class that is passed as an argument to the \a Intercept method /// of the application's \a Interceptor interface implementation. It has five /// purposes: /// 1. Indicate which hook points are present at a specific interception /// 2. Allow an interceptor to inform the library that an RPC should /// continue to the next stage of its processing (which may be another /// interceptor or the main path of the library) /// 3. Allow an interceptor to hijack the processing of the RPC (only for /// client-side RPCs with PRE_SEND_INITIAL_METADATA) so that it does not /// proceed with normal processing beyond that stage /// 4. Access the relevant fields of an RPC at each interception point /// 5. Set some fields of an RPC at each interception point, when possible class InterceptorBatchMethods { … }; /// Interface for an interceptor. Interceptor authors must create a class /// that derives from this parent class. class Interceptor { … }; } // namespace experimental } // namespace grpc #endif // GRPCPP_SUPPORT_INTERCEPTOR_H