2121#if ELASTICSEARCH_SERVERLESS
2222namespace Elastic . Clients . Elasticsearch . Serverless ;
2323#else
24-
2524namespace Elastic . Clients . Elasticsearch ;
2625#endif
2726
@@ -165,14 +164,12 @@ private ValueTask<TResponse> DoRequestCoreAsync<TRequest, TResponse, TRequestPar
165164
166165 ValueTask < TResponse > SendRequest ( )
167166 {
168- var ( resolvedUrl , _ , resolvedRouteValues , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , forceConfiguration ) ;
167+ var ( endpointPath , resolvedRouteValues , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request ) ;
169168 var openTelemetryData = PrepareOpenTelemetryData < TRequest , TRequestParameters > ( request , resolvedRouteValues ) ;
170169
171170 return isAsync
172- ? new ValueTask < TResponse > ( _transport
173- . RequestAsync < TResponse > ( request . HttpMethod , resolvedUrl , postData , request . RequestParameters , in openTelemetryData , cancellationToken ) )
174- : new ValueTask < TResponse > ( _transport
175- . Request < TResponse > ( request . HttpMethod , resolvedUrl , postData , request . RequestParameters , in openTelemetryData ) ) ;
171+ ? new ValueTask < TResponse > ( _transport . RequestAsync < TResponse > ( endpointPath , postData , in openTelemetryData , request . RequestConfig , cancellationToken ) )
172+ : new ValueTask < TResponse > ( _transport . Request < TResponse > ( endpointPath , postData , in openTelemetryData , request . RequestConfig ) ) ;
176173 }
177174
178175 async ValueTask < TResponse > SendRequestWithProductCheck ( )
@@ -198,73 +195,59 @@ async ValueTask<TResponse> SendRequestWithProductCheckCore()
198195 {
199196 // Attach product check header
200197
201- var hadRequestConfig = false ;
202- HeadersList ? originalHeaders = null ;
203-
204- if ( request . RequestParameters . RequestConfiguration is null )
205- request . RequestParameters . RequestConfiguration = new RequestConfiguration ( ) ;
206- else
207- {
208- originalHeaders = request . RequestParameters . RequestConfiguration . ResponseHeadersToParse ;
209- hadRequestConfig = true ;
210- }
211-
212- request . RequestParameters . RequestConfiguration . ResponseHeadersToParse = request . RequestParameters . RequestConfiguration . ResponseHeadersToParse . Count == 0
213- ? new HeadersList ( "x-elastic-product" )
214- : new HeadersList ( request . RequestParameters . RequestConfiguration . ResponseHeadersToParse , "x-elastic-product" ) ;
198+ // TODO: The copy constructor should accept null values
199+ var requestConfig = ( request . RequestConfig is null )
200+ ? new RequestConfiguration ( )
201+ {
202+ ResponseHeadersToParse = new HeadersList ( "x-elastic-product" )
203+ }
204+ : new RequestConfiguration ( request . RequestConfig )
205+ {
206+ ResponseHeadersToParse = ( request . RequestConfig . ResponseHeadersToParse is { Count : > 0 } )
207+ ? new HeadersList ( request . RequestConfig . ResponseHeadersToParse , "x-elastic-product" )
208+ : new HeadersList ( "x-elastic-product" )
209+ } ;
215210
216211 // Send request
217212
218- var ( resolvedUrl , _ , resolvedRouteValues , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , forceConfiguration ) ;
213+ var ( endpointPath , resolvedRouteValues , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request ) ;
219214 var openTelemetryData = PrepareOpenTelemetryData < TRequest , TRequestParameters > ( request , resolvedRouteValues ) ;
220215
221216 TResponse response ;
222217
223218 if ( isAsync )
224219 {
225220 response = await _transport
226- . RequestAsync < TResponse > ( request . HttpMethod , resolvedUrl , postData , request . RequestParameters , in openTelemetryData , cancellationToken )
221+ . RequestAsync < TResponse > ( endpointPath , postData , in openTelemetryData , requestConfig , cancellationToken )
227222 . ConfigureAwait ( false ) ;
228223 }
229224 else
230225 {
231- response = _transport
232- . Request < TResponse > ( request . HttpMethod , resolvedUrl , postData , request . RequestParameters , in openTelemetryData ) ;
226+ response = _transport . Request < TResponse > ( endpointPath , postData , in openTelemetryData , requestConfig ) ;
233227 }
234228
235229 // Evaluate product check result
236230
237231 var hasSuccessStatusCode = response . ApiCallDetails . HttpStatusCode is >= 200 and <= 299 ;
238- if ( hasSuccessStatusCode )
239- {
240- var productCheckSucceeded = response . ApiCallDetails . TryGetHeader ( "x-elastic-product" , out var values ) &&
241- values . FirstOrDefault ( x => x . Equals ( "Elasticsearch" , StringComparison . Ordinal ) ) is not null ;
242-
243- _productCheckStatus = productCheckSucceeded
244- ? ( int ) ProductCheckStatus . Succeeded
245- : ( int ) ProductCheckStatus . Failed ;
246-
247- if ( _productCheckStatus == ( int ) ProductCheckStatus . Failed )
248- throw new UnsupportedProductException ( UnsupportedProductException . InvalidProductError ) ;
249- }
250-
251- if ( request . RequestParameters . RequestConfiguration is null )
252- return response ;
253-
254- // Reset request configuration
255-
256- if ( ! hadRequestConfig )
257- request . RequestParameters . RequestConfiguration = null ;
258- else if ( originalHeaders is { Count : > 0 } )
259- request . RequestParameters . RequestConfiguration . ResponseHeadersToParse = originalHeaders . Value ;
260-
261232 if ( ! hasSuccessStatusCode )
262233 {
263234 // The product check is unreliable for non success status codes.
264235 // We have to re-try on the next request.
265236 _productCheckStatus = ( int ) ProductCheckStatus . NotChecked ;
237+
238+ return response ;
266239 }
267240
241+ var productCheckSucceeded = response . ApiCallDetails . TryGetHeader ( "x-elastic-product" , out var values ) &&
242+ values . FirstOrDefault ( x => x . Equals ( "Elasticsearch" , StringComparison . Ordinal ) ) is not null ;
243+
244+ _productCheckStatus = productCheckSucceeded
245+ ? ( int ) ProductCheckStatus . Succeeded
246+ : ( int ) ProductCheckStatus . Failed ;
247+
248+ if ( _productCheckStatus == ( int ) ProductCheckStatus . Failed )
249+ throw new UnsupportedProductException ( UnsupportedProductException . InvalidProductError ) ;
250+
268251 return response ;
269252 }
270253 }
@@ -304,69 +287,21 @@ private static OpenTelemetryData PrepareOpenTelemetryData<TRequest, TRequestPara
304287 return openTelemetryData ;
305288 }
306289
307- private ( string resolvedUrl , string urlTemplate , Dictionary < string , string > ? resolvedRouteValues , PostData data ) PrepareRequest < TRequest , TRequestParameters > ( TRequest request ,
308- Action < IRequestConfiguration > ? forceConfiguration )
290+ private ( EndpointPath endpointPath , Dictionary < string , string > ? resolvedRouteValues , PostData data ) PrepareRequest < TRequest , TRequestParameters > ( TRequest request )
309291 where TRequest : Request < TRequestParameters >
310292 where TRequestParameters : RequestParameters , new ( )
311293 {
312294 request . ThrowIfNull ( nameof ( request ) , "A request is required." ) ;
313295
314- if ( forceConfiguration is not null )
315- ForceConfiguration ( request , forceConfiguration ) ;
316-
317- if ( request . ContentType is not null )
318- ForceContentType < TRequest , TRequestParameters > ( request , request . ContentType ) ;
319-
320- if ( request . Accept is not null )
321- ForceAccept < TRequest , TRequestParameters > ( request , request . Accept ) ;
322-
323- var ( resolvedUrl , urlTemplate , routeValues ) = request . GetUrl ( ElasticsearchClientSettings ) ;
296+ var ( resolvedUrl , _, routeValues ) = request . GetUrl ( ElasticsearchClientSettings ) ;
297+ var pathAndQuery = request . RequestParameters . CreatePathWithQueryStrings ( resolvedUrl , ElasticsearchClientSettings ) ;
324298
325299 var postData =
326300 request . HttpMethod == HttpMethod . GET ||
327301 request . HttpMethod == HttpMethod . HEAD || ! request . SupportsBody
328302 ? null
329303 : PostData . Serializable ( request ) ;
330304
331- return ( resolvedUrl , urlTemplate , routeValues , postData ) ;
332- }
333-
334- private static void ForceConfiguration < TRequestParameters > ( Request < TRequestParameters > request , Action < IRequestConfiguration > forceConfiguration )
335- where TRequestParameters : RequestParameters , new ( )
336- {
337- var configuration = request . RequestParameters . RequestConfiguration ?? new RequestConfiguration ( ) ;
338- forceConfiguration ( configuration ) ;
339- request . RequestParameters . RequestConfiguration = configuration ;
340- }
341-
342- private static void ForceContentType < TRequest , TRequestParameters > ( TRequest request , string contentType )
343- where TRequest : Request < TRequestParameters >
344- where TRequestParameters : RequestParameters , new ( )
345- {
346- var configuration = request . RequestParameters . RequestConfiguration ?? new RequestConfiguration ( ) ;
347- configuration . Accept = contentType ;
348- configuration . ContentType = contentType ;
349- request . RequestParameters . RequestConfiguration = configuration ;
350- }
351-
352- private static void ForceAccept < TRequest , TRequestParameters > ( TRequest request , string acceptType )
353- where TRequest : Request < TRequestParameters >
354- where TRequestParameters : RequestParameters , new ( )
355- {
356- var configuration = request . RequestParameters . RequestConfiguration ?? new RequestConfiguration ( ) ;
357- configuration . Accept = acceptType ;
358- request . RequestParameters . RequestConfiguration = configuration ;
359- }
360-
361- internal static void ForceJson ( IRequestConfiguration requestConfiguration )
362- {
363- requestConfiguration . Accept = RequestData . DefaultMimeType ;
364- requestConfiguration . ContentType = RequestData . DefaultMimeType ;
365- }
366-
367- internal static void ForceTextPlain ( IRequestConfiguration requestConfiguration )
368- {
369- requestConfiguration . Accept = RequestData . MimeTypeTextPlain ;
370- requestConfiguration . ContentType = RequestData . MimeTypeTextPlain ;
305+ return ( new EndpointPath ( request . HttpMethod , pathAndQuery ) , routeValues , postData ) ;
371306 }
372307}
0 commit comments