增加http反向代理;
使用IPGlobalProperties获取全局ip;
This commit is contained in:
		
							parent
							
								
									ddb6747a7a
								
							
						
					
					
						commit
						48e994182f
					
				@ -1,4 +1,5 @@
 | 
				
			|||||||
using System.Diagnostics.CodeAnalysis;
 | 
					using System.Diagnostics.CodeAnalysis;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
using System.Net;
 | 
					using System.Net;
 | 
				
			||||||
using System.Net.NetworkInformation;
 | 
					using System.Net.NetworkInformation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -52,17 +53,10 @@ namespace FastGithub.Configuration
 | 
				
			|||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        private static bool IsLocalMachineIPAddress(IPAddress address)
 | 
					        private static bool IsLocalMachineIPAddress(IPAddress address)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            foreach (var @interface in NetworkInterface.GetAllNetworkInterfaces())
 | 
					            return IPGlobalProperties
 | 
				
			||||||
            {
 | 
					                .GetIPGlobalProperties()
 | 
				
			||||||
                foreach (var addressInfo in @interface.GetIPProperties().UnicastAddresses)
 | 
					                .GetUnicastAddresses()
 | 
				
			||||||
                {
 | 
					                .Any(item => item.Address.Equals(address));
 | 
				
			||||||
                    if (addressInfo.Address.Equals(address))
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        return true;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,10 @@
 | 
				
			|||||||
using DNS.Protocol;
 | 
					using DNS.Protocol;
 | 
				
			||||||
 | 
					using FastGithub.Configuration;
 | 
				
			||||||
using Microsoft.Extensions.Logging;
 | 
					using Microsoft.Extensions.Logging;
 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Diagnostics;
 | 
					using System.Linq;
 | 
				
			||||||
using System.Net;
 | 
					using System.Net;
 | 
				
			||||||
 | 
					using System.Net.NetworkInformation;
 | 
				
			||||||
using System.Net.Sockets;
 | 
					using System.Net.Sockets;
 | 
				
			||||||
using System.Threading;
 | 
					using System.Threading;
 | 
				
			||||||
using System.Threading.Tasks;
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
@ -40,9 +42,15 @@ namespace FastGithub.Dns
 | 
				
			|||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        public void Bind(IPAddress address, int port)
 | 
					        public void Bind(IPAddress address, int port)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (OperatingSystem.IsWindows() && UdpTable.TryGetOwnerProcessId(port, out var processId))
 | 
					            if (OperatingSystem.IsWindows())
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Process.GetProcessById(processId).Kill();
 | 
					                UdpTable.KillPortOwner(port);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var udpListeners = IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners();
 | 
				
			||||||
 | 
					            if (udpListeners.Any(item => item.Port == port))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                throw new FastGithubException($"udp端口{port}已经被其它进程占用");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (OperatingSystem.IsWindows())
 | 
					            if (OperatingSystem.IsWindows())
 | 
				
			||||||
 | 
				
			|||||||
@ -84,15 +84,9 @@ namespace FastGithub.Dns
 | 
				
			|||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        private static IEnumerable<IPAddress> GetLocalMachineIPAddress()
 | 
					        private static IEnumerable<IPAddress> GetLocalMachineIPAddress()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            yield return IPAddress.Loopback;
 | 
					            foreach (var item in IPGlobalProperties.GetIPGlobalProperties().GetUnicastAddresses())
 | 
				
			||||||
            yield return IPAddress.IPv6Loopback;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            foreach (var @interface in NetworkInterface.GetAllNetworkInterfaces())
 | 
					 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                foreach (var addressInfo in @interface.GetIPProperties().UnicastAddresses)
 | 
					                yield return item.Address;
 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    yield return addressInfo.Address;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Buffers.Binary;
 | 
					using System.Buffers.Binary;
 | 
				
			||||||
 | 
					using System.Diagnostics;
 | 
				
			||||||
using System.Net;
 | 
					using System.Net;
 | 
				
			||||||
using System.Net.Sockets;
 | 
					using System.Net.Sockets;
 | 
				
			||||||
using System.Runtime.InteropServices;
 | 
					using System.Runtime.InteropServices;
 | 
				
			||||||
@ -18,6 +19,34 @@ namespace FastGithub.Dns
 | 
				
			|||||||
        [DllImport("iphlpapi.dll", SetLastError = true)]
 | 
					        [DllImport("iphlpapi.dll", SetLastError = true)]
 | 
				
			||||||
        private static extern uint GetExtendedUdpTable(void* pUdpTable, ref int pdwSize, bool bOrder, AddressFamily ulAf, UDP_TABLE_CLASS tableClass, uint reserved = 0);
 | 
					        private static extern uint GetExtendedUdpTable(void* pUdpTable, ref int pdwSize, bool bOrder, AddressFamily ulAf, UDP_TABLE_CLASS tableClass, uint reserved = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 杀死占用进程
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="port"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public static bool KillPortOwner(int port)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (TryGetOwnerProcessId(port, out var pid) == false)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Process.GetProcessById(pid).Kill();
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (ArgumentException)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 获取udp端口的占用进程id
 | 
					        /// 获取udp端口的占用进程id
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
 | 
				
			|||||||
@ -22,9 +22,34 @@ namespace FastGithub
 | 
				
			|||||||
    public static class KestrelServerOptionsExtensions
 | 
					    public static class KestrelServerOptionsExtensions
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 域名证书缓存
 | 
					        /// 服务器证书缓存
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        private static readonly IMemoryCache domainCertCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));
 | 
					        private static readonly IMemoryCache serverCertCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 监听http的反向代理
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="kestrel"></param>
 | 
				
			||||||
 | 
					        public static void ListenHttpReverseProxy(this KestrelServerOptions kestrel)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var loggerFactory = kestrel.ApplicationServices.GetRequiredService<ILoggerFactory>();
 | 
				
			||||||
 | 
					            var logger = loggerFactory.CreateLogger($"{nameof(FastGithub)}.{nameof(ReverseProxy)}");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const int HTTP_PORT = 80;
 | 
				
			||||||
 | 
					            if (OperatingSystem.IsWindows())
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TcpTable.KillPortOwner(HTTP_PORT);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (CanTcpListen(HTTP_PORT) == false)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.LogWarning($"无法监听tcp端口{HTTP_PORT},{nameof(FastGithub)}无法http反向代理");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                kestrel.Listen(IPAddress.Any, HTTP_PORT);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 监听https的反向代理
 | 
					        /// 监听https的反向代理
 | 
				
			||||||
@ -43,10 +68,34 @@ namespace FastGithub
 | 
				
			|||||||
            GeneratorCaCert(caPublicCerPath, caPrivateKeyPath);
 | 
					            GeneratorCaCert(caPublicCerPath, caPrivateKeyPath);
 | 
				
			||||||
            InstallCaCert(caPublicCerPath, logger);
 | 
					            InstallCaCert(caPublicCerPath, logger);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            kestrel.Listen(IPAddress.Any, 443, listen =>
 | 
					            const int HTTPS_PORT = 443;
 | 
				
			||||||
 | 
					            if (OperatingSystem.IsWindows())
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TcpTable.KillPortOwner(HTTPS_PORT);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (CanTcpListen(HTTPS_PORT) == false)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.LogWarning($"无法监听tcp端口{HTTPS_PORT},{nameof(FastGithub)}无法https反向代理");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                kestrel.Listen(IPAddress.Any, HTTPS_PORT, listen =>
 | 
				
			||||||
                    listen.UseHttps(https =>
 | 
					                    listen.UseHttps(https =>
 | 
				
			||||||
                        https.ServerCertificateSelector = (ctx, domain) =>
 | 
					                        https.ServerCertificateSelector = (ctx, domain) =>
 | 
				
			||||||
                        GetDomainCert(domain, caPublicCerPath, caPrivateKeyPath)));
 | 
					                            GetServerCert(domain, caPublicCerPath, caPrivateKeyPath)));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 是否可以监听指定端口
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="port"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        private static bool CanTcpListen(int port)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var tcpListeners = IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners();
 | 
				
			||||||
 | 
					            return tcpListeners.Any(item => item.Port == port) == false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
@ -81,9 +130,9 @@ namespace FastGithub
 | 
				
			|||||||
            if (OperatingSystem.IsWindows() == false)
 | 
					            if (OperatingSystem.IsWindows() == false)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                logger.LogWarning($"不支持自动安装证书{caPublicCerPath}:请手动安装证书到根证书颁发机构");
 | 
					                logger.LogWarning($"不支持自动安装证书{caPublicCerPath}:请手动安装证书到根证书颁发机构");
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					
 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
            try
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var caCert = new X509Certificate2(caPublicCerPath);
 | 
					                var caCert = new X509Certificate2(caPublicCerPath);
 | 
				
			||||||
@ -100,7 +149,6 @@ namespace FastGithub
 | 
				
			|||||||
                logger.LogWarning($"安装证书{caPublicCerPath}失败:请手动安装到“将所有的证书都放入下载存储”\\“受信任的根证书颁发机构”");
 | 
					                logger.LogWarning($"安装证书{caPublicCerPath}失败:请手动安装到“将所有的证书都放入下载存储”\\“受信任的根证书颁发机构”");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 获取颁发给指定域名的证书
 | 
					        /// 获取颁发给指定域名的证书
 | 
				
			||||||
@ -109,9 +157,9 @@ namespace FastGithub
 | 
				
			|||||||
        /// <param name="caPublicCerPath"></param>
 | 
					        /// <param name="caPublicCerPath"></param>
 | 
				
			||||||
        /// <param name="caPrivateKeyPath"></param>
 | 
					        /// <param name="caPrivateKeyPath"></param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        private static X509Certificate2 GetDomainCert(string? domain, string caPublicCerPath, string caPrivateKeyPath)
 | 
					        private static X509Certificate2 GetServerCert(string? domain, string caPublicCerPath, string caPrivateKeyPath)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return domainCertCache.GetOrCreate(domain ?? string.Empty, GetOrCreateCert);
 | 
					            return serverCertCache.GetOrCreate(domain ?? string.Empty, GetOrCreateCert);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // 生成域名的1年证书
 | 
					            // 生成域名的1年证书
 | 
				
			||||||
            X509Certificate2 GetOrCreateCert(ICacheEntry entry)
 | 
					            X509Certificate2 GetOrCreateCert(ICacheEntry entry)
 | 
				
			||||||
@ -138,17 +186,14 @@ namespace FastGithub
 | 
				
			|||||||
                yield return host;
 | 
					                yield return host;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            yield return Environment.MachineName;
 | 
					            var globalPropreties = IPGlobalProperties.GetIPGlobalProperties();
 | 
				
			||||||
            yield return IPAddress.Loopback.ToString();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var @interface in NetworkInterface.GetAllNetworkInterfaces())
 | 
					            yield return globalPropreties.HostName;
 | 
				
			||||||
 | 
					            foreach (var item in globalPropreties.GetUnicastAddresses())
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                foreach (var addressInfo in @interface.GetIPProperties().UnicastAddresses)
 | 
					                if (item.Address.AddressFamily == AddressFamily.InterNetwork)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    if (addressInfo.Address.AddressFamily == AddressFamily.InterNetwork)
 | 
					                    yield return item.Address.ToString();
 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        yield return addressInfo.Address.ToString();
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -21,11 +21,11 @@ namespace FastGithub
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 使用https反向代理中间件
 | 
					        /// 使用反向代理中间件
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="app"></param> 
 | 
					        /// <param name="app"></param> 
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        public static IApplicationBuilder UseHttpsReverseProxy(this IApplicationBuilder app)
 | 
					        public static IApplicationBuilder UseReverseProxy(this IApplicationBuilder app)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var middleware = app.ApplicationServices.GetRequiredService<ReverseProxyMiddleware>();
 | 
					            var middleware = app.ApplicationServices.GetRequiredService<ReverseProxyMiddleware>();
 | 
				
			||||||
            return app.Use(next => context => middleware.InvokeAsync(context, next));
 | 
					            return app.Use(next => context => middleware.InvokeAsync(context, next));
 | 
				
			||||||
 | 
				
			|||||||
@ -1,65 +0,0 @@
 | 
				
			|||||||
using Microsoft.Extensions.Hosting;
 | 
					 | 
				
			||||||
using Microsoft.Extensions.Logging;
 | 
					 | 
				
			||||||
using System;
 | 
					 | 
				
			||||||
using System.Diagnostics;
 | 
					 | 
				
			||||||
using System.Threading;
 | 
					 | 
				
			||||||
using System.Threading.Tasks;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace FastGithub.ReverseProxy
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    /// <summary>
 | 
					 | 
				
			||||||
    /// 反向代理端口检测后台服务
 | 
					 | 
				
			||||||
    /// </summary>
 | 
					 | 
				
			||||||
    sealed class ReverseProxyHostedService : IHostedService
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        private readonly ILogger<ReverseProxyHostedService> logger;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// 反向代理端口检测后台服务
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        /// <param name="logger"></param>
 | 
					 | 
				
			||||||
        public ReverseProxyHostedService(ILogger<ReverseProxyHostedService> logger)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            this.logger = logger;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// 服务启动时
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        /// <param name="cancellationToken"></param>
 | 
					 | 
				
			||||||
        /// <returns></returns>
 | 
					 | 
				
			||||||
        public Task StartAsync(CancellationToken cancellationToken)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            const int HTTPSPORT = 443;
 | 
					 | 
				
			||||||
            if (OperatingSystem.IsWindows())
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                if (TcpTable.TryGetOwnerProcessId(HTTPSPORT, out var pid))
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    try
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        Process.GetProcessById(pid).Kill();
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    catch (ArgumentException)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    catch (Exception)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        var processName = Process.GetProcessById(pid).ProcessName;
 | 
					 | 
				
			||||||
                        this.logger.LogError($"由于进程{processName}({pid})占用了{HTTPSPORT}端口,{nameof(FastGithub)}的反向代理无法工作");
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            return Task.CompletedTask;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// 服务停止时
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        /// <param name="cancellationToken"></param>
 | 
					 | 
				
			||||||
        /// <returns></returns>
 | 
					 | 
				
			||||||
        public Task StopAsync(CancellationToken cancellationToken)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return Task.CompletedTask;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -54,7 +54,8 @@ namespace FastGithub.ReverseProxy
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var destinationPrefix = GetDestinationPrefix(host, domainConfig.Destination);
 | 
					                var scheme = context.Request.Scheme;
 | 
				
			||||||
 | 
					                var destinationPrefix = GetDestinationPrefix(scheme, host, domainConfig.Destination);
 | 
				
			||||||
                var httpClient = this.httpClientFactory.CreateHttpClient(domainConfig);
 | 
					                var httpClient = this.httpClientFactory.CreateHttpClient(domainConfig);
 | 
				
			||||||
                var error = await httpForwarder.SendAsync(context, destinationPrefix, httpClient);
 | 
					                var error = await httpForwarder.SendAsync(context, destinationPrefix, httpClient);
 | 
				
			||||||
                await HandleErrorAsync(context, error);
 | 
					                await HandleErrorAsync(context, error);
 | 
				
			||||||
@ -64,12 +65,13 @@ namespace FastGithub.ReverseProxy
 | 
				
			|||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 获取目标前缀
 | 
					        /// 获取目标前缀
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="scheme"></param>
 | 
				
			||||||
        /// <param name="host"></param>
 | 
					        /// <param name="host"></param>
 | 
				
			||||||
        /// <param name="destination"></param>
 | 
					        /// <param name="destination"></param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        private string GetDestinationPrefix(string host, Uri? destination)
 | 
					        private string GetDestinationPrefix(string scheme, string host, Uri? destination)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var defaultValue = $"https://{host}/";
 | 
					            var defaultValue = $"{scheme}://{host}/";
 | 
				
			||||||
            if (destination == null)
 | 
					            if (destination == null)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                return defaultValue;
 | 
					                return defaultValue;
 | 
				
			||||||
 | 
				
			|||||||
@ -19,8 +19,7 @@ namespace FastGithub
 | 
				
			|||||||
                .AddMemoryCache()
 | 
					                .AddMemoryCache()
 | 
				
			||||||
                .AddHttpForwarder()
 | 
					                .AddHttpForwarder()
 | 
				
			||||||
                .AddSingleton<RequestLoggingMilldeware>()
 | 
					                .AddSingleton<RequestLoggingMilldeware>()
 | 
				
			||||||
                .AddSingleton<ReverseProxyMiddleware>()
 | 
					                .AddSingleton<ReverseProxyMiddleware>();
 | 
				
			||||||
                .AddHostedService<ReverseProxyHostedService>();
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Buffers.Binary;
 | 
					using System.Buffers.Binary;
 | 
				
			||||||
 | 
					using System.Diagnostics;
 | 
				
			||||||
using System.Net;
 | 
					using System.Net;
 | 
				
			||||||
using System.Net.Sockets;
 | 
					using System.Net.Sockets;
 | 
				
			||||||
using System.Runtime.InteropServices;
 | 
					using System.Runtime.InteropServices;
 | 
				
			||||||
@ -18,6 +19,34 @@ namespace FastGithub.ReverseProxy
 | 
				
			|||||||
        [DllImport("iphlpapi.dll", SetLastError = true)]
 | 
					        [DllImport("iphlpapi.dll", SetLastError = true)]
 | 
				
			||||||
        private static extern uint GetExtendedTcpTable(void* pTcpTable, ref int pdwSize, bool bOrder, AddressFamily ulAf, TCP_TABLE_CLASS tableClass, uint reserved = 0);
 | 
					        private static extern uint GetExtendedTcpTable(void* pTcpTable, ref int pdwSize, bool bOrder, AddressFamily ulAf, TCP_TABLE_CLASS tableClass, uint reserved = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 杀死占用进程
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="port"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public static bool KillPortOwner(int port)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (TryGetOwnerProcessId(port, out var pid) == false)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Process.GetProcessById(pid).Kill();
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (ArgumentException)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 获取tcp端口的占用进程id
 | 
					        /// 获取tcp端口的占用进程id
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
 | 
				
			|||||||
@ -29,7 +29,7 @@ namespace FastGithub
 | 
				
			|||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        public Task StartAsync(CancellationToken cancellationToken)
 | 
					        public Task StartAsync(CancellationToken cancellationToken)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            this.logger.LogInformation($"{nameof(FastGithub)}启动完成,访问https://127.0.0.1或本机其它任意ip可进入Dashboard");
 | 
					            this.logger.LogInformation($"{nameof(FastGithub)}启动完成,访问http://127.0.0.1或本机其它任意ip可进入Dashboard");
 | 
				
			||||||
            return Task.CompletedTask;
 | 
					            return Task.CompletedTask;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -41,7 +41,11 @@ namespace FastGithub
 | 
				
			|||||||
                .ConfigureWebHostDefaults(webBuilder =>
 | 
					                .ConfigureWebHostDefaults(webBuilder =>
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    webBuilder.UseStartup<Startup>();
 | 
					                    webBuilder.UseStartup<Startup>();
 | 
				
			||||||
                    webBuilder.UseKestrel(kestrel => kestrel.ListenHttpsReverseProxy());
 | 
					                    webBuilder.UseKestrel(kestrel =>
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        kestrel.ListenHttpReverseProxy();
 | 
				
			||||||
 | 
					                        kestrel.ListenHttpsReverseProxy();
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -43,7 +43,7 @@ namespace FastGithub
 | 
				
			|||||||
        public void Configure(IApplicationBuilder app)
 | 
					        public void Configure(IApplicationBuilder app)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            app.UseRequestLogging();
 | 
					            app.UseRequestLogging();
 | 
				
			||||||
            app.UseHttpsReverseProxy();
 | 
					            app.UseReverseProxy();
 | 
				
			||||||
            app.UseRouting();
 | 
					            app.UseRouting();
 | 
				
			||||||
            app.UseEndpoints(endpoints =>
 | 
					            app.UseEndpoints(endpoints =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 | 
				
			|||||||
@ -11,7 +11,7 @@ github加速神器
 | 
				
			|||||||
如果不能下载[releases](https://github.com/xljiulang/FastGithub/releases)里发布的程序,可以到Q群`307306673`里面的群文件下载。
 | 
					如果不能下载[releases](https://github.com/xljiulang/FastGithub/releases)里发布的程序,可以到Q群`307306673`里面的群文件下载。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 使用说明
 | 
					### 使用说明
 | 
				
			||||||
运行FastGithub,然后浏览器访问 https://127.0.0.1 或其它ip进入Dashboard
 | 
					运行FastGithub,然后浏览器访问 http://127.0.0.1 或其它ip进入Dashboard
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 安全性说明
 | 
					### 安全性说明
 | 
				
			||||||
FastGithub生成自签名CA证书,要求安装到本机设备。FastGithub为每台不同设备生成的CA不同的证书,保存在CACert文件夹下,请不要将证书私钥泄露给他人,以免造成损失。
 | 
					FastGithub生成自签名CA证书,要求安装到本机设备。FastGithub为每台不同设备生成的CA不同的证书,保存在CACert文件夹下,请不要将证书私钥泄露给他人,以免造成损失。
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user