using DNS.Client; using Microsoft.Extensions.DependencyInjection; using System; using System.Linq; using System.Net; using System.Net.Http; using System.Threading; using System.Threading.Tasks; namespace FastGithub.Scanner { /// /// 由本程序提值的dns的httpHandler /// [Service(ServiceLifetime.Transient)] sealed class LoopbackDnsHttpHandler : DelegatingHandler { /// /// 本程序的dns /// private static readonly DnsClient dnsClient = new(IPAddress.Loopback); /// /// 发送消息 /// /// /// /// protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var uri = request.RequestUri; if (uri != null && uri.HostNameType == UriHostNameType.Dns) { var address = await LookupAsync(uri.Host); if (address != null) { var builder = new UriBuilder(uri) { Host = address.ToString() }; request.RequestUri = builder.Uri; request.Headers.Host = uri.Host; } } return await base.SendAsync(request, cancellationToken); } /// /// dns解析ip /// /// /// private static async Task LookupAsync(string host) { try { using var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(500d)); var addresses = await dnsClient.Lookup(host, cancellationToken: cancellationTokenSource.Token); return addresses.FirstOrDefault(); } catch (Exception) { return default; } } } }