2
0

GithubDnsHttpHandler.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using FastGithub.Scanner;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using System;
  4. using System.Net.Http;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. namespace FastGithub.ReverseProxy
  8. {
  9. /// <summary>
  10. /// Github的dns解析的httpHandler
  11. /// 使扫描索结果作为github的https请求的域名解析
  12. /// </summary>
  13. sealed class GithubDnsHttpHandler : DelegatingHandler
  14. {
  15. private readonly IGithubScanResults scanResults;
  16. /// <summary>
  17. /// Github的dns解析的httpHandler
  18. /// </summary>
  19. /// <param name="scanResults"></param>
  20. /// <param name="handler"></param>
  21. public GithubDnsHttpHandler(IGithubScanResults scanResults, HttpMessageHandler handler)
  22. : base(handler)
  23. {
  24. this.scanResults = scanResults;
  25. }
  26. /// <summary>
  27. /// 发送消息
  28. /// </summary>
  29. /// <param name="request"></param>
  30. /// <param name="cancellationToken"></param>
  31. /// <returns></returns>
  32. protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  33. {
  34. var uri = request.RequestUri;
  35. if (uri != null && uri.HostNameType == UriHostNameType.Dns)
  36. {
  37. var address = this.scanResults.FindBestAddress(uri.Host);
  38. if (address != null)
  39. {
  40. var builder = new UriBuilder(uri)
  41. {
  42. Host = address.ToString()
  43. };
  44. request.RequestUri = builder.Uri;
  45. request.Headers.Host = uri.Host;
  46. }
  47. }
  48. return await base.SendAsync(request, cancellationToken);
  49. }
  50. }
  51. }