Skip to content

Commit 61d8f18

Browse files
committed
Simplified usage of ReliabilitySettings, RetryCount defins whether policy is enabled
1 parent 17a268e commit 61d8f18

File tree

6 files changed

+42
-25
lines changed

6 files changed

+42
-25
lines changed

src/SendGrid/Reliability/ReliabilitySettings.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,7 @@ public ReliabilitySettings()
1717
}
1818

1919
/// <summary>
20-
/// Gets or sets whether the retry policy is enabled when sending HTTP requests. Defaults to false
21-
/// </summary>
22-
public bool UseRetryPolicy { get; set; }
23-
24-
/// <summary>
25-
/// Gets or sets the number of retries to execute against an HTTP service endpoint before throwing an exceptions. Defaults to 2
20+
/// Gets or sets the number of retries to execute against an HTTP service endpoint before throwing an exceptions. Defaults to 0 (no retries, you must explicitly enable)
2621
/// </summary>
2722
public int RetryCount { get; set; }
2823

src/SendGrid/Reliability/RetryDelegatingHandler.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ public class RetryDelegatingHandler : DelegatingHandler
1414

1515
private RetryPolicy retryPolicy;
1616

17+
/// <summary>
18+
/// Initializes a new instance of the <see cref="RetryDelegatingHandler"/> class.
19+
/// </summary>
20+
/// <param name="settings">A ReliabilitySettings instance</param>
1721
public RetryDelegatingHandler(ReliabilitySettings settings)
1822
: this(new HttpClientHandler(), settings)
1923
{
@@ -28,7 +32,7 @@ public RetryDelegatingHandler(HttpMessageHandler innerHandler, ReliabilitySettin
2832

2933
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
3034
{
31-
if (!settings.UseRetryPolicy)
35+
if (settings.RetryCount == 0)
3236
{
3337
return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
3438
}
@@ -41,7 +45,7 @@ protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage
4145
try
4246
{
4347
responseMessage = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
44-
EnsureResponseIsValid(responseMessage);
48+
ThrowHttpRequestExceptionIfResponseIsWithinTheServerErrorRange(responseMessage);
4549
}
4650
catch (TaskCanceledException)
4751
{
@@ -59,7 +63,7 @@ protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage
5963
throw result.FinalException;
6064
}
6165

62-
private static void EnsureResponseIsValid(HttpResponseMessage responseMessage)
66+
private static void ThrowHttpRequestExceptionIfResponseIsWithinTheServerErrorRange(HttpResponseMessage responseMessage)
6367
{
6468
if ((int)responseMessage.StatusCode >= 500 && (int)responseMessage.StatusCode < 600)
6569
{

src/SendGrid/SendGridClient.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@ public SendGridClient(SendGridClientOptions options)
9898
/// <returns>Interface to the SendGrid REST API</returns>
9999
public SendGridClient(HttpClient httpClient, SendGridClientOptions options)
100100
{
101+
if (options == null)
102+
{
103+
throw new ArgumentNullException(nameof(options));
104+
}
105+
101106
this.options = options;
102107
client = (httpClient == null) ? new HttpClient(new RetryDelegatingHandler(options.ReliabilitySettings)) : httpClient;
103108

src/SendGrid/SendGridClientOptions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public SendGridClientOptions()
3636
public Dictionary<string, string> RequestHeaders { get; set; }
3737

3838
/// <summary>
39-
/// Base url (e.g. https://api.sendgrid.com, this is the default)
39+
/// Gets or sets base url (e.g. https://api.sendgrid.com, this is the default)
4040
/// </summary>
4141
public string Host { get; set; }
4242

tests/SendGrid.Tests/Integration.cs

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace SendGrid.Tests
1+
using SendGrid.Reliability;
2+
3+
namespace SendGrid.Tests
24
{
35
using Helpers.Mail;
46
using Newtonsoft.Json;
@@ -6050,21 +6052,32 @@ public void TestJsonNetReferenceHandling(string referenceHandlingProperty)
60506052

60516053

60526054
[Fact]
6053-
public async Task TestRetryBehaviour()
6055+
public async Task TestRetryBehaviourThrowsTimeoutException()
60546056
{
6055-
var host = "http://localhost:4010";
6056-
var headers = new Dictionary<string, string> { { "X-Mock", "200" } };
6057-
var options = new SendGridClientOptions() { ApiKey = fixture.apiKey, Host = host, RequestHeaders = headers };
6058-
options.ReliabilitySettings.UseRetryPolicy = true;
6059-
options.ReliabilitySettings.RetryCount = 2;
6060-
var sg = new SendGridClient(options);
6057+
var msg = new SendGridMessage();
6058+
msg.SetFrom(new EmailAddress("[email protected]"));
6059+
msg.AddTo(new EmailAddress("[email protected]"));
6060+
msg.SetSubject("Hello World from the SendGrid CSharp Library");
6061+
msg.AddContent(MimeType.Html, "HTML content");
6062+
6063+
var options = new SendGridClientOptions
6064+
{
6065+
ApiKey = fixture.apiKey,
6066+
ReliabilitySettings = {RetryCount = 2}
6067+
};
6068+
60616069
var id = "test_url_param";
60626070

6063-
var response = await sg.RequestAsync(method: SendGridClient.Method.POST, urlPath: "whitelabel/links/" + id + "/validate");
6071+
var httpMessageHandler = new TimeOutExceptionThrowingHttpMessageHandler(20, "The operation timed out");
6072+
var retryHandler = new RetryDelegatingHandler(httpMessageHandler, options.ReliabilitySettings);
6073+
6074+
HttpClient clientToInject = new HttpClient(retryHandler);
6075+
var sg = new SendGridClient(clientToInject, options);
60646076

6065-
Assert.True(HttpStatusCode.OK == response.StatusCode);
6066-
}
6077+
var exception = await Assert.ThrowsAsync<TimeoutException>(() => sg.SendEmailAsync(msg));
60676078

6079+
Assert.NotNull(exception);
6080+
}
60686081
}
60696082

60706083
public class FakeHttpMessageHandler : HttpMessageHandler

tests/SendGrid.Tests/Reliability/RetryDelegatingHandlerTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ public RetryDelegatingHandlerTests()
1919
{
2020
reliabilitySettings = new ReliabilitySettings
2121
{
22-
RetryCount = 2,
23-
UseRetryPolicy = true
22+
RetryCount = 2
2423
};
2524
innerHandler = new RetryTestBehaviourDelegatingHandler();
2625
client = new HttpClient(new RetryDelegatingHandler(innerHandler, reliabilitySettings))
@@ -30,12 +29,13 @@ public RetryDelegatingHandlerTests()
3029
}
3130

3231
[Fact]
33-
public async Task Invoke_ShouldReturnNoErrorWhenOK()
32+
public async Task Invoke_ShouldReturnHttpResponseAndNotRetryWhenSuccessful()
3433
{
3534
innerHandler.ConfigureBehaviour(innerHandler.OK);
3635

37-
await client.SendAsync(new HttpRequestMessage());
36+
var result = await client.SendAsync(new HttpRequestMessage());
3837

38+
Assert.Equal(result.StatusCode, HttpStatusCode.OK);
3939
Assert.Equal(1, innerHandler.InvocationCount);
4040
}
4141

0 commit comments

Comments
 (0)