public Task SniffAsync()

in src/Elastic.Transport/Components/Pipeline/RequestPipeline.cs [442:494]


	public Task SniffAsync(Auditor? auditor, CancellationToken cancellationToken = default)
		=> SniffCoreAsync(true, auditor, cancellationToken).AsTask();

	private async ValueTask SniffCoreAsync(bool isAsync, Auditor? auditor, CancellationToken cancellationToken = default)
	{
		if (!_productRegistration.SupportsSniff) return;

		var exceptions = new List<Exception>();

		foreach (var node in SniffNodes(auditor))
		{
			var sniffEndpoint = _productRegistration.CreateSniffEndpoint(node, PingAndSniffRequestConfiguration, _settings);
			using var audit = auditor?.Add(SniffSuccess, _dateTimeProvider, node);

			Tuple<TransportResponse, IReadOnlyCollection<Node>> result;

			try
			{
				if (isAsync)
					result = await _productRegistration
						.SniffAsync(_requestInvoker, _nodePool.UsingSsl, sniffEndpoint, _boundConfiguration, cancellationToken)
						.ConfigureAwait(false);
				else
					result = _productRegistration
						.Sniff(_requestInvoker, _nodePool.UsingSsl, sniffEndpoint, _boundConfiguration);

				ThrowBadAuthPipelineExceptionWhenNeeded(result.Item1.ApiCallDetails);

				//sniff should not silently accept bad but valid http responses
				if (!result.Item1.ApiCallDetails.HasSuccessfulStatusCodeAndExpectedContentType)
				{
					var pipelineFailure = result.Item1.ApiCallDetails.HttpStatusCode != null ? PipelineFailure.BadResponse : PipelineFailure.BadRequest;
					throw new PipelineException(pipelineFailure, result.Item1.ApiCallDetails.OriginalException) { Response = result.Item1 };
				}

				_nodePool.Reseed(result.Item2);
				Refresh = true;

				return;
			}
			catch (Exception e)
			{
				if (audit is not null)
				{
					audit.Event = SniffFailure;
					audit.Exception = e;
				}
				exceptions.Add(e);
			}

			throw new PipelineException(PipelineFailure.SniffFailure, exceptions.AsAggregateOrFirst());
		}
	}