private static IErrorResolution CheckResolution(HttpStatusCode statusCode, bool continuous, bool hasRetries, ErrorResolutionFlags inputFlags) { var actual = ExceptionResolver.Solve(statusCode, new ExceptionResolverOptions { Continuous = continuous, HasRetries = hasRetries }); CheckResolution(actual, continuous, hasRetries, inputFlags); return(actual); }
static Task <HttpResponseMessage> HandleTransientErrors(Task <HttpResponseMessage> request, object state) { var executor = (RetryStrategyExecutor)state; if (!request.IsFaulted) { var response = request.Result; if (executor.CanContinue && ExceptionResolver.IsTransientError(response)) { Log.To.Sync.V(Tag, "Retrying after transient error..."); return(executor.Retry()); } if (!response.IsSuccessStatusCode) { Log.To.Sync.V(Tag, "Non transient error received ({0}), throwing HttpResponseException", response.StatusCode); var exception = new HttpResponseException(response.StatusCode); if (response.StatusCode == HttpStatusCode.Unauthorized || response.StatusCode == HttpStatusCode.ProxyAuthenticationRequired) { var responseChallenge = response.Headers.WwwAuthenticate; foreach (var header in responseChallenge) { var challenge = AuthUtils.ParseAuthHeader(header); if (challenge != null) { exception.Data["AuthChallenge"] = challenge; } } } throw exception; } // If it's not faulted, there's nothing here to do. return(request); } var resolution = ExceptionResolver.Solve(request.Exception, new ExceptionResolverOptions { HasRetries = executor.CanContinue }); if (resolution.Resolution == ErrorResolution.Stop) { if (resolution.ResolutionFlags.HasFlag(ErrorResolutionFlags.OutOfRetries)) { Log.To.Sync.V(Tag, "Out of retries for error, throwing", request.Exception); } else { Log.To.Sync.V(Tag, "Non transient error received (status), throwing", request.Exception); } // If it's not transient, pass the exception along // for any other handlers to respond to. throw request.Exception; } // Retry again. Log.To.Sync.V(Tag, "Retrying after transient error..."); return(executor.Retry()); }