diff --git a/FastGithub.Scanner/LoopbackDnsHttpHandler.cs b/FastGithub.Scanner/LoopbackDnsHttpHandler.cs new file mode 100644 index 0000000..529d390 --- /dev/null +++ b/FastGithub.Scanner/LoopbackDnsHttpHandler.cs @@ -0,0 +1,68 @@ +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; + } + } + } +} diff --git a/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs b/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs index 9afbc5e..f5cda97 100644 --- a/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs +++ b/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs @@ -36,7 +36,8 @@ namespace FastGithub Proxy = null, UseProxy = false, AllowAutoRedirect = false - }); + }) + .AddHttpMessageHandler(); return services .AddMemoryCache()