21
21
#if ELASTICSEARCH_SERVERLESS
22
22
namespace Elastic . Clients . Elasticsearch . Serverless ;
23
23
#else
24
-
25
24
namespace Elastic . Clients . Elasticsearch ;
26
25
#endif
27
26
@@ -165,14 +164,12 @@ private ValueTask<TResponse> DoRequestCoreAsync<TRequest, TResponse, TRequestPar
165
164
166
165
ValueTask < TResponse > SendRequest ( )
167
166
{
168
- var ( resolvedUrl , _ , resolvedRouteValues , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , forceConfiguration ) ;
167
+ var ( endpointPath , resolvedRouteValues , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request ) ;
169
168
var openTelemetryData = PrepareOpenTelemetryData < TRequest , TRequestParameters > ( request , resolvedRouteValues ) ;
170
169
171
170
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 ) ) ;
176
173
}
177
174
178
175
async ValueTask < TResponse > SendRequestWithProductCheck ( )
@@ -198,73 +195,59 @@ async ValueTask<TResponse> SendRequestWithProductCheckCore()
198
195
{
199
196
// Attach product check header
200
197
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
+ } ;
215
210
216
211
// Send request
217
212
218
- var ( resolvedUrl , _ , resolvedRouteValues , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request , forceConfiguration ) ;
213
+ var ( endpointPath , resolvedRouteValues , postData ) = PrepareRequest < TRequest , TRequestParameters > ( request ) ;
219
214
var openTelemetryData = PrepareOpenTelemetryData < TRequest , TRequestParameters > ( request , resolvedRouteValues ) ;
220
215
221
216
TResponse response ;
222
217
223
218
if ( isAsync )
224
219
{
225
220
response = await _transport
226
- . RequestAsync < TResponse > ( request . HttpMethod , resolvedUrl , postData , request . RequestParameters , in openTelemetryData , cancellationToken )
221
+ . RequestAsync < TResponse > ( endpointPath , postData , in openTelemetryData , requestConfig , cancellationToken )
227
222
. ConfigureAwait ( false ) ;
228
223
}
229
224
else
230
225
{
231
- response = _transport
232
- . Request < TResponse > ( request . HttpMethod , resolvedUrl , postData , request . RequestParameters , in openTelemetryData ) ;
226
+ response = _transport . Request < TResponse > ( endpointPath , postData , in openTelemetryData , requestConfig ) ;
233
227
}
234
228
235
229
// Evaluate product check result
236
230
237
231
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
-
261
232
if ( ! hasSuccessStatusCode )
262
233
{
263
234
// The product check is unreliable for non success status codes.
264
235
// We have to re-try on the next request.
265
236
_productCheckStatus = ( int ) ProductCheckStatus . NotChecked ;
237
+
238
+ return response ;
266
239
}
267
240
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
+
268
251
return response ;
269
252
}
270
253
}
@@ -304,69 +287,21 @@ private static OpenTelemetryData PrepareOpenTelemetryData<TRequest, TRequestPara
304
287
return openTelemetryData ;
305
288
}
306
289
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 )
309
291
where TRequest : Request < TRequestParameters >
310
292
where TRequestParameters : RequestParameters , new ( )
311
293
{
312
294
request . ThrowIfNull ( nameof ( request ) , "A request is required." ) ;
313
295
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 ) ;
324
298
325
299
var postData =
326
300
request . HttpMethod == HttpMethod . GET ||
327
301
request . HttpMethod == HttpMethod . HEAD || ! request . SupportsBody
328
302
? null
329
303
: PostData . Serializable ( request ) ;
330
304
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 ) ;
371
306
}
372
307
}
0 commit comments