KestrelServerOptionsExtensions.cs 3.6 KB

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