Startup.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using FastGithub.Configuration;
  2. using FastGithub.FlowAnalyze;
  3. using FastGithub.HttpServer;
  4. using Microsoft.AspNetCore.Builder;
  5. using Microsoft.AspNetCore.Http;
  6. using Microsoft.Extensions.Configuration;
  7. using Microsoft.Extensions.DependencyInjection;
  8. using Microsoft.Extensions.Options;
  9. using System;
  10. namespace FastGithub
  11. {
  12. /// <summary>
  13. /// 启动项
  14. /// </summary>
  15. public class Startup
  16. {
  17. public IConfiguration Configuration { get; }
  18. /// <summary>
  19. /// 启动项
  20. /// </summary>
  21. /// <param name="configuration"></param>
  22. public Startup(IConfiguration configuration)
  23. {
  24. this.Configuration = configuration;
  25. }
  26. /// <summary>
  27. /// 配置服务
  28. /// </summary>
  29. /// <param name="services"></param>
  30. public void ConfigureServices(IServiceCollection services)
  31. {
  32. services.Configure<FastGithubOptions>(this.Configuration.GetSection(nameof(FastGithub)));
  33. services.AddConfiguration();
  34. services.AddDomainResolve();
  35. services.AddHttpClient();
  36. services.AddReverseProxy();
  37. services.AddFlowAnalyze();
  38. services.AddHostedService<AppHostedService>();
  39. if (OperatingSystem.IsWindows())
  40. {
  41. services.AddPacketIntercept();
  42. }
  43. }
  44. /// <summary>
  45. /// 配置中间件
  46. /// </summary>
  47. /// <param name="app"></param>
  48. public void Configure(IApplicationBuilder app)
  49. {
  50. var httpProxyPort = app.ApplicationServices.GetRequiredService<IOptions<FastGithubOptions>>().Value.HttpProxyPort;
  51. app.MapWhen(context => context.Connection.LocalPort == httpProxyPort, appBuilder =>
  52. {
  53. appBuilder.UseHttpProxy();
  54. });
  55. app.MapWhen(context => context.Connection.LocalPort != httpProxyPort, appBuilder =>
  56. {
  57. appBuilder.UseRequestLogging();
  58. appBuilder.UseHttpReverseProxy();
  59. app.UseStaticFiles();
  60. appBuilder.UseRouting();
  61. appBuilder.UseEndpoints(endpoint =>
  62. {
  63. endpoint.MapGet("/flowStatistics", context =>
  64. {
  65. var loggingFeature = context.Features.Get<IRequestLoggingFeature>();
  66. if (loggingFeature != null)
  67. {
  68. loggingFeature.Enable = false;
  69. }
  70. var flowStatistics = context.RequestServices.GetRequiredService<IFlowAnalyzer>().GetFlowStatistics();
  71. return context.Response.WriteAsJsonAsync(flowStatistics);
  72. });
  73. });
  74. });
  75. }
  76. }
  77. }