async Task IHttpHandler.OnSent(HttpSentContext context)
        {
            Settings.ResultInspector = cacheEntry => ((HttpResponseMessage)cacheEntry.Value).RequestMessage = context.Result.RequestMessage;

            var response = context.Result;

            await TryGetRevalidatedResult(context, context.Request, context.Result);

            // if we just retrieved a response from cache
            // dispose of the revalidation result
            if (context.Result != response)
            {
                ObjectHelpers.Dispose(response);
            }

            await TryCacheResult(context, context.Result, context.Request, context.Result);
        }
Exemple #2
0
        private ICacheContext CreateContextForHttpResponse(Uri uri, HttpResponseMessage response, string accept = "application/json")
        {
            var request = new MockHttpRequestMessage()
            {
                RequestUri = uri,
            };

            request.Headers.Accept.ParseAdd(accept);
            response.RequestMessage = request;
            var cacheSettings = new CacheSettings();
            var settings      = new HttpBuilderSettings(cacheSettings, null, null);

            settings.UriBuilder.Uri = uri;
            var httpBuilderContext = new HttpBuilderContext(settings);
            var handlerContext     = new HttpSentContext(httpBuilderContext, request, response);

            return(new CacheContext(cacheSettings, handlerContext));
        }
Exemple #3
0
        private async Task <HttpResponseMessage> ResultFromRequestAsync(IHttpBuilderContext context, HttpRequestMessage request, CancellationToken token)
        {
            ExceptionDispatchInfo capturedException = null;
            HttpResponseMessage   response          = null;

            try
            {
                var sendingContext = new HttpSendingContext(context, request);

                token.ThrowIfCancellationRequested();

                await context.HandlerRegister.OnSending(sendingContext);

                if (sendingContext.Result != null)
                {
                    response = sendingContext.Result;
                }
                else
                {
                    token.ThrowIfCancellationRequested();

                    using (var client = _clientBuilder.Build())
                        response = await client.SendAsync(request, context.CompletionOption, token);
                }

                if (!context.IsSuccessfulResponse(response) && context.ExceptionFactory != null)
                {
                    var ex = context.ExceptionFactory(response, request);

                    if (ex != null)
                    {
                        throw ex;
                    }
                }

                var sentContext = new HttpSentContext(context, request, response);

                token.ThrowIfCancellationRequested();

                await context.HandlerRegister.OnSent(sentContext);

                response = sentContext.Result;
            }
            catch (Exception ex)
            {
                capturedException = ExceptionDispatchInfo.Capture(ex);
            }

            if (capturedException != null)
            {
                var exContext = new HttpExceptionContext(context, response, capturedException.SourceException);

                await context.HandlerRegister.OnException(exContext);

                if (!exContext.ExceptionHandled)
                {
                    capturedException.Throw();
                }
            }

            return(response);
        }