From 6164f79d6efa285e204d582dbef077098f424f9e Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Tue, 8 Aug 2023 13:21:07 +0100 Subject: [PATCH 1/2] Simplify overloads and avoid repeated code --- .../Client/ElasticsearchClient.cs | 249 +----------------- .../Client/NamespacedClientProxy.cs | 38 +-- 2 files changed, 15 insertions(+), 272 deletions(-) diff --git a/src/Elastic.Clients.Elasticsearch/Client/ElasticsearchClient.cs b/src/Elastic.Clients.Elasticsearch/Client/ElasticsearchClient.cs index 6088902b954..5449c84850b 100644 --- a/src/Elastic.Clients.Elasticsearch/Client/ElasticsearchClient.cs +++ b/src/Elastic.Clients.Elasticsearch/Client/ElasticsearchClient.cs @@ -76,10 +76,8 @@ internal ElasticsearchClient(HttpTransport transpo public IElasticsearchClientSettings ElasticsearchClientSettings => _transport.Settings; public Inferrer Infer => _transport.Settings.Inferrer; - public Serializer RequestResponseSerializer => _transport.Settings.RequestResponseSerializer; public Serializer SourceSerializer => _transport.Settings.SourceSerializer; - public HttpTransport Transport => _transport; private ProductCheckStatus _productCheckStatus; @@ -93,83 +91,15 @@ private enum ProductCheckStatus private partial void SetupNamespaces(); - internal TResponse DoRequest( - TRequest request, - TRequestParameters? parameters, - Action? forceConfiguration = null) + internal TResponse DoRequest(TRequest request) where TRequest : Request where TResponse : ElasticsearchResponse, new() - where TRequestParameters : RequestParameters, new() - { - if (_productCheckStatus == ProductCheckStatus.Failed) - throw new UnsupportedProductException(UnsupportedProductException.InvalidProductError); - - var requestModified = false; - var hadRequestConfig = false; - HeadersList? originalHeaders = null; - - // If we have not yet checked the product name, add the product header to the list of headers to parse. - if (_productCheckStatus == ProductCheckStatus.NotChecked) - { - requestModified = true; - if (request.RequestParameters.RequestConfiguration is null) - { - request.RequestParameters.RequestConfiguration = new RequestConfiguration(); - } - else - { - originalHeaders = request.RequestParameters.RequestConfiguration.ResponseHeadersToParse; - hadRequestConfig = true; - } - - if (request.RequestParameters.RequestConfiguration.ResponseHeadersToParse.Count == 0) - { - request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = new HeadersList("x-elastic-product"); - } - else - { - request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = new HeadersList(request.RequestParameters.RequestConfiguration.ResponseHeadersToParse, "x-elastic-product"); - } - } - - var (resolvedUrl, urlTemplate, postData) = PrepareRequest(request, forceConfiguration); - - TResponse response; - - using (var activity = _activitySource.StartActivity($"Elasticsearch: {request.HttpMethod} {urlTemplate}", ActivityKind.Client)) - { - activity?.SetTag("db.system", "elasticsearch"); - activity?.SetCustomProperty("elastic.transport.client", true); - - response = _transport.Request(request.HttpMethod, resolvedUrl, postData, request.RequestParameters); - - if (response.ApiCallDetails.RequestBodyInBytes is not null) - activity?.SetTag("db.statement", System.Text.Encoding.UTF8.GetString(response.ApiCallDetails.RequestBodyInBytes)); - } - - PostRequestProductCheck(request, response); - - if (_productCheckStatus == ProductCheckStatus.Failed) - throw new UnsupportedProductException(UnsupportedProductException.InvalidProductError); - - if (requestModified) - { - if (!hadRequestConfig) - { - request.RequestParameters.RequestConfiguration = null; - } - else if (originalHeaders.HasValue && originalHeaders.Value.Count > 0) - { - request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = originalHeaders.Value; - } - } - - return response; - } + where TRequestParameters : RequestParameters, new() => + DoRequest(request, null); internal TResponse DoRequest( TRequest request, - Action? forceConfiguration = null) + Action? forceConfiguration) where TRequest : Request where TResponse : ElasticsearchResponse, new() where TRequestParameters : RequestParameters, new() @@ -240,175 +170,17 @@ internal TResponse DoRequest( return response; } - internal Task DoRequestAsync( - TRequest request, - RequestParameters? parameters, - CancellationToken cancellationToken = default) - where TRequest : Request - where TResponse : ElasticsearchResponse, new() - where TRequestParameters : RequestParameters, new() - { - if (_productCheckStatus == ProductCheckStatus.Failed) - throw new UnsupportedProductException(UnsupportedProductException.InvalidProductError); - - var requestModified = false; - var hadRequestConfig = false; - HeadersList? originalHeaders = null; - - // If we have not yet checked the product name, add the product header to the list of headers to parse. - if (_productCheckStatus == ProductCheckStatus.NotChecked) - { - requestModified = true; - - if (request.RequestParameters.RequestConfiguration is null) - { - request.RequestParameters.RequestConfiguration = new RequestConfiguration(); - } - else - { - originalHeaders = request.RequestParameters.RequestConfiguration.ResponseHeadersToParse; - hadRequestConfig = true; - } - - if (request.RequestParameters.RequestConfiguration.ResponseHeadersToParse.Count == 0) - { - request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = new HeadersList("x-elastic-product"); - } - else - { - request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = new HeadersList(request.RequestParameters.RequestConfiguration.ResponseHeadersToParse, "x-elastic-product"); - } - } - - var (resolvedUrl, urlTemplate, postData) = PrepareRequest(request, null); - - if (_productCheckStatus == ProductCheckStatus.Succeeded && !requestModified && !_activitySource.HasListeners()) - return _transport.RequestAsync(request.HttpMethod, resolvedUrl, postData, parameters, cancellationToken); - - return SendRequest(request, parameters, resolvedUrl, postData, hadRequestConfig, originalHeaders); - - async Task SendRequest(TRequest request, RequestParameters? parameters, string url, PostData postData, bool hadRequestConfig, HeadersList? originalHeaders) - { - TResponse response; - - using (var activity = _activitySource.StartActivity($"Elasticsearch: {request.HttpMethod} {urlTemplate}", ActivityKind.Client)) - { - activity?.AddTag("db.system", "elasticsearch"); - activity?.SetCustomProperty("elastic.transport.client", true); - - response = await _transport.RequestAsync(request.HttpMethod, url, postData, parameters).ConfigureAwait(false); - - if (response.ApiCallDetails.RequestBodyInBytes is not null) - activity?.AddTag("db.statement", System.Text.Encoding.UTF8.GetString(response.ApiCallDetails.RequestBodyInBytes)); - } - - PostRequestProductCheck(request, response); - - if (_productCheckStatus == ProductCheckStatus.Failed) - throw new UnsupportedProductException(UnsupportedProductException.InvalidProductError); - - if (request.RequestParameters.RequestConfiguration is not null) - { - if (!hadRequestConfig) - { - request.RequestParameters.RequestConfiguration = null; - } - else if (originalHeaders.HasValue && originalHeaders.Value.Count > 0) - { - request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = originalHeaders.Value; - } - } - - return response; - } - } - internal Task DoRequestAsync( TRequest request, CancellationToken cancellationToken = default) where TRequest : Request where TResponse : ElasticsearchResponse, new() where TRequestParameters : RequestParameters, new() - { - if (_productCheckStatus == ProductCheckStatus.Failed) - throw new UnsupportedProductException(UnsupportedProductException.InvalidProductError); - - var requestModified = false; - var hadRequestConfig = false; - HeadersList? originalHeaders = null; - - // If we have not yet checked the product name, add the product header to the list of headers to parse. - if (_productCheckStatus == ProductCheckStatus.NotChecked) - { - requestModified = true; - - if (request.RequestParameters.RequestConfiguration is null) - { - request.RequestParameters.RequestConfiguration = new RequestConfiguration(); - } - else - { - originalHeaders = request.RequestParameters.RequestConfiguration.ResponseHeadersToParse; - hadRequestConfig = true; - } - - if (request.RequestParameters.RequestConfiguration.ResponseHeadersToParse.Count == 0) - { - request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = new HeadersList("x-elastic-product"); - } - else - { - request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = new HeadersList(request.RequestParameters.RequestConfiguration.ResponseHeadersToParse, "x-elastic-product"); - } - } - - var (resolvedUrl, urlTemplate, postData) = PrepareRequest(request, null); - - if (_productCheckStatus == ProductCheckStatus.Succeeded && !requestModified && !_activitySource.HasListeners()) - return _transport.RequestAsync(request.HttpMethod, resolvedUrl, postData, request.RequestParameters, cancellationToken); - - return SendRequest(request, request.RequestParameters, resolvedUrl, postData, hadRequestConfig, originalHeaders); - - async Task SendRequest(TRequest request, RequestParameters? parameters, string url, PostData postData, bool hadRequestConfig, HeadersList? originalHeaders) - { - TResponse response; - - using (var activity = _activitySource.StartActivity($"Elasticsearch: {request.HttpMethod} {urlTemplate}", ActivityKind.Client)) - { - activity?.AddTag("db.system", "elasticsearch"); - activity?.SetCustomProperty("elastic.transport.client", true); - - response = await _transport.RequestAsync(request.HttpMethod, url, postData, parameters).ConfigureAwait(false); - - if (response.ApiCallDetails.RequestBodyInBytes is not null) - activity?.AddTag("db.statement", System.Text.Encoding.UTF8.GetString(response.ApiCallDetails.RequestBodyInBytes)); - } - - PostRequestProductCheck(request, response); - - if (_productCheckStatus == ProductCheckStatus.Failed) - throw new UnsupportedProductException(UnsupportedProductException.InvalidProductError); - - if (request.RequestParameters.RequestConfiguration is not null) - { - if (!hadRequestConfig) - { - request.RequestParameters.RequestConfiguration = null; - } - else if (originalHeaders.HasValue && originalHeaders.Value.Count > 0) - { - request.RequestParameters.RequestConfiguration.ResponseHeadersToParse = originalHeaders.Value; - } - } - - return response; - } - } + => DoRequestAsync(request, null, cancellationToken); internal Task DoRequestAsync( TRequest request, - RequestParameters? parameters, - Action? forceConfiguration = null, + Action? forceConfiguration, CancellationToken cancellationToken = default) where TRequest : Request where TResponse : ElasticsearchResponse, new() @@ -446,12 +218,11 @@ internal Task DoRequestAsync } } - var (resolvedUrl, urlTemplate, postData) = PrepareRequest(request, null); - - if (_productCheckStatus == ProductCheckStatus.Succeeded && !requestModified && !_activitySource.HasListeners()) - return _transport.RequestAsync(request.HttpMethod, resolvedUrl, postData, parameters, cancellationToken); + var (resolvedUrl, urlTemplate, postData) = PrepareRequest(request, forceConfiguration); - return SendRequest(request, parameters, resolvedUrl, postData, hadRequestConfig, originalHeaders); + return _productCheckStatus == ProductCheckStatus.Succeeded && !requestModified && !_activitySource.HasListeners() + ? _transport.RequestAsync(request.HttpMethod, resolvedUrl, postData, request.RequestParameters, cancellationToken) + : SendRequest(request, request.RequestParameters, resolvedUrl, postData, hadRequestConfig, originalHeaders); async Task SendRequest(TRequest request, RequestParameters? parameters, string url, PostData postData, bool hadRequestConfig, HeadersList? originalHeaders) { diff --git a/src/Elastic.Clients.Elasticsearch/Client/NamespacedClientProxy.cs b/src/Elastic.Clients.Elasticsearch/Client/NamespacedClientProxy.cs index b1c778ac58d..6e953b03fae 100644 --- a/src/Elastic.Clients.Elasticsearch/Client/NamespacedClientProxy.cs +++ b/src/Elastic.Clients.Elasticsearch/Client/NamespacedClientProxy.cs @@ -25,23 +25,15 @@ protected NamespacedClientProxy() { } internal NamespacedClientProxy(ElasticsearchClient client) => _client = client; - internal TResponse DoRequest( - TRequest request, - TRequestParameters parameters, - Action? forceConfiguration = null) + internal TResponse DoRequest(TRequest request) where TRequest : Request where TResponse : ElasticsearchResponse, new() where TRequestParameters : RequestParameters, new() - { - if (_client is null) - ThrowHelper.ThrowInvalidOperationException(InvalidOperation); - - return _client.DoRequest(request, parameters, forceConfiguration); - } + => DoRequest(request, null); internal TResponse DoRequest( TRequest request, - Action? forceConfiguration = null) + Action? forceConfiguration) where TRequest : Request where TResponse : ElasticsearchResponse, new() where TRequestParameters : RequestParameters, new() @@ -58,30 +50,10 @@ internal Task DoRequestAsync where TRequest : Request where TResponse : ElasticsearchResponse, new() where TRequestParameters : RequestParameters, new() - { - if (_client is null) - ThrowHelper.ThrowInvalidOperationException(InvalidOperation); - - return _client.DoRequestAsync(request, cancellationToken: cancellationToken); - } - - internal Task DoRequestAsync( - TRequest request, - TRequestParameters parameters, - CancellationToken cancellationToken = default) - where TRequest : Request - where TResponse : ElasticsearchResponse, new() - where TRequestParameters : RequestParameters, new() - { - if (_client is null) - ThrowHelper.ThrowInvalidOperationException(InvalidOperation); - - return _client.DoRequestAsync(request, parameters, cancellationToken: cancellationToken); - } + => DoRequestAsync(request, null, cancellationToken); internal Task DoRequestAsync( TRequest request, - TRequestParameters parameters, Action? forceConfiguration, CancellationToken cancellationToken = default) where TRequest : Request @@ -91,6 +63,6 @@ internal Task DoRequestAsync if (_client is null) ThrowHelper.ThrowInvalidOperationException(InvalidOperation); - return _client.DoRequestAsync(request, parameters, forceConfiguration, cancellationToken); + return _client.DoRequestAsync(request, forceConfiguration, cancellationToken); } } From 6ac03301c748c1ebe740e1cb4461f9f65160d593 Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Tue, 8 Aug 2023 13:21:28 +0100 Subject: [PATCH 2/2] Ensure we pass cancellation token to transport --- src/Elastic.Clients.Elasticsearch/Client/ElasticsearchClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Elastic.Clients.Elasticsearch/Client/ElasticsearchClient.cs b/src/Elastic.Clients.Elasticsearch/Client/ElasticsearchClient.cs index 5449c84850b..df8486410fa 100644 --- a/src/Elastic.Clients.Elasticsearch/Client/ElasticsearchClient.cs +++ b/src/Elastic.Clients.Elasticsearch/Client/ElasticsearchClient.cs @@ -233,7 +233,7 @@ async Task SendRequest(TRequest request, RequestParameters? parameter activity?.AddTag("db.system", "elasticsearch"); activity?.SetCustomProperty("elastic.transport.client", true); - response = await _transport.RequestAsync(request.HttpMethod, url, postData, parameters).ConfigureAwait(false); + response = await _transport.RequestAsync(request.HttpMethod, url, postData, parameters, cancellationToken).ConfigureAwait(false); if (response.ApiCallDetails.RequestBodyInBytes is not null) activity?.AddTag("db.statement", System.Text.Encoding.UTF8.GetString(response.ApiCallDetails.RequestBodyInBytes));