陈国伟 3 gadi atpakaļ
vecāks
revīzija
b441405cb7

+ 8 - 4
FastGithub.PacketIntercept/DnsInterceptor.cs → FastGithub.PacketIntercept/Dns/DnsInterceptor.cs

@@ -11,15 +11,16 @@ using System.Net;
 using System.Runtime.InteropServices;
 using System.Runtime.Versioning;
 using System.Threading;
+using System.Threading.Tasks;
 using WinDivertSharp;
 
-namespace FastGithub.PacketIntercept
+namespace FastGithub.PacketIntercept.Dns
 {
     /// <summary>
     /// dns拦截器
     /// </summary>   
     [SupportedOSPlatform("windows")]
-    sealed class DnsInterceptor
+    sealed class DnsInterceptor : IDnsInterceptor
     {
         private const string DNS_FILTER = "udp.DstPort == 53";
         private readonly FastGithubConfig fastGithubConfig;
@@ -52,8 +53,11 @@ namespace FastGithub.PacketIntercept
         /// DNS拦截
         /// </summary>
         /// <param name="cancellationToken"></param>
-        public void Intercept(CancellationToken cancellationToken)
+        /// <returns></returns>
+        public async Task InterceptAsync(CancellationToken cancellationToken)
         {
+            await Task.Yield();
+
             var handle = WinDivert.WinDivertOpen(DNS_FILTER, WinDivertLayer.Network, 0, WinDivertOpenFlags.None);
             if (handle == IntPtr.Zero)
             {
@@ -163,7 +167,7 @@ namespace FastGithub.PacketIntercept
             {
                 winDivertAddress.Direction = WinDivertDirection.Inbound;
             }
-           
+
             WinDivert.WinDivertHelperCalcChecksums(winDivertBuffer, packetLength, ref winDivertAddress, WinDivertChecksumHelperParam.All);
             this.logger.LogInformation($"{domain} => {IPAddress.Loopback}");
         }

+ 2 - 2
FastGithub.PacketIntercept/HostsConflictSolver.cs → FastGithub.PacketIntercept/Dns/HostsConflictSolver.cs

@@ -6,13 +6,13 @@ using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
 
-namespace FastGithub.PacketIntercept
+namespace FastGithub.PacketIntercept.Dns
 {
     /// <summary>
     /// host文件冲解决者
     /// </summary>
     [SupportedOSPlatform("windows")]
-    sealed class HostsConflictSolver : IConflictSolver
+    sealed class HostsConflictSolver : IDnsConflictSolver
     {
         private readonly FastGithubConfig fastGithubConfig;
 

+ 2 - 2
FastGithub.PacketIntercept/ProxyConflictSolver.cs → FastGithub.PacketIntercept/Dns/ProxyConflictSolver.cs

@@ -11,13 +11,13 @@ using System.Runtime.Versioning;
 using System.Threading;
 using System.Threading.Tasks;
 
-namespace FastGithub.PacketIntercept
+namespace FastGithub.PacketIntercept.Dns
 {
     /// <summary>
     /// 代理冲突解决者
     /// </summary>
     [SupportedOSPlatform("windows")]
-    sealed class ProxyConflictSolver : IConflictSolver
+    sealed class ProxyConflictSolver : IDnsConflictSolver
     {
         private const int INTERNET_OPTION_REFRESH = 37;
         private const int INTERNET_OPTION_PROXY_SETTINGS_CHANGED = 95;

+ 6 - 7
FastGithub.PacketIntercept/DnsInterceptHostedService.cs

@@ -12,8 +12,8 @@ namespace FastGithub.PacketIntercept
     [SupportedOSPlatform("windows")]
     sealed class DnsInterceptHostedService : BackgroundService
     {
-        private readonly DnsInterceptor dnsInterceptor;
-        private readonly IEnumerable<IConflictSolver> conflictSolvers;
+        private readonly IDnsInterceptor dnsInterceptor;
+        private readonly IEnumerable<IDnsConflictSolver> conflictSolvers;
 
         /// <summary>
         /// dns拦截后台服务
@@ -21,8 +21,8 @@ namespace FastGithub.PacketIntercept
         /// <param name="dnsInterceptor"></param>
         /// <param name="conflictSolvers"></param>
         public DnsInterceptHostedService(
-            DnsInterceptor dnsInterceptor,
-            IEnumerable<IConflictSolver> conflictSolvers)
+            IDnsInterceptor dnsInterceptor,
+            IEnumerable<IDnsConflictSolver> conflictSolvers)
         {
             this.dnsInterceptor = dnsInterceptor;
             this.conflictSolvers = conflictSolvers;
@@ -61,10 +61,9 @@ namespace FastGithub.PacketIntercept
         /// </summary>
         /// <param name="stoppingToken"></param>
         /// <returns></returns>
-        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
+        protected override Task ExecuteAsync(CancellationToken stoppingToken)
         {
-            await Task.Yield();
-            this.dnsInterceptor.Intercept(stoppingToken);
+            return this.dnsInterceptor.InterceptAsync(stoppingToken);
         }
     }
 }

+ 1 - 1
FastGithub.PacketIntercept/IConflictSolver.cs → FastGithub.PacketIntercept/IDnsConflictSolver.cs

@@ -6,7 +6,7 @@ namespace FastGithub.PacketIntercept
     /// <summary>
     /// Dns冲突解决者
     /// </summary>
-    interface IConflictSolver
+    interface IDnsConflictSolver
     {
         /// <summary>
         /// 解决冲突

+ 18 - 0
FastGithub.PacketIntercept/IDnsInterceptor.cs

@@ -0,0 +1,18 @@
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FastGithub.PacketIntercept
+{
+    /// <summary>
+    /// dns拦截器接口
+    /// </summary>
+    interface IDnsInterceptor
+    {
+        /// <summary>
+        /// 拦截数据包
+        /// </summary>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        Task InterceptAsync(CancellationToken cancellationToken);
+    }
+}

+ 4 - 2
FastGithub.PacketIntercept/ITcpInterceptor.cs

@@ -1,4 +1,5 @@
 using System.Threading;
+using System.Threading.Tasks;
 
 namespace FastGithub.PacketIntercept
 {
@@ -8,9 +9,10 @@ namespace FastGithub.PacketIntercept
     interface ITcpInterceptor
     {
         /// <summary>
-        /// 拦截tcp
+        /// 拦截数据包
         /// </summary>
         /// <param name="cancellationToken"></param>
-        void Intercept(CancellationToken cancellationToken);
+        /// <returns></returns>
+        Task InterceptAsync(CancellationToken cancellationToken);
     }
 }

+ 5 - 3
FastGithub.PacketIntercept/ServiceCollectionExtensions.cs

@@ -1,4 +1,6 @@
 using FastGithub.PacketIntercept;
+using FastGithub.PacketIntercept.Dns;
+using FastGithub.PacketIntercept.Tcp;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.DependencyInjection.Extensions;
 using System.Runtime.Versioning;
@@ -18,9 +20,9 @@ namespace FastGithub
         [SupportedOSPlatform("windows")]
         public static IServiceCollection AddPacketIntercept(this IServiceCollection services)
         {
-            services.AddSingleton<IConflictSolver, HostsConflictSolver>();
-            services.AddSingleton<IConflictSolver, ProxyConflictSolver>();
-            services.TryAddSingleton<DnsInterceptor>();
+            services.AddSingleton<IDnsConflictSolver, HostsConflictSolver>();
+            services.AddSingleton<IDnsConflictSolver, ProxyConflictSolver>();
+            services.TryAddSingleton<IDnsInterceptor, DnsInterceptor>();
             services.AddHostedService<DnsInterceptHostedService>();
 
             services.AddSingleton<ITcpInterceptor, SshInterceptor>();

+ 1 - 1
FastGithub.PacketIntercept/HttpInterceptor.cs → FastGithub.PacketIntercept/Tcp/HttpInterceptor.cs

@@ -2,7 +2,7 @@
 using Microsoft.Extensions.Logging;
 using System.Runtime.Versioning;
 
-namespace FastGithub.PacketIntercept
+namespace FastGithub.PacketIntercept.Tcp
 {
     /// <summary>
     /// http拦截器

+ 1 - 1
FastGithub.PacketIntercept/HttpsInterceptor.cs → FastGithub.PacketIntercept/Tcp/HttpsInterceptor.cs

@@ -2,7 +2,7 @@
 using Microsoft.Extensions.Logging;
 using System.Runtime.Versioning;
 
-namespace FastGithub.PacketIntercept
+namespace FastGithub.PacketIntercept.Tcp
 {
     /// <summary>
     /// https拦截器

+ 1 - 1
FastGithub.PacketIntercept/SshInterceptor.cs → FastGithub.PacketIntercept/Tcp/SshInterceptor.cs

@@ -2,7 +2,7 @@
 using Microsoft.Extensions.Logging;
 using System.Runtime.Versioning;
 
-namespace FastGithub.PacketIntercept
+namespace FastGithub.PacketIntercept.Tcp
 {
     /// <summary>
     /// ssh拦截器

+ 5 - 2
FastGithub.PacketIntercept/TcpInterceptor.cs → FastGithub.PacketIntercept/Tcp/TcpInterceptor.cs

@@ -4,9 +4,10 @@ using System.Buffers.Binary;
 using System.Net;
 using System.Runtime.Versioning;
 using System.Threading;
+using System.Threading.Tasks;
 using WinDivertSharp;
 
-namespace FastGithub.PacketIntercept
+namespace FastGithub.PacketIntercept.Tcp
 {
     /// <summary>
     /// tcp拦截器
@@ -37,13 +38,15 @@ namespace FastGithub.PacketIntercept
         /// 拦截指定端口的数据包
         /// </summary>
         /// <param name="cancellationToken"></param>
-        public void Intercept(CancellationToken cancellationToken)
+        public async Task InterceptAsync(CancellationToken cancellationToken)
         {
             if (this.oldServerPort == this.newServerPort)
             {
                 return;
             }
 
+            await Task.Yield();
+
             var handle = WinDivert.WinDivertOpen(this.filter, WinDivertLayer.Network, 0, WinDivertOpenFlags.None);
             if (handle == IntPtr.Zero)
             {

+ 1 - 13
FastGithub.PacketIntercept/TcpInterceptHostedService.cs

@@ -31,20 +31,8 @@ namespace FastGithub.PacketIntercept
         /// <returns></returns>
         protected override Task ExecuteAsync(CancellationToken stoppingToken)
         {
-            var tasks = this.tcpInterceptors.Select(item => this.InterceptAsync(item, stoppingToken));
+            var tasks = this.tcpInterceptors.Select(item => item.InterceptAsync(stoppingToken));
             return Task.WhenAll(tasks);
         }
-
-        /// <summary>
-        /// 拦截
-        /// </summary>
-        /// <param name="interceptor"></param>
-        /// <param name="cancellationToken"></param>
-        /// <returns></returns>
-        private async Task InterceptAsync(ITcpInterceptor interceptor, CancellationToken cancellationToken)
-        {
-            await Task.Yield();
-            interceptor.Intercept(cancellationToken);
-        }
     }
 }