From 1520abbbbc185bae17fb97f843b0e819d9453005 Mon Sep 17 00:00:00 2001 From: xljiulang <366193849@qq.com> Date: Sun, 20 Jun 2021 15:10:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0LoopbackDnsHttpHandler?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E9=AB=98GithubMetaProvider=E4=BB=8Egithub?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=95=B0=E6=8D=AE=E7=9A=84=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FastGithub.Scanner/LoopbackDnsHttpHandler.cs | 68 +++++++++++++++++++ .../ScannerServiceCollectionExtensions.cs | 3 +- 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 FastGithub.Scanner/LoopbackDnsHttpHandler.cs 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()