@@ -191,7 +191,7 @@ public IEnumerable<Node> NextNode()
191
191
yield break ;
192
192
}
193
193
194
- //This for loop allows to break out of the view state machine if we need to
194
+ //This for loop allows to break out of the view state machine if we need to
195
195
//force a refresh (after reseeding connectionpool). We have a hardcoded limit of only
196
196
//allowing 100 of these refreshes per call
197
197
var refreshed = false ;
@@ -243,13 +243,14 @@ public void Ping(Node node)
243
243
var response = this . _connection . Request < VoidResponse > ( pingData ) ;
244
244
ThrowBadAuthPipelineExceptionWhenNeeded ( response ) ;
245
245
//ping should not silently accept bad but valid http responses
246
- if ( ! response . Success ) throw new PipelineException ( PipelineFailure . BadResponse ) ;
246
+ if ( ! response . Success ) throw new PipelineException ( PipelineFailure . BadResponse ) { Response = response } ;
247
247
}
248
248
catch ( Exception e )
249
249
{
250
+ var response = ( e as PipelineException ) ? . Response ;
250
251
audit . Event = PingFailure ;
251
252
audit . Exception = e ;
252
- throw new PipelineException ( PipelineFailure . PingFailure , e ) ;
253
+ throw new PipelineException ( PipelineFailure . PingFailure , e ) { Response = response } ;
253
254
}
254
255
}
255
256
}
@@ -266,21 +267,22 @@ public async Task PingAsync(Node node)
266
267
var response = await this . _connection . RequestAsync < VoidResponse > ( pingData ) . ConfigureAwait ( false ) ;
267
268
ThrowBadAuthPipelineExceptionWhenNeeded ( response ) ;
268
269
//ping should not silently accept bad but valid http responses
269
- if ( ! response . Success ) throw new PipelineException ( PipelineFailure . BadResponse ) ;
270
+ if ( ! response . Success ) throw new PipelineException ( PipelineFailure . BadResponse ) { Response = response } ;
270
271
}
271
272
catch ( Exception e )
272
273
{
274
+ var response = ( e as PipelineException ) ? . Response ;
273
275
audit . Event = PingFailure ;
274
276
audit . Exception = e ;
275
- throw new PipelineException ( PipelineFailure . PingFailure , e ) ;
276
- }
277
+ throw new PipelineException ( PipelineFailure . PingFailure , e ) { Response = response } ;
278
+ }
277
279
}
278
280
}
279
281
280
- private void ThrowBadAuthPipelineExceptionWhenNeeded < TReturn > ( ElasticsearchResponse < TReturn > response )
282
+ private void ThrowBadAuthPipelineExceptionWhenNeeded ( IApiCallDetails response )
281
283
{
282
284
if ( response . HttpStatusCode == 401 )
283
- throw new PipelineException ( PipelineFailure . BadAuthentication , response . OriginalException ) ;
285
+ throw new PipelineException ( PipelineFailure . BadAuthentication , response . OriginalException ) { Response = response } ;
284
286
}
285
287
286
288
public string SniffPath => "_nodes/_all/settings?flat_settings&timeout=" + this . PingTimeout . ToTimeUnit ( ) ;
@@ -319,7 +321,7 @@ public void Sniff()
319
321
var response = this . _connection . Request < SniffResponse > ( requestData ) ;
320
322
ThrowBadAuthPipelineExceptionWhenNeeded ( response ) ;
321
323
//sniff should not silently accept bad but valid http responses
322
- if ( ! response . Success ) throw new PipelineException ( PipelineFailure . BadResponse ) ;
324
+ if ( ! response . Success ) throw new PipelineException ( PipelineFailure . BadResponse ) { Response = response } ;
323
325
var nodes = response . Body . ToNodes ( this . _connectionPool . UsingSsl ) ;
324
326
this . _connectionPool . Reseed ( nodes ) ;
325
327
this . Refresh = true ;
@@ -352,7 +354,7 @@ public async Task SniffAsync()
352
354
var response = await this . _connection . RequestAsync < SniffResponse > ( requestData ) . ConfigureAwait ( false ) ;
353
355
ThrowBadAuthPipelineExceptionWhenNeeded ( response ) ;
354
356
//sniff should not silently accept bad but valid http responses
355
- if ( ! response . Success ) throw new PipelineException ( PipelineFailure . BadResponse ) ;
357
+ if ( ! response . Success ) throw new PipelineException ( PipelineFailure . BadResponse ) { Response = response } ;
356
358
this . _connectionPool . Reseed ( response . Body . ToNodes ( this . _connectionPool . UsingSsl ) ) ;
357
359
this . Refresh = true ;
358
360
return ;
@@ -426,40 +428,43 @@ public async Task<ElasticsearchResponse<TReturn>> CallElasticsearchAsync<TReturn
426
428
public void BadResponse < TReturn > ( ref ElasticsearchResponse < TReturn > response , RequestData data , List < PipelineException > pipelineExceptions )
427
429
where TReturn : class
428
430
{
431
+ var callDetails = response ?? pipelineExceptions . LastOrDefault ( ) ? . Response ;
429
432
var pipelineFailure = PipelineFailure . BadResponse ;
430
433
if ( pipelineExceptions . HasAny ( ) )
431
434
pipelineFailure = pipelineExceptions . Last ( ) . FailureReason ;
432
435
433
436
var innerException = pipelineExceptions . HasAny ( )
434
437
? new AggregateException ( pipelineExceptions )
435
- : response ? . OriginalException ;
438
+ : callDetails ? . OriginalException ;
436
439
437
440
var exceptionMessage = innerException ? . Message ?? "Could not complete the request to Elasticsearch." ;
438
441
439
442
if ( this . IsTakingTooLong )
440
443
{
441
- pipelineFailure = PipelineFailure . MaxTimeoutReached ;
444
+ pipelineFailure = PipelineFailure . MaxTimeoutReached ;
442
445
this . Audit ( MaxTimeoutReached ) ;
443
446
exceptionMessage = "Maximum timout reached while retrying request" ;
444
447
}
445
448
else if ( this . Retried >= this . MaxRetries && this . MaxRetries > 0 )
446
449
{
447
- pipelineFailure = PipelineFailure . MaxRetriesReached ;
450
+ pipelineFailure = PipelineFailure . MaxRetriesReached ;
448
451
this . Audit ( MaxRetriesReached ) ;
449
452
exceptionMessage = "Maximum number of retries reached." ;
450
453
}
451
454
452
455
var clientException = new ElasticsearchClientException ( pipelineFailure , exceptionMessage , innerException )
453
456
{
454
457
Request = data ,
455
- Response = response ,
458
+ Response = callDetails ,
456
459
AuditTrail = this . AuditTrail
457
460
} ;
458
461
459
462
if ( _settings . ThrowExceptions ) throw clientException ;
460
463
461
464
if ( response == null )
465
+ {
462
466
response = new ResponseBuilder < TReturn > ( data ) { Exception = clientException } . ToResponse ( ) ;
467
+ }
463
468
464
469
response . AuditTrail = this . AuditTrail ;
465
470
}
@@ -468,4 +473,4 @@ public void BadResponse<TReturn>(ref ElasticsearchResponse<TReturn> response, Re
468
473
469
474
protected virtual void Dispose ( ) { }
470
475
}
471
- }
476
+ }
0 commit comments