diff --git a/src/SendGrid/Reliability/ReliabilitySettings.cs b/src/SendGrid/Reliability/ReliabilitySettings.cs index bc202fcd8..7a71cbc9c 100644 --- a/src/SendGrid/Reliability/ReliabilitySettings.cs +++ b/src/SendGrid/Reliability/ReliabilitySettings.cs @@ -4,6 +4,8 @@ // using System; +using System.Collections.Generic; +using System.Net; namespace SendGrid.Helpers.Reliability { @@ -89,5 +91,21 @@ public ReliabilitySettings(int maximumNumberOfRetries, TimeSpan minimumBackoff, /// Gets the value that will be used to calculate a random delta in the exponential delay between retries. Defaults to 1 second. /// public TimeSpan DeltaBackOff { get; } + + /// + /// Gets status codes for which request would be retied. + /// + public List RetriableServerErrorStatusCodes { get; } = new List(DefaultRetriableServerErrorStatusCodes); + + /// + /// Gets default status codes for which request would be retied. + /// + public static List DefaultRetriableServerErrorStatusCodes { get; } = new List() + { + HttpStatusCode.InternalServerError, + HttpStatusCode.BadGateway, + HttpStatusCode.ServiceUnavailable, + HttpStatusCode.GatewayTimeout, + }; } } \ No newline at end of file diff --git a/src/SendGrid/Reliability/RetryDelegatingHandler.cs b/src/SendGrid/Reliability/RetryDelegatingHandler.cs index c212513de..617663d84 100644 --- a/src/SendGrid/Reliability/RetryDelegatingHandler.cs +++ b/src/SendGrid/Reliability/RetryDelegatingHandler.cs @@ -4,8 +4,7 @@ // using System; -using System.Collections.Generic; -using System.Net; +using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; @@ -17,15 +16,6 @@ namespace SendGrid.Helpers.Reliability /// public class RetryDelegatingHandler : DelegatingHandler { - private static readonly List RetriableServerErrorStatusCodes = - new List() - { - HttpStatusCode.InternalServerError, - HttpStatusCode.BadGateway, - HttpStatusCode.ServiceUnavailable, - HttpStatusCode.GatewayTimeout, - }; - private readonly ReliabilitySettings settings; /// @@ -69,7 +59,7 @@ protected override async Task SendAsync(HttpRequestMessage { responseMessage = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); - ThrowHttpRequestExceptionIfResponseCodeCanBeRetried(responseMessage); + this.ThrowHttpRequestExceptionIfResponseCodeCanBeRetried(responseMessage); sent = true; } @@ -101,9 +91,9 @@ protected override async Task SendAsync(HttpRequestMessage return responseMessage; } - private static void ThrowHttpRequestExceptionIfResponseCodeCanBeRetried(HttpResponseMessage responseMessage) + private void ThrowHttpRequestExceptionIfResponseCodeCanBeRetried(HttpResponseMessage responseMessage) { - if (RetriableServerErrorStatusCodes.Contains(responseMessage.StatusCode)) + if (this.settings.RetriableServerErrorStatusCodes.Contains(responseMessage.StatusCode)) { throw new HttpRequestException(string.Format("Http status code '{0}' indicates server error", responseMessage.StatusCode)); } diff --git a/tests/SendGrid.Tests/Reliability/ReliabilitySettingsTests.cs b/tests/SendGrid.Tests/Reliability/ReliabilitySettingsTests.cs index 5357b078f..10bd62978 100644 --- a/tests/SendGrid.Tests/Reliability/ReliabilitySettingsTests.cs +++ b/tests/SendGrid.Tests/Reliability/ReliabilitySettingsTests.cs @@ -99,6 +99,7 @@ public void ShouldPassValidValuesFromDefaultConstruct() Assert.Equal(TimeSpan.Zero, defaultSettings.MinimumBackOff); Assert.Equal(TimeSpan.Zero, defaultSettings.DeltaBackOff); Assert.Equal(0, defaultSettings.MaximumNumberOfRetries); + Assert.Equal(ReliabilitySettings.DefaultRetriableServerErrorStatusCodes, defaultSettings.RetriableServerErrorStatusCodes); } [Fact]