Skip to content

Commit c09b49a

Browse files
authored
Refactor client overloads (#7880)
* Simplify overloads and avoid repeated code * Ensure we pass cancellation token to transport
1 parent cf49d17 commit c09b49a

File tree

2 files changed

+16
-273
lines changed

2 files changed

+16
-273
lines changed

src/Elastic.Clients.Elasticsearch/Client/ElasticsearchClient.cs

+11-240
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,8 @@ internal ElasticsearchClient(HttpTransport<IElasticsearchClientSettings> transpo
7676

7777
public IElasticsearchClientSettings ElasticsearchClientSettings => _transport.Settings;
7878
public Inferrer Infer => _transport.Settings.Inferrer;
79-
8079
public Serializer RequestResponseSerializer => _transport.Settings.RequestResponseSerializer;
8180
public Serializer SourceSerializer => _transport.Settings.SourceSerializer;
82-
8381
public HttpTransport Transport => _transport;
8482

8583
private ProductCheckStatus _productCheckStatus;
@@ -93,83 +91,15 @@ private enum ProductCheckStatus
9391

9492
private partial void SetupNamespaces();
9593

96-
internal TResponse DoRequest<TRequest, TResponse, TRequestParameters>(
97-
TRequest request,
98-
TRequestParameters? parameters,
99-
Action<IRequestConfiguration>? forceConfiguration = null)
94+
internal TResponse DoRequest<TRequest, TResponse, TRequestParameters>(TRequest request)
10095
where TRequest : Request<TRequestParameters>
10196
where TResponse : ElasticsearchResponse, new()
102-
where TRequestParameters : RequestParameters, new()
103-
{
104-
if (_productCheckStatus == ProductCheckStatus.Failed)
105-
throw new UnsupportedProductException(UnsupportedProductException.InvalidProductError);
106-
107-
var requestModified = false;
108-
var hadRequestConfig = false;
109-
HeadersList? originalHeaders = null;
110-
111-
// If we have not yet checked the product name, add the product header to the list of headers to parse.
112-
if (_productCheckStatus == ProductCheckStatus.NotChecked)
113-
{
114-
requestModified = true;
115-
if (request.RequestParameters.RequestConfiguration is null)
116-
{
117-
request.RequestParameters.RequestConfiguration = new RequestConfiguration();
118-
}
119-
else
120-
{
121-
originalHeaders = request.RequestParameters.RequestConfiguration.ResponseHeadersToParse;
122-
hadRequestConfig = true;
123-
}
124-
125-
if (request.RequestParameters.RequestConfiguration.ResponseHeadersToParse.Count == 0)
126-
{
127-
request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = new HeadersList("x-elastic-product");
128-
}
129-
else
130-
{
131-
request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = new HeadersList(request.RequestParameters.RequestConfiguration.ResponseHeadersToParse, "x-elastic-product");
132-
}
133-
}
134-
135-
var (resolvedUrl, urlTemplate, postData) = PrepareRequest<TRequest, TRequestParameters>(request, forceConfiguration);
136-
137-
TResponse response;
138-
139-
using (var activity = _activitySource.StartActivity($"Elasticsearch: {request.HttpMethod} {urlTemplate}", ActivityKind.Client))
140-
{
141-
activity?.SetTag("db.system", "elasticsearch");
142-
activity?.SetCustomProperty("elastic.transport.client", true);
143-
144-
response = _transport.Request<TResponse>(request.HttpMethod, resolvedUrl, postData, request.RequestParameters);
145-
146-
if (response.ApiCallDetails.RequestBodyInBytes is not null)
147-
activity?.SetTag("db.statement", System.Text.Encoding.UTF8.GetString(response.ApiCallDetails.RequestBodyInBytes));
148-
}
149-
150-
PostRequestProductCheck<TRequest, TResponse>(request, response);
151-
152-
if (_productCheckStatus == ProductCheckStatus.Failed)
153-
throw new UnsupportedProductException(UnsupportedProductException.InvalidProductError);
154-
155-
if (requestModified)
156-
{
157-
if (!hadRequestConfig)
158-
{
159-
request.RequestParameters.RequestConfiguration = null;
160-
}
161-
else if (originalHeaders.HasValue && originalHeaders.Value.Count > 0)
162-
{
163-
request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = originalHeaders.Value;
164-
}
165-
}
166-
167-
return response;
168-
}
97+
where TRequestParameters : RequestParameters, new() =>
98+
DoRequest<TRequest, TResponse, TRequestParameters>(request, null);
16999

170100
internal TResponse DoRequest<TRequest, TResponse, TRequestParameters>(
171101
TRequest request,
172-
Action<IRequestConfiguration>? forceConfiguration = null)
102+
Action<IRequestConfiguration>? forceConfiguration)
173103
where TRequest : Request<TRequestParameters>
174104
where TResponse : ElasticsearchResponse, new()
175105
where TRequestParameters : RequestParameters, new()
@@ -240,175 +170,17 @@ internal TResponse DoRequest<TRequest, TResponse, TRequestParameters>(
240170
return response;
241171
}
242172

243-
internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>(
244-
TRequest request,
245-
RequestParameters? parameters,
246-
CancellationToken cancellationToken = default)
247-
where TRequest : Request<TRequestParameters>
248-
where TResponse : ElasticsearchResponse, new()
249-
where TRequestParameters : RequestParameters, new()
250-
{
251-
if (_productCheckStatus == ProductCheckStatus.Failed)
252-
throw new UnsupportedProductException(UnsupportedProductException.InvalidProductError);
253-
254-
var requestModified = false;
255-
var hadRequestConfig = false;
256-
HeadersList? originalHeaders = null;
257-
258-
// If we have not yet checked the product name, add the product header to the list of headers to parse.
259-
if (_productCheckStatus == ProductCheckStatus.NotChecked)
260-
{
261-
requestModified = true;
262-
263-
if (request.RequestParameters.RequestConfiguration is null)
264-
{
265-
request.RequestParameters.RequestConfiguration = new RequestConfiguration();
266-
}
267-
else
268-
{
269-
originalHeaders = request.RequestParameters.RequestConfiguration.ResponseHeadersToParse;
270-
hadRequestConfig = true;
271-
}
272-
273-
if (request.RequestParameters.RequestConfiguration.ResponseHeadersToParse.Count == 0)
274-
{
275-
request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = new HeadersList("x-elastic-product");
276-
}
277-
else
278-
{
279-
request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = new HeadersList(request.RequestParameters.RequestConfiguration.ResponseHeadersToParse, "x-elastic-product");
280-
}
281-
}
282-
283-
var (resolvedUrl, urlTemplate, postData) = PrepareRequest<TRequest, TRequestParameters>(request, null);
284-
285-
if (_productCheckStatus == ProductCheckStatus.Succeeded && !requestModified && !_activitySource.HasListeners())
286-
return _transport.RequestAsync<TResponse>(request.HttpMethod, resolvedUrl, postData, parameters, cancellationToken);
287-
288-
return SendRequest(request, parameters, resolvedUrl, postData, hadRequestConfig, originalHeaders);
289-
290-
async Task<TResponse> SendRequest(TRequest request, RequestParameters? parameters, string url, PostData postData, bool hadRequestConfig, HeadersList? originalHeaders)
291-
{
292-
TResponse response;
293-
294-
using (var activity = _activitySource.StartActivity($"Elasticsearch: {request.HttpMethod} {urlTemplate}", ActivityKind.Client))
295-
{
296-
activity?.AddTag("db.system", "elasticsearch");
297-
activity?.SetCustomProperty("elastic.transport.client", true);
298-
299-
response = await _transport.RequestAsync<TResponse>(request.HttpMethod, url, postData, parameters).ConfigureAwait(false);
300-
301-
if (response.ApiCallDetails.RequestBodyInBytes is not null)
302-
activity?.AddTag("db.statement", System.Text.Encoding.UTF8.GetString(response.ApiCallDetails.RequestBodyInBytes));
303-
}
304-
305-
PostRequestProductCheck<TRequest, TResponse>(request, response);
306-
307-
if (_productCheckStatus == ProductCheckStatus.Failed)
308-
throw new UnsupportedProductException(UnsupportedProductException.InvalidProductError);
309-
310-
if (request.RequestParameters.RequestConfiguration is not null)
311-
{
312-
if (!hadRequestConfig)
313-
{
314-
request.RequestParameters.RequestConfiguration = null;
315-
}
316-
else if (originalHeaders.HasValue && originalHeaders.Value.Count > 0)
317-
{
318-
request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = originalHeaders.Value;
319-
}
320-
}
321-
322-
return response;
323-
}
324-
}
325-
326173
internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>(
327174
TRequest request,
328175
CancellationToken cancellationToken = default)
329176
where TRequest : Request<TRequestParameters>
330177
where TResponse : ElasticsearchResponse, new()
331178
where TRequestParameters : RequestParameters, new()
332-
{
333-
if (_productCheckStatus == ProductCheckStatus.Failed)
334-
throw new UnsupportedProductException(UnsupportedProductException.InvalidProductError);
335-
336-
var requestModified = false;
337-
var hadRequestConfig = false;
338-
HeadersList? originalHeaders = null;
339-
340-
// If we have not yet checked the product name, add the product header to the list of headers to parse.
341-
if (_productCheckStatus == ProductCheckStatus.NotChecked)
342-
{
343-
requestModified = true;
344-
345-
if (request.RequestParameters.RequestConfiguration is null)
346-
{
347-
request.RequestParameters.RequestConfiguration = new RequestConfiguration();
348-
}
349-
else
350-
{
351-
originalHeaders = request.RequestParameters.RequestConfiguration.ResponseHeadersToParse;
352-
hadRequestConfig = true;
353-
}
354-
355-
if (request.RequestParameters.RequestConfiguration.ResponseHeadersToParse.Count == 0)
356-
{
357-
request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = new HeadersList("x-elastic-product");
358-
}
359-
else
360-
{
361-
request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = new HeadersList(request.RequestParameters.RequestConfiguration.ResponseHeadersToParse, "x-elastic-product");
362-
}
363-
}
364-
365-
var (resolvedUrl, urlTemplate, postData) = PrepareRequest<TRequest, TRequestParameters>(request, null);
366-
367-
if (_productCheckStatus == ProductCheckStatus.Succeeded && !requestModified && !_activitySource.HasListeners())
368-
return _transport.RequestAsync<TResponse>(request.HttpMethod, resolvedUrl, postData, request.RequestParameters, cancellationToken);
369-
370-
return SendRequest(request, request.RequestParameters, resolvedUrl, postData, hadRequestConfig, originalHeaders);
371-
372-
async Task<TResponse> SendRequest(TRequest request, RequestParameters? parameters, string url, PostData postData, bool hadRequestConfig, HeadersList? originalHeaders)
373-
{
374-
TResponse response;
375-
376-
using (var activity = _activitySource.StartActivity($"Elasticsearch: {request.HttpMethod} {urlTemplate}", ActivityKind.Client))
377-
{
378-
activity?.AddTag("db.system", "elasticsearch");
379-
activity?.SetCustomProperty("elastic.transport.client", true);
380-
381-
response = await _transport.RequestAsync<TResponse>(request.HttpMethod, url, postData, parameters).ConfigureAwait(false);
382-
383-
if (response.ApiCallDetails.RequestBodyInBytes is not null)
384-
activity?.AddTag("db.statement", System.Text.Encoding.UTF8.GetString(response.ApiCallDetails.RequestBodyInBytes));
385-
}
386-
387-
PostRequestProductCheck<TRequest, TResponse>(request, response);
388-
389-
if (_productCheckStatus == ProductCheckStatus.Failed)
390-
throw new UnsupportedProductException(UnsupportedProductException.InvalidProductError);
391-
392-
if (request.RequestParameters.RequestConfiguration is not null)
393-
{
394-
if (!hadRequestConfig)
395-
{
396-
request.RequestParameters.RequestConfiguration = null;
397-
}
398-
else if (originalHeaders.HasValue && originalHeaders.Value.Count > 0)
399-
{
400-
request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = originalHeaders.Value;
401-
}
402-
}
403-
404-
return response;
405-
}
406-
}
179+
=> DoRequestAsync<TRequest, TResponse, TRequestParameters>(request, null, cancellationToken);
407180

408181
internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>(
409182
TRequest request,
410-
RequestParameters? parameters,
411-
Action<IRequestConfiguration>? forceConfiguration = null,
183+
Action<IRequestConfiguration>? forceConfiguration,
412184
CancellationToken cancellationToken = default)
413185
where TRequest : Request<TRequestParameters>
414186
where TResponse : ElasticsearchResponse, new()
@@ -446,12 +218,11 @@ internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>
446218
}
447219
}
448220

449-
var (resolvedUrl, urlTemplate, postData) = PrepareRequest<TRequest, TRequestParameters>(request, null);
450-
451-
if (_productCheckStatus == ProductCheckStatus.Succeeded && !requestModified && !_activitySource.HasListeners())
452-
return _transport.RequestAsync<TResponse>(request.HttpMethod, resolvedUrl, postData, parameters, cancellationToken);
221+
var (resolvedUrl, urlTemplate, postData) = PrepareRequest<TRequest, TRequestParameters>(request, forceConfiguration);
453222

454-
return SendRequest(request, parameters, resolvedUrl, postData, hadRequestConfig, originalHeaders);
223+
return _productCheckStatus == ProductCheckStatus.Succeeded && !requestModified && !_activitySource.HasListeners()
224+
? _transport.RequestAsync<TResponse>(request.HttpMethod, resolvedUrl, postData, request.RequestParameters, cancellationToken)
225+
: SendRequest(request, request.RequestParameters, resolvedUrl, postData, hadRequestConfig, originalHeaders);
455226

456227
async Task<TResponse> SendRequest(TRequest request, RequestParameters? parameters, string url, PostData postData, bool hadRequestConfig, HeadersList? originalHeaders)
457228
{
@@ -462,7 +233,7 @@ async Task<TResponse> SendRequest(TRequest request, RequestParameters? parameter
462233
activity?.AddTag("db.system", "elasticsearch");
463234
activity?.SetCustomProperty("elastic.transport.client", true);
464235

465-
response = await _transport.RequestAsync<TResponse>(request.HttpMethod, url, postData, parameters).ConfigureAwait(false);
236+
response = await _transport.RequestAsync<TResponse>(request.HttpMethod, url, postData, parameters, cancellationToken).ConfigureAwait(false);
466237

467238
if (response.ApiCallDetails.RequestBodyInBytes is not null)
468239
activity?.AddTag("db.statement", System.Text.Encoding.UTF8.GetString(response.ApiCallDetails.RequestBodyInBytes));

src/Elastic.Clients.Elasticsearch/Client/NamespacedClientProxy.cs

+5-33
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,15 @@ protected NamespacedClientProxy() { }
2525

2626
internal NamespacedClientProxy(ElasticsearchClient client) => _client = client;
2727

28-
internal TResponse DoRequest<TRequest, TResponse, TRequestParameters>(
29-
TRequest request,
30-
TRequestParameters parameters,
31-
Action<IRequestConfiguration>? forceConfiguration = null)
28+
internal TResponse DoRequest<TRequest, TResponse, TRequestParameters>(TRequest request)
3229
where TRequest : Request<TRequestParameters>
3330
where TResponse : ElasticsearchResponse, new()
3431
where TRequestParameters : RequestParameters, new()
35-
{
36-
if (_client is null)
37-
ThrowHelper.ThrowInvalidOperationException(InvalidOperation);
38-
39-
return _client.DoRequest<TRequest, TResponse, TRequestParameters>(request, parameters, forceConfiguration);
40-
}
32+
=> DoRequest<TRequest, TResponse, TRequestParameters>(request, null);
4133

4234
internal TResponse DoRequest<TRequest, TResponse, TRequestParameters>(
4335
TRequest request,
44-
Action<IRequestConfiguration>? forceConfiguration = null)
36+
Action<IRequestConfiguration>? forceConfiguration)
4537
where TRequest : Request<TRequestParameters>
4638
where TResponse : ElasticsearchResponse, new()
4739
where TRequestParameters : RequestParameters, new()
@@ -58,30 +50,10 @@ internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>
5850
where TRequest : Request<TRequestParameters>
5951
where TResponse : ElasticsearchResponse, new()
6052
where TRequestParameters : RequestParameters, new()
61-
{
62-
if (_client is null)
63-
ThrowHelper.ThrowInvalidOperationException(InvalidOperation);
64-
65-
return _client.DoRequestAsync<TRequest, TResponse, TRequestParameters>(request, cancellationToken: cancellationToken);
66-
}
67-
68-
internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>(
69-
TRequest request,
70-
TRequestParameters parameters,
71-
CancellationToken cancellationToken = default)
72-
where TRequest : Request<TRequestParameters>
73-
where TResponse : ElasticsearchResponse, new()
74-
where TRequestParameters : RequestParameters, new()
75-
{
76-
if (_client is null)
77-
ThrowHelper.ThrowInvalidOperationException(InvalidOperation);
78-
79-
return _client.DoRequestAsync<TRequest, TResponse, TRequestParameters>(request, parameters, cancellationToken: cancellationToken);
80-
}
53+
=> DoRequestAsync<TRequest, TResponse, TRequestParameters>(request, null, cancellationToken);
8154

8255
internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>(
8356
TRequest request,
84-
TRequestParameters parameters,
8557
Action<IRequestConfiguration>? forceConfiguration,
8658
CancellationToken cancellationToken = default)
8759
where TRequest : Request<TRequestParameters>
@@ -91,6 +63,6 @@ internal Task<TResponse> DoRequestAsync<TRequest, TResponse, TRequestParameters>
9163
if (_client is null)
9264
ThrowHelper.ThrowInvalidOperationException(InvalidOperation);
9365

94-
return _client.DoRequestAsync<TRequest, TResponse, TRequestParameters>(request, parameters, forceConfiguration, cancellationToken);
66+
return _client.DoRequestAsync<TRequest, TResponse, TRequestParameters>(request, forceConfiguration, cancellationToken);
9567
}
9668
}

0 commit comments

Comments
 (0)