in src/Elastic.Transport/Components/Pipeline/RequestPipeline.cs [199:260]
public TransportException? CreateClientException<TResponse>(
TResponse response,
ApiCallDetails? callDetails,
Endpoint endpoint,
Auditor? auditor,
DateTimeOffset startedOn,
int attemptedNodes,
List<PipelineException>? seenExceptions
)
where TResponse : TransportResponse, new()
{
if (callDetails?.HasSuccessfulStatusCodeAndExpectedContentType ?? false) return null;
var pipelineFailure = callDetails?.HttpStatusCode != null ? PipelineFailure.BadResponse : PipelineFailure.BadRequest;
var innerException = callDetails?.OriginalException;
if (seenExceptions is not null && seenExceptions.HasAny(out var exs))
{
pipelineFailure = exs.Last().FailureReason;
innerException = exs.AsAggregateOrFirst();
}
var statusCode = callDetails?.HttpStatusCode != null ? callDetails.HttpStatusCode.Value.ToString() : "unknown";
var resource = callDetails == null
? "unknown resource"
: $"Status code {statusCode} from: {callDetails.HttpMethod} {callDetails.Uri.PathAndQuery}";
var exceptionMessage = innerException?.Message ?? "Request failed to execute";
if (IsTakingTooLong(startedOn))
{
pipelineFailure = PipelineFailure.MaxTimeoutReached;
auditor?.Emit(MaxTimeoutReached);
exceptionMessage = "Maximum timeout reached while retrying request";
}
else if (attemptedNodes >= MaxRetries && MaxRetries > 0)
{
pipelineFailure = PipelineFailure.MaxRetriesReached;
auditor?.Emit(MaxRetriesReached);
exceptionMessage = "Maximum number of retries reached";
var now = _dateTimeProvider.Now();
var activeNodes = _nodePool.Nodes.Count(n => n.IsAlive || n.DeadUntil <= now);
if (attemptedNodes >= activeNodes)
{
auditor?.Emit(FailedOverAllNodes);
exceptionMessage += ", failed over to all the known alive nodes before failing";
}
}
exceptionMessage += !exceptionMessage.EndsWith(".", StringComparison.Ordinal) ? $". Call: {resource}" : $" Call: {resource}";
if (response != null && _productRegistration.TryGetServerErrorReason(response, out var reason))
exceptionMessage += $". ServerError: {reason}";
var clientException = new TransportException(pipelineFailure, exceptionMessage, innerException)
{
Endpoint = endpoint,
ApiCallDetails = callDetails,
AuditTrail = auditor
};
return clientException;
}