/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file 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. */ using System; namespace Amazon.Runtime.Internal { /// /// A pipeline handler which provides hooks to run /// external code in the pre-invoke and post-invoke phases. /// public class CallbackHandler : PipelineHandler { /// /// Action to execute on the pre invoke phase. /// public Action OnPreInvoke { get; set; } /// /// Action to execute on the post invoke phase. /// public Action OnPostInvoke { get; set; } /// /// Calls the PreInvoke and PostInvoke methods before and after calling the next handler /// in the pipeline. /// /// The execution context which contains both the /// requests and response context. public override void InvokeSync(IExecutionContext executionContext) { PreInvoke(executionContext); base.InvokeSync(executionContext); PostInvoke(executionContext); } #if AWS_ASYNC_API /// /// Calls the PreInvoke and PostInvoke methods before and after calling the next handler /// in the pipeline. /// /// The response type for the current request. /// The execution context, it contains the /// request and response context. /// A task that represents the asynchronous operation. public override async System.Threading.Tasks.Task InvokeAsync(IExecutionContext executionContext) { PreInvoke(executionContext); var response = await base.InvokeAsync(executionContext).ConfigureAwait(false); PostInvoke(executionContext); return response; } #elif AWS_APM_API /// /// Calls the PreInvoke method before calling the next handler in the pipeline. /// /// The execution context which contains both the /// requests and response context. /// IAsyncResult which represent an async operation. public override IAsyncResult InvokeAsync(IAsyncExecutionContext executionContext) { PreInvoke(ExecutionContext.CreateFromAsyncContext(executionContext)); return base.InvokeAsync(executionContext); } /// /// Calls the PostInvoke methods after calling the next handler /// in the pipeline. /// /// The execution context, it contains the /// request and response context. protected override void InvokeAsyncCallback(IAsyncExecutionContext executionContext) { // Process the response if an exception hasn't occured if (executionContext.ResponseContext.AsyncResult.Exception == null) { PostInvoke(ExecutionContext.CreateFromAsyncContext(executionContext)); } base.InvokeAsyncCallback(executionContext); } #endif /// /// Executes the OnPreInvoke action as part of pre-invoke. /// /// The execution context, it contains the /// request and response context. protected void PreInvoke(IExecutionContext executionContext) { RaiseOnPreInvoke(executionContext); } /// /// Executes the OnPreInvoke action as part of post-invoke. /// /// The execution context, it contains the /// request and response context. protected void PostInvoke(IExecutionContext executionContext) { RaiseOnPostInvoke(executionContext); } private void RaiseOnPreInvoke(IExecutionContext context) { if (this.OnPreInvoke != null) this.OnPreInvoke(context); } private void RaiseOnPostInvoke(IExecutionContext context) { if (this.OnPostInvoke != null) this.OnPostInvoke(context); } } }