public TransportException? CreateClientException()

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;
	}