mirror of https://github.com/dotnet/tye.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.7 KiB
56 lines
1.7 KiB
// Licensed to the .NET Foundation under one or more agreements.
|
|
// The .NET Foundation licenses this file to you under the MIT license.
|
|
// See the LICENSE file in the project root for more information.
|
|
|
|
using System;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Test.Infrastructure
|
|
{
|
|
public class RetryHandler : DelegatingHandler
|
|
{
|
|
private static readonly int MaxRetries = 5;
|
|
private static readonly TimeSpan InitialRetryDelay = TimeSpan.FromMilliseconds(500);
|
|
|
|
public RetryHandler(HttpMessageHandler innerHandler)
|
|
: base(innerHandler)
|
|
{
|
|
}
|
|
|
|
protected override async Task<HttpResponseMessage> SendAsync(
|
|
HttpRequestMessage request,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
HttpResponseMessage response = null;
|
|
var delay = InitialRetryDelay;
|
|
for (var i = 0; i < MaxRetries; i++)
|
|
{
|
|
try
|
|
{
|
|
response = await base.SendAsync(request, cancellationToken);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
if (i == MaxRetries - 1)
|
|
{
|
|
throw;
|
|
}
|
|
}
|
|
|
|
if (response != null &&
|
|
(response.IsSuccessStatusCode || response.StatusCode != (HttpStatusCode)503))
|
|
{
|
|
return response;
|
|
}
|
|
|
|
await Task.Delay(delay, cancellationToken);
|
|
delay *= 2;
|
|
}
|
|
|
|
throw new TimeoutException("Could not reach response after ");
|
|
}
|
|
}
|
|
}
|
|
|