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