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