Skip to content

Commit d2f1cd4

Browse files
committed
Fix sample to not timeout during watch
1 parent 6cd598b commit d2f1cd4

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

examples/informers/ServiceCollectionKubernetesExtensions.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Linq;
3+
using System.Threading;
34
using k8s;
45
using k8s.Informers;
56
using k8s.Informers.Cache;
@@ -28,9 +29,13 @@ public static IServiceCollection AddKubernetes(this IServiceCollection services)
2829
services.AddSingleton<RetryDelegatingHandler>();
2930
services.AddHttpClient("DefaultName")
3031
.AddTypedClient<IKubernetes>((httpClient, serviceProvider) =>
31-
new Kubernetes(
32+
{
33+
httpClient.Timeout = Timeout.InfiniteTimeSpan;
34+
return new Kubernetes(
3235
serviceProvider.GetRequiredService<KubernetesClientConfiguration>(),
33-
httpClient))
36+
httpClient);
37+
})
38+
.AddHttpMessageHandler(() => new TimeoutHandler(TimeSpan.FromSeconds(5)))
3439
.AddHttpMessageHandler(() => new RetryDelegatingHandler()
3540
{
3641
RetryPolicy = new RetryPolicy<HttpStatusCodeErrorDetectionStrategy>(new ExponentialBackoffRetryStrategy())

examples/informers/TimeoutHandler.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using System.Linq;
3+
using System.Net.Http;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
using Microsoft.AspNetCore.WebUtilities;
7+
8+
namespace informers
9+
{
10+
internal class TimeoutHandler : DelegatingHandler
11+
{
12+
private readonly TimeSpan _timeout;
13+
14+
public TimeoutHandler(TimeSpan timeout)
15+
{
16+
_timeout = timeout;
17+
}
18+
19+
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
20+
{
21+
var query = QueryHelpers.ParseQuery(request.RequestUri.Query);
22+
23+
if (!(query.TryGetValue("watch", out var values) && values.Any(v => v == "true")))
24+
{
25+
var cts = new CancellationTokenSource(_timeout);
26+
cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, cts.Token).Token;
27+
}
28+
var originResponse = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
29+
30+
return originResponse;
31+
}
32+
33+
}
34+
}

0 commit comments

Comments
 (0)