@@ -46,21 +46,34 @@ let retryPipeline =
46
46
ResiliencePipelineBuilder()
47
47
.AddRetry( RetryStrategyOptions())
48
48
.Build()
49
+ type Success = Success
49
50
let checkLinkStatus ( client : HttpClient ) ( url : string ) = task {
50
51
try
51
52
lock printLock ( fun () -> printfn $" Verifying link {url}…" )
52
- let! response = retryPipeline.ExecuteAsync(
53
- fun _ -> ValueTask< HttpResponseMessage>( client.GetAsync url)
54
- )
55
- if response.StatusCode <> HttpStatusCode.OK then
53
+ let context = ResilienceContextPool.Shared.Get()
54
+ try
55
+ let! result = retryPipeline.ExecuteOutcomeAsync(
56
+ ( fun _ _ -> ValueTask< Outcome< Success>>( task {
57
+ let! response = client.GetAsync url
58
+ return
59
+ match response.StatusCode with
60
+ | HttpStatusCode.OK -> Outcome.FromResult( Success)
61
+ | code when Map.tryFind url exclusionCodes = Some code -> Outcome.FromResult( Success)
62
+ | code -> Outcome.FromException( Exception $" Status code {int code}." )
63
+ })),
64
+ context,
65
+ null
66
+ )
56
67
return
57
- match Map.tryFind url exclusionCodes with
58
- | Some code when code = response.StatusCode -> Result.Ok()
59
- | _ -> Result.Error $" Status code {int response.StatusCode}."
60
- else
61
- return Result.Ok()
68
+ match result with
69
+ | _ when not ( isNull( box result.Result)) -> Result.Ok()
70
+ | _ when result.Exception <> null -> Result.Error( result.Exception.Message)
71
+ | _ -> failwithf " Neither result nor exception was set."
72
+
73
+ finally
74
+ ResilienceContextPool.Shared.Return context
62
75
with
63
- | error -> return Result.Error $" Exception {error.Message }"
76
+ | error -> return Result.Error $" Internal script error: {error}"
64
77
}
65
78
66
79
let isNonLocalLink ( link : string ) =
0 commit comments