Skip to content

Commit 6f0f835

Browse files
committed
feat(csharp): endpoint level timeout
1 parent d1cca19 commit 6f0f835

File tree

6 files changed

+67
-12
lines changed

6 files changed

+67
-12
lines changed

clients/algoliasearch-client-csharp/algoliasearch/Http/InternalRequestOptions.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ public InternalRequestOptions(RequestOptions options = null)
2525

2626
CustomPathParameters = new Dictionary<string, string>();
2727
PathParameters = new Dictionary<string, string>();
28-
Timeout = options?.Timeout;
28+
ConnectTimeout = options?.ConnectTimeout;
29+
ReadTimeout = options?.ReadTimeout;
30+
WriteTimeout = options?.WriteTimeout;
2931
}
3032

3133
public void AddQueryParameter(string key, object value)
@@ -76,9 +78,19 @@ public void AddCustomQueryParameters(IDictionary<string, object> values)
7678
public object Data { get; set; }
7779

7880
/// <summary>
79-
/// Request timeout
81+
/// Request read timeout in seconds
8082
/// </summary>
81-
public TimeSpan? Timeout { get; set; }
83+
public TimeSpan? ReadTimeout { get; set; }
84+
85+
/// <summary>
86+
/// Request write timeout in seconds
87+
/// </summary>
88+
public TimeSpan? WriteTimeout { get; set; }
89+
90+
/// <summary>
91+
/// Request connect timeout in seconds
92+
/// </summary>
93+
public TimeSpan? ConnectTimeout { get; set; }
8294

8395
/// <summary>
8496
/// Enforce the Read Transporter

clients/algoliasearch-client-csharp/algoliasearch/Http/RequestOptionBuilder.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,35 @@ public RequestOptionBuilder AddExtraQueryParameters(string key, object value)
4747
}
4848

4949
/// <summary>
50-
/// Set the request timeout
50+
/// Set the request read timeout
5151
/// </summary>
5252
/// <param name="timeout"></param>
5353
/// <returns></returns>
54-
public RequestOptionBuilder SetTimeout(TimeSpan timeout)
54+
public RequestOptionBuilder SetReadTimeout(TimeSpan timeout)
5555
{
56-
_options.Timeout = timeout;
56+
_options.ReadTimeout = timeout;
57+
return this;
58+
}
59+
60+
/// <summary>
61+
/// Set the request write timeout
62+
/// </summary>
63+
/// <param name="timeout"></param>
64+
/// <returns></returns>
65+
public RequestOptionBuilder SetWriteTimeout(TimeSpan timeout)
66+
{
67+
_options.WriteTimeout = timeout;
68+
return this;
69+
}
70+
71+
/// <summary>
72+
/// Set the request connect timeout
73+
/// </summary>
74+
/// <param name="timeout"></param>
75+
/// <returns></returns>
76+
public RequestOptionBuilder SetConnectTimeout(TimeSpan timeout)
77+
{
78+
_options.ConnectTimeout = timeout;
5779
return this;
5880
}
5981

clients/algoliasearch-client-csharp/algoliasearch/Http/RequestOptions.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,17 @@ public class RequestOptions
2222
/// <summary>
2323
/// Request timeout in seconds
2424
/// </summary>
25-
public TimeSpan? Timeout { get; set; }
25+
public TimeSpan? ReadTimeout { get; set; }
26+
27+
/// <summary>
28+
/// Request timeout in seconds
29+
/// </summary>
30+
public TimeSpan? WriteTimeout { get; set; }
31+
32+
/// <summary>
33+
/// Request timeout in seconds
34+
/// </summary>
35+
public TimeSpan? ConnectTimeout { get; set; }
2636

2737
/// <summary>
2838
/// Constructs a new instance of <see cref="RequestOptions"/>
@@ -32,4 +42,7 @@ public RequestOptions()
3242
QueryParameters = new Dictionary<string, object>();
3343
Headers = new Dictionary<string, string>();
3444
}
45+
46+
// overload + operator
47+
3548
}

clients/algoliasearch-client-csharp/algoliasearch/Transport/HttpTransport.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ private async Task<TResult> ExecuteRequestAsync<TResult, TData>(HttpMethod metho
119119
request.Uri = BuildUri(host, uri, requestOptions?.CustomPathParameters, requestOptions?.PathParameters,
120120
requestOptions?.QueryParameters);
121121
var requestTimeout =
122-
TimeSpan.FromTicks((requestOptions?.Timeout ?? GetTimeOut(callType)).Ticks * (host.RetryCount + 1));
122+
TimeSpan.FromTicks((GetTimeOut(callType, requestOptions)).Ticks * (host.RetryCount + 1));
123123

124124
if (request.Body == null && (method == HttpMethod.Post || method == HttpMethod.Put))
125125
{
@@ -137,7 +137,7 @@ private async Task<TResult> ExecuteRequestAsync<TResult, TData>(HttpMethod metho
137137
}
138138

139139
var response = await _httpClient
140-
.SendRequestAsync(request, requestTimeout, _algoliaConfig.ConnectTimeout ?? Defaults.ConnectTimeout, ct)
140+
.SendRequestAsync(request, requestTimeout, requestOptions?.ConnectTimeout ?? _algoliaConfig.ConnectTimeout ?? Defaults.ConnectTimeout, ct)
141141
.ConfigureAwait(false);
142142

143143
_errorMessage = response.Error;
@@ -280,13 +280,14 @@ private static Uri BuildUri(StatefulHost host, string baseUri,
280280
/// Compute the request timeout with the given call type and configuration
281281
/// </summary>
282282
/// <param name="callType"></param>
283+
/// <param name="requestOptions"></param>
283284
/// <returns></returns>
284-
private TimeSpan GetTimeOut(CallType callType)
285+
private TimeSpan GetTimeOut(CallType callType, InternalRequestOptions requestOptions = null)
285286
{
286287
return callType switch
287288
{
288-
CallType.Read => _algoliaConfig.ReadTimeout ?? Defaults.ReadTimeout,
289-
CallType.Write => _algoliaConfig.WriteTimeout ?? Defaults.WriteTimeout,
289+
CallType.Read => requestOptions?.ReadTimeout ?? _algoliaConfig.ReadTimeout ?? Defaults.ReadTimeout,
290+
CallType.Write => requestOptions?.WriteTimeout ?? _algoliaConfig.WriteTimeout ?? Defaults.WriteTimeout,
290291
_ => Defaults.WriteTimeout
291292
};
292293
}

generators/src/main/java/com/algolia/codegen/AlgoliaCSharpGenerator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.algolia.codegen;
22

33
import com.algolia.codegen.exceptions.*;
4+
import com.algolia.codegen.lambda.ToSecondsLambda;
45
import com.algolia.codegen.utils.*;
56
import com.google.common.collect.ImmutableMap.Builder;
67
import com.samskivert.mustache.Mustache;
@@ -177,6 +178,7 @@ protected Builder<String, Lambda> addMustacheLambdas() {
177178
Builder<String, Lambda> lambdas = super.addMustacheLambdas();
178179

179180
lambdas.put("type-to-name", (Mustache.Lambda) (fragment, writer) -> writer.write(typeToName(fragment.execute())));
181+
lambdas.put("toSeconds", new ToSecondsLambda());
180182

181183
return lambdas;
182184
}

templates/csharp/api.mustache

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,11 @@ namespace Algolia.Search.Clients;
226226
{{#x-use-read-transporter}}
227227
requestOptions.UseReadTransporter = true;
228228
{{/x-use-read-transporter}}
229+
{{#vendorExtensions.x-timeouts}}
230+
requestOptions.ReadTimeout ??= TimeSpan.FromSeconds({{#lambda.toSeconds}}{{{read}}}{{/lambda.toSeconds}});
231+
requestOptions.WriteTimeout ??= TimeSpan.FromSeconds({{#lambda.toSeconds}}{{{write}}}{{/lambda.toSeconds}});
232+
requestOptions.ConnectTimeout ??= TimeSpan.FromSeconds({{#lambda.toSeconds}}{{{connect}}}{{/lambda.toSeconds}});
233+
{{/vendorExtensions.x-timeouts}}
229234
{{/vendorExtensions}}
230235
{{#returnType}}return {{/returnType}}await _transport.ExecuteRequestAsync{{#returnType}}<{{> return_type}}>{{/returnType}}(new HttpMethod("{{httpMethod}}"),"{{{path}}}", requestOptions, cancellationToken).ConfigureAwait(false);
231236
}

0 commit comments

Comments
 (0)