public async Task ItShouldLogErrorWhenUnableToDoLookupForPtr(string ipAddress) { ReverseDnsQueryResponse response = new ReverseDnsQueryResponse(true, "Something has gone wrong!", null); A.CallTo(() => _dnsResolver.QueryPtrAsync(A <IPAddress> ._)).Returns(response); var reverseDnsLookup = new ReverseDnsLookup(_dnsResolver, _log); ReverseDnsResult result = await reverseDnsLookup.Lookup(ipAddress); Assert.That(_log.Warnings.Count, Is.EqualTo(1)); Assert.That(result.ForwardResponses.Count, Is.EqualTo(0)); Assert.IsNull(result.OriginalIpAddress); }
private async Task <ReverseDnsResult> GetReverseDnsResult(IPAddress originalAddress) { int attempt = 0; int maxAttempts = 5; while (attempt < maxAttempts) { await Task.Delay(attempt *attempt * 1000); attempt++; try { ReverseDnsQueryResponse response = await _dnsResolver.QueryPtrAsync(originalAddress); if (response.HasError && attempt < maxAttempts) { continue; } if (response.HasError) { _log.LogWarning("Failed to do PTR look up for {IpAddress} with error: {Error}.", originalAddress, response.ErrorMessage ?? "Unknown error"); return(ReverseDnsResult.InvalidReverseDnsResult); } List <string> hosts = response.Results; List <ReverseDnsResponse> forwardResponses = originalAddress.AddressFamily == AddressFamily.InterNetwork ? await GetDnsResponses <ARecord>(hosts, QueryType.A) : await GetDnsResponses <AaaaRecord>(hosts, QueryType.AAAA); return(new ReverseDnsResult(originalAddress.ToString(), forwardResponses)); } catch (Exception e) { string errorMessage = $"Error occured performing PTR lookup for {originalAddress} (attempt {attempt} of {maxAttempts})"; if (attempt == maxAttempts) { _log.LogError(e, errorMessage); } else { _log.LogWarning(e, errorMessage); } } } return(ReverseDnsResult.InvalidReverseDnsResult); }