using FastGithub.ReverseProxy; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using System.Net.Http; using Yarp.ReverseProxy.Forwarder; namespace FastGithub { /// /// gitub反向代理的中间件扩展 /// public static class ReverseProxyApplicationBuilderExtensions { /// /// 使用gitub反向代理中间件 /// /// /// public static IApplicationBuilder UseGithubReverseProxy(this IApplicationBuilder app) { var httpForwarder = app.ApplicationServices.GetRequiredService(); var httpClientHanlder = app.ApplicationServices.GetRequiredService(); var options = app.ApplicationServices.GetRequiredService>(); app.Use(next => async context => { var host = context.Request.Host.Host; if (options.CurrentValue.IsMatch(host) == false) { await context.Response.WriteAsJsonAsync(new { message = $"不支持以{host}访问" }); } else { var port = context.Request.Host.Port ?? 443; var destinationPrefix = $"https://{host}:{port}/"; var httpClient = new HttpMessageInvoker(httpClientHanlder, disposeHandler: false); await httpForwarder.SendAsync(context, destinationPrefix, httpClient); } }); return app; } } }