Skip to content

Commit bf11787

Browse files
authored
Merge pull request #787 from LockTar/f/fix-409-conflict-errorcode
Add retry logic for 409 response with specific Conflict error code
2 parents 9ccaaae + b9b8177 commit bf11787

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

tools/code/common/Http.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,7 @@ private static bool ShouldRetryInner(HttpMessage message, Exception? exception)
402402
(message, exception) switch
403403
{
404404
({ Response.Status: 422 or 409 }, _) when HasManagementApiRequestFailedError(message.Response) => true,
405+
({ Response.Status: 409 }, _) when HasConflictError(message.Response) && HasOperationOnTheApiIsInProgressMessage(message.Response) => true,
405406
({ Response.Status: 412 }, _) => true,
406407
({ Response.Status: 429 }, _) => true,
407408
_ => false
@@ -418,6 +419,16 @@ private static bool HasManagementApiRequestFailedError(Response response) =>
418419
.Where(code => code.Equals("ManagementApiRequestFailed", StringComparison.OrdinalIgnoreCase))
419420
.IsSome;
420421

422+
private static bool HasConflictError(Response response) =>
423+
TryGetErrorCode(response)
424+
.Where(code => code.Equals("Conflict", StringComparison.OrdinalIgnoreCase))
425+
.IsSome;
426+
427+
private static bool HasOperationOnTheApiIsInProgressMessage(Response response) =>
428+
TryGetMessage(response)
429+
.Where(code => code.Equals("Operation on the API is in progress", StringComparison.OrdinalIgnoreCase))
430+
.IsSome;
431+
421432
private static Option<string> TryGetErrorCode(Response response)
422433
{
423434
try
@@ -433,6 +444,22 @@ private static Option<string> TryGetErrorCode(Response response)
433444
return Option<string>.None;
434445
}
435446
}
447+
448+
private static Option<string> TryGetMessage(Response response)
449+
{
450+
try
451+
{
452+
return response.Content
453+
.ToObjectFromJson<JsonObject>()
454+
.TryGetJsonObjectProperty("error")
455+
.Bind(error => error.TryGetStringProperty("message"))
456+
.ToOption();
457+
}
458+
catch (Exception exception) when (exception is ArgumentNullException or NotSupportedException or JsonException)
459+
{
460+
return Option<string>.None;
461+
}
462+
}
436463
}
437464

438465
public class TelemetryPolicy(Version version) : HttpPipelinePolicy

0 commit comments

Comments
 (0)