KestrelServerOptionsExtensions.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using FastGithub.Configuration;
  2. using FastGithub.ReverseProxy;
  3. using Microsoft.AspNetCore.Connections;
  4. using Microsoft.AspNetCore.Hosting;
  5. using Microsoft.AspNetCore.Server.Kestrel.Core;
  6. using Microsoft.Extensions.DependencyInjection;
  7. using Microsoft.Extensions.Logging;
  8. using Microsoft.Extensions.Options;
  9. using System;
  10. using System.Net;
  11. namespace FastGithub
  12. {
  13. /// <summary>
  14. /// Kestrel扩展
  15. /// </summary>
  16. public static class KestrelServerOptionsExtensions
  17. {
  18. /// <summary>
  19. /// 监听http的反向代理
  20. /// </summary>
  21. /// <param name="kestrel"></param>
  22. public static void ListenHttpReverseProxy(this KestrelServerOptions kestrel)
  23. {
  24. const int HTTP_PORT = 80;
  25. var logger = kestrel.GetLogger();
  26. if (LocalMachine.CanListenTcp(HTTP_PORT) == false)
  27. {
  28. logger.LogWarning($"由于tcp端口{HTTP_PORT}已经被其它进程占用,http反向代理功能将受限");
  29. }
  30. else
  31. {
  32. kestrel.Listen(IPAddress.Any, HTTP_PORT);
  33. logger.LogInformation($"已监听http反向代理,访问 http://127.0.0.1 或本机其它任意ip可进入Dashboard");
  34. }
  35. }
  36. /// <summary>
  37. /// 监听https的反向代理
  38. /// </summary>
  39. /// <param name="kestrel"></param>
  40. public static void ListenHttpsReverseProxy(this KestrelServerOptions kestrel)
  41. {
  42. const int HTTPS_PORT = 443;
  43. if (OperatingSystem.IsWindows())
  44. {
  45. TcpTable.KillPortOwner(HTTPS_PORT);
  46. }
  47. if (LocalMachine.CanListenTcp(HTTPS_PORT) == false)
  48. {
  49. throw new FastGithubException($"由于tcp端口{HTTPS_PORT}已经被其它进程占用,{nameof(FastGithub)}无法进行必须的https反向代理");
  50. }
  51. var certService = kestrel.ApplicationServices.GetRequiredService<CertService>();
  52. certService.CreateCaCertIfNotExists();
  53. certService.InstallAndTrustCaCert();
  54. kestrel.Listen(IPAddress.Any, HTTPS_PORT,
  55. listen => listen.UseHttps(https =>
  56. https.ServerCertificateSelector = (ctx, domain) =>
  57. certService.GetOrCreateServerCert(domain)));
  58. var logger = kestrel.GetLogger();
  59. logger.LogInformation($"已监听https反向代理,访问 https://127.0.0.1 或本机其它任意ip可进入Dashboard");
  60. }
  61. /// <summary>
  62. /// 监听github的ssh的代理
  63. /// </summary>
  64. /// <param name="kestrel"></param>
  65. public static void ListenGithubSshProxy(this KestrelServerOptions kestrel)
  66. {
  67. var listenOptions = kestrel.ApplicationServices.GetRequiredService<IOptions<FastGithubOptions>>();
  68. var sshPort = listenOptions.Value.Listen.SshPort;
  69. var logger = kestrel.GetLogger();
  70. if (LocalMachine.CanListenTcp(sshPort) == false)
  71. {
  72. logger.LogWarning($"由于tcp端口{sshPort}已经被其它进程占用,github的ssh代理功能将受限");
  73. }
  74. else
  75. {
  76. kestrel.Listen(IPAddress.Any, sshPort, listen => listen.UseConnectionHandler<GithubSshHandler>());
  77. logger.LogInformation("已监听github的ssh代理");
  78. }
  79. }
  80. /// <summary>
  81. /// 获取日志
  82. /// </summary>
  83. /// <param name="kestrel"></param>
  84. /// <returns></returns>
  85. private static ILogger GetLogger(this KestrelServerOptions kestrel)
  86. {
  87. var loggerFactory = kestrel.ApplicationServices.GetRequiredService<ILoggerFactory>();
  88. return loggerFactory.CreateLogger($"{nameof(FastGithub)}.{nameof(ReverseProxy)}");
  89. }
  90. }
  91. }