Skip to content

Commit 006a569

Browse files
Fixes #6548 (#6618)
Adds an attempt to retrieve the request message from the resilience context in addition to retrieving the request from the response
1 parent 0b17d02 commit 006a569

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

src/Libraries/Microsoft.Extensions.Http.Resilience/Polly/HttpRetryStrategyOptionsExtensions.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Microsoft.Shared.DiagnosticIds;
99
using Microsoft.Shared.Diagnostics;
1010
using Polly;
11+
using Polly.Retry;
1112

1213
namespace Microsoft.Extensions.Http.Resilience;
1314

@@ -52,15 +53,16 @@ public static void DisableFor(this HttpRetryStrategyOptions options, params Http
5253
{
5354
var result = await shouldHandle(args).ConfigureAwait(args.Context.ContinueOnCapturedContext);
5455

55-
if (result &&
56-
args.Outcome.Result is HttpResponseMessage response &&
57-
response.RequestMessage is HttpRequestMessage request)
56+
if (result && GetRequestMessage(args) is HttpRequestMessage request)
5857
{
5958
return !methods.Contains(request.Method);
6059
}
6160

6261
return result;
6362
};
6463
}
64+
65+
private static HttpRequestMessage? GetRequestMessage(RetryPredicateArguments<HttpResponseMessage> args) =>
66+
args.Outcome.Result?.RequestMessage ?? args.Context.GetRequestMessage();
6567
}
6668

test/Libraries/Microsoft.Extensions.Http.Resilience.Tests/Polly/HttpRetryStrategyOptionsExtensionsTests.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,16 @@ public async Task DisableFor_RespectsOriginalShouldHandlePredicate()
6565
}
6666

6767
[Fact]
68-
public async Task DisableFor_ResponseMessageIsNull_DoesNotDisableRetries()
68+
public async Task DisableFor_ResponseMessageIsNull_RetrievesRequestMessageFromContext()
6969
{
7070
var options = new HttpRetryStrategyOptions { ShouldHandle = _ => PredicateResult.True() };
7171
options.DisableFor(HttpMethod.Post);
7272

73-
Assert.True(await options.ShouldHandle(CreatePredicateArguments(null)));
73+
using var request = new HttpRequestMessage { Method = HttpMethod.Post };
74+
var context = ResilienceContextPool.Shared.Get();
75+
context.SetRequestMessage(request);
76+
77+
Assert.False(await options.ShouldHandle(CreatePredicateArguments(null, context)));
7478
}
7579

7680
[Fact]
@@ -80,8 +84,10 @@ public async Task DisableFor_RequestMessageIsNull_DoesNotDisableRetries()
8084
options.DisableFor(HttpMethod.Post);
8185

8286
using var response = new HttpResponseMessage { RequestMessage = null };
87+
var context = ResilienceContextPool.Shared.Get();
88+
context.SetRequestMessage(null);
8389

84-
Assert.True(await options.ShouldHandle(CreatePredicateArguments(response)));
90+
Assert.True(await options.ShouldHandle(CreatePredicateArguments(response, context)));
8591
}
8692

8793
[Theory]
@@ -105,10 +111,10 @@ public async Task DisableForUnsafeHttpMethods_PositiveScenario(string httpMethod
105111
Assert.Equal(shouldHandle, await options.ShouldHandle(CreatePredicateArguments(response)));
106112
}
107113

108-
private static RetryPredicateArguments<HttpResponseMessage> CreatePredicateArguments(HttpResponseMessage? response)
114+
private static RetryPredicateArguments<HttpResponseMessage> CreatePredicateArguments(HttpResponseMessage? response, ResilienceContext? context = null)
109115
{
110116
return new RetryPredicateArguments<HttpResponseMessage>(
111-
ResilienceContextPool.Shared.Get(),
117+
context ?? ResilienceContextPool.Shared.Get(),
112118
Outcome.FromResult(response),
113119
attemptNumber: 1);
114120
}

0 commit comments

Comments
 (0)