private async Task <T> HandleResponse <T>(HttpResponseMessage response)
        {
            Logger.Trace("HandleResponse StatusCode: {0} {1}", (int)response.StatusCode, response.StatusCode);
            if (!ResponseValidator.Invoke(response))
            {
                return(default(T));
            }

            var result = await response.Content.ReadAsStringAsync();

            Logger.Trace("HandleResponse: returned={0}", result);
            var ret = JsonConvert.DeserializeObject <T>(result);

            Logger.Trace("HandleResponse[DeserializeObject]: type={0}", (ret == null ? S_NULL : ret.GetType().FullName));
            return(ret);
        }
        public async Task ExecuteAsync(Func <HttpRequestMessage> requestMessageFactory, IHttpExecutionContext context)
        {
            for (int retry = 0; retry <= MaxRetryCount; retry++)
            {
                var request = requestMessageFactory();
                Logger.LogRequest(request);

                try
                {
                    var response = await context.Invoker.SendAsync(request, context.CancellationToken);

                    Logger.LogResponse(response);
                    ResponseValidator?.Invoke(response);

                    context.SuccessResult(response);
                    break;
                }
                catch (OperationCanceledException) when(!context.CancellationToken.IsCancellationRequested)
                {
                    context.TimeoutResult();
                }
                catch (HttpRequestException ex)
                {
                    Logger.LogRequestException(request, ex);
                    context.ErrorResult(ex.Message);

                    if (PostErrorDelay != TimeSpan.Zero)
                    {
                        await Task.Delay(PostErrorDelay);
                    }
                }
                finally
                {
                    request?.Dispose();
                }
            }
        }
Example #3
0
 private static void validateResponse <T>(IRequest request, IResponse response, T data, ResponseValidator <T> validateResponse)
 => validateResponse?.Invoke(request, response, data);