#region Copyright notice and license // Copyright 2018 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. #endregion using System; namespace Grpc.Core.Interceptors { /// /// Provides extension methods to make it easy to register interceptors on Channel objects. /// public static class ChannelExtensions { /// /// Returns a instance that intercepts /// the channel with the given interceptor. /// /// The channel to intercept. /// The interceptor to intercept the channel with. /// /// Multiple interceptors can be added on top of each other by calling /// "channel.Intercept(a, b, c)". The order of invocation will be "a", "b", and then "c". /// Interceptors can be later added to an existing intercepted channel, effectively /// building a chain like "channel.Intercept(c).Intercept(b).Intercept(a)". Note that /// in this case, the last interceptor added will be the first to take control. /// public static CallInvoker Intercept(this Channel channel, Interceptor interceptor) { return new DefaultCallInvoker(channel).Intercept(interceptor); } /// /// Returns a instance that intercepts /// the channel with the given interceptors. /// /// The channel to intercept. /// /// An array of interceptors to intercept the channel with. /// Control is passed to the interceptors in the order specified. /// /// /// Multiple interceptors can be added on top of each other by calling /// "channel.Intercept(a, b, c)". The order of invocation will be "a", "b", and then "c". /// Interceptors can be later added to an existing intercepted channel, effectively /// building a chain like "channel.Intercept(c).Intercept(b).Intercept(a)". Note that /// in this case, the last interceptor added will be the first to take control. /// public static CallInvoker Intercept(this Channel channel, params Interceptor[] interceptors) { return new DefaultCallInvoker(channel).Intercept(interceptors); } /// /// Returns a instance that intercepts /// the invoker with the given interceptor. /// /// The channel to intercept. /// /// An interceptor delegate that takes the request metadata to be sent with an outgoing call /// and returns a instance that will replace the existing /// invocation metadata. /// /// /// Multiple interceptors can be added on top of each other by /// building a chain like "channel.Intercept(c).Intercept(b).Intercept(a)". Note that /// in this case, the last interceptor added will be the first to take control. /// public static CallInvoker Intercept(this Channel channel, Func interceptor) { return new DefaultCallInvoker(channel).Intercept(interceptor); } } }