Skip to content

Commit ec2e539

Browse files
committed
Dispose response messages when we retry sending requests.
1 parent 0c03564 commit ec2e539

File tree

2 files changed

+42
-25
lines changed

2 files changed

+42
-25
lines changed

src/ResourceManager/Resources/Commands.ResourceManager/Cmdlets/Handlers/RetryHandler.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@
1414

1515
namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Handlers
1616
{
17-
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Components;
18-
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Extensions;
19-
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Utilities;
2017
using System;
2118
using System.Net;
2219
using System.Net.Http;
2320
using System.Threading;
2421
using System.Threading.Tasks;
25-
22+
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Components;
23+
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Extensions;
24+
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Utilities;
25+
2626
/// <summary>
2727
/// A basic retry handler.
2828
/// </summary>
@@ -56,15 +56,15 @@ public class RetryHandler : DelegatingHandler
5656
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
5757
{
5858
HttpResponseMessage response = null;
59+
5960
for (int attempt = 0; attempt < RetryHandler.MaxAttempts; ++attempt)
6061
{
6162
try
6263
{
63-
response = await base
64-
.SendAsync(request: request, cancellationToken: cancellationToken)
64+
response = await base.SendAsync(request: request, cancellationToken: cancellationToken)
6565
.ConfigureAwait(continueOnCapturedContext: false);
66-
67-
if (attempt == RetryHandler.MaxAttempts ||
66+
67+
if (attempt == RetryHandler.MaxAttempts - 1 ||
6868
(!response.StatusCode.IsServerFailureRequest() &&
6969
response.StatusCode != HttpStatusCode.RequestTimeout &&
7070
response.StatusCode != HttpStatusCodeExt.TooManyRequests))
@@ -74,17 +74,22 @@ protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage
7474
}
7575
catch (Exception ex)
7676
{
77-
if (ex.IsFatal() || attempt == RetryHandler.MaxAttempts)
77+
if (ex.IsFatal() || attempt == RetryHandler.MaxAttempts - 1)
7878
{
7979
throw;
8080
}
8181
}
8282

83+
if (response != null)
84+
{
85+
response.Dispose();
86+
}
87+
8388
await Task.Delay(delay: RetryHandler.GetDelay(attempt), cancellationToken: cancellationToken)
8489
.ConfigureAwait(continueOnCapturedContext: false);
8590
}
8691

87-
return response;
92+
return null;
8893
}
8994

9095
/// <summary>

src/ResourceManager/Resources/Commands.ResourceManager/Cmdlets/RestClients/ResourceManagerRestClientBase.cs

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -219,27 +219,39 @@ protected async Task<HttpResponseMessage> SendRequestAsync(HttpRequestMessage re
219219
{
220220
using (var httpClient = this.httpClientHelper.CreateHttpClient())
221221
{
222-
var response = await httpClient
223-
.SendAsync(request: request, cancellationToken: cancellationToken)
224-
.ConfigureAwait(continueOnCapturedContext: false);
225-
226-
if (!response.StatusCode.IsSuccessfulRequest())
222+
try
227223
{
228-
var errorResponse = await ResourceManagerRestClientBase
229-
.TryReadErrorResponseMessage(response, rewindContentStream: true)
224+
var response = await httpClient
225+
.SendAsync(request: request, cancellationToken: cancellationToken)
230226
.ConfigureAwait(continueOnCapturedContext: false);
231227

232-
var message = await ResourceManagerRestClientBase
233-
.GetErrorMessage(request: request, response: response, errorResponse: errorResponse)
234-
.ConfigureAwait(continueOnCapturedContext: false);
228+
if (!response.StatusCode.IsSuccessfulRequest())
229+
{
230+
var errorResponse = await ResourceManagerRestClientBase
231+
.TryReadErrorResponseMessage(response, rewindContentStream: true)
232+
.ConfigureAwait(continueOnCapturedContext: false);
233+
234+
var message = await ResourceManagerRestClientBase
235+
.GetErrorMessage(request: request, response: response, errorResponse: errorResponse)
236+
.ConfigureAwait(continueOnCapturedContext: false);
235237

236-
throw new ErrorResponseMessageException(
237-
httpStatus: response.StatusCode,
238-
errorResponseMessage: errorResponse,
239-
errorMessage: message);
238+
throw new ErrorResponseMessageException(
239+
httpStatus: response.StatusCode,
240+
errorResponseMessage: errorResponse,
241+
errorMessage: message);
242+
}
243+
244+
return response;
240245
}
246+
catch (Exception exception)
247+
{
248+
if (exception is OperationCanceledException && !cancellationToken.IsCancellationRequested)
249+
{
250+
throw new TimeoutException("A request times out.");
251+
}
241252

242-
return response;
253+
throw;
254+
}
243255
}
244256
}
245257

0 commit comments

Comments
 (0)