@@ -191,7 +191,7 @@ public IEnumerable<Node> NextNode()
191191 yield break ;
192192 }
193193
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
195195 //force a refresh (after reseeding connectionpool). We have a hardcoded limit of only
196196 //allowing 100 of these refreshes per call
197197 var refreshed = false ;
@@ -243,13 +243,14 @@ public void Ping(Node node)
243243 var response = this . _connection . Request < VoidResponse > ( pingData ) ;
244244 ThrowBadAuthPipelineExceptionWhenNeeded ( response ) ;
245245 //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 } ;
247247 }
248248 catch ( Exception e )
249249 {
250+ var response = ( e as PipelineException ) ? . Response ;
250251 audit . Event = PingFailure ;
251252 audit . Exception = e ;
252- throw new PipelineException ( PipelineFailure . PingFailure , e ) ;
253+ throw new PipelineException ( PipelineFailure . PingFailure , e ) { Response = response } ;
253254 }
254255 }
255256 }
@@ -266,21 +267,22 @@ public async Task PingAsync(Node node)
266267 var response = await this . _connection . RequestAsync < VoidResponse > ( pingData ) . ConfigureAwait ( false ) ;
267268 ThrowBadAuthPipelineExceptionWhenNeeded ( response ) ;
268269 //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 } ;
270271 }
271272 catch ( Exception e )
272273 {
274+ var response = ( e as PipelineException ) ? . Response ;
273275 audit . Event = PingFailure ;
274276 audit . Exception = e ;
275- throw new PipelineException ( PipelineFailure . PingFailure , e ) ;
276- }
277+ throw new PipelineException ( PipelineFailure . PingFailure , e ) { Response = response } ;
278+ }
277279 }
278280 }
279281
280- private void ThrowBadAuthPipelineExceptionWhenNeeded < TReturn > ( ElasticsearchResponse < TReturn > response )
282+ private void ThrowBadAuthPipelineExceptionWhenNeeded ( IApiCallDetails response )
281283 {
282284 if ( response . HttpStatusCode == 401 )
283- throw new PipelineException ( PipelineFailure . BadAuthentication , response . OriginalException ) ;
285+ throw new PipelineException ( PipelineFailure . BadAuthentication , response . OriginalException ) { Response = response } ;
284286 }
285287
286288 public string SniffPath => "_nodes/_all/settings?flat_settings&timeout=" + this . PingTimeout . ToTimeUnit ( ) ;
@@ -319,7 +321,7 @@ public void Sniff()
319321 var response = this . _connection . Request < SniffResponse > ( requestData ) ;
320322 ThrowBadAuthPipelineExceptionWhenNeeded ( response ) ;
321323 //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 } ;
323325 var nodes = response . Body . ToNodes ( this . _connectionPool . UsingSsl ) ;
324326 this . _connectionPool . Reseed ( nodes ) ;
325327 this . Refresh = true ;
@@ -352,7 +354,7 @@ public async Task SniffAsync()
352354 var response = await this . _connection . RequestAsync < SniffResponse > ( requestData ) . ConfigureAwait ( false ) ;
353355 ThrowBadAuthPipelineExceptionWhenNeeded ( response ) ;
354356 //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 } ;
356358 this . _connectionPool . Reseed ( response . Body . ToNodes ( this . _connectionPool . UsingSsl ) ) ;
357359 this . Refresh = true ;
358360 return ;
@@ -426,40 +428,43 @@ public async Task<ElasticsearchResponse<TReturn>> CallElasticsearchAsync<TReturn
426428 public void BadResponse < TReturn > ( ref ElasticsearchResponse < TReturn > response , RequestData data , List < PipelineException > pipelineExceptions )
427429 where TReturn : class
428430 {
431+ var callDetails = response ?? pipelineExceptions . LastOrDefault ( ) ? . Response ;
429432 var pipelineFailure = PipelineFailure . BadResponse ;
430433 if ( pipelineExceptions . HasAny ( ) )
431434 pipelineFailure = pipelineExceptions . Last ( ) . FailureReason ;
432435
433436 var innerException = pipelineExceptions . HasAny ( )
434437 ? new AggregateException ( pipelineExceptions )
435- : response ? . OriginalException ;
438+ : callDetails ? . OriginalException ;
436439
437440 var exceptionMessage = innerException ? . Message ?? "Could not complete the request to Elasticsearch." ;
438441
439442 if ( this . IsTakingTooLong )
440443 {
441- pipelineFailure = PipelineFailure . MaxTimeoutReached ;
444+ pipelineFailure = PipelineFailure . MaxTimeoutReached ;
442445 this . Audit ( MaxTimeoutReached ) ;
443446 exceptionMessage = "Maximum timout reached while retrying request" ;
444447 }
445448 else if ( this . Retried >= this . MaxRetries && this . MaxRetries > 0 )
446449 {
447- pipelineFailure = PipelineFailure . MaxRetriesReached ;
450+ pipelineFailure = PipelineFailure . MaxRetriesReached ;
448451 this . Audit ( MaxRetriesReached ) ;
449452 exceptionMessage = "Maximum number of retries reached." ;
450453 }
451454
452455 var clientException = new ElasticsearchClientException ( pipelineFailure , exceptionMessage , innerException )
453456 {
454457 Request = data ,
455- Response = response ,
458+ Response = callDetails ,
456459 AuditTrail = this . AuditTrail
457460 } ;
458461
459462 if ( _settings . ThrowExceptions ) throw clientException ;
460463
461464 if ( response == null )
465+ {
462466 response = new ResponseBuilder < TReturn > ( data ) { Exception = clientException } . ToResponse ( ) ;
467+ }
463468
464469 response . AuditTrail = this . AuditTrail ;
465470 }
@@ -468,4 +473,4 @@ public void BadResponse<TReturn>(ref ElasticsearchResponse<TReturn> response, Re
468473
469474 protected virtual void Dispose ( ) { }
470475 }
471- }
476+ }
0 commit comments