LoopbackDnsHttpHandler.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using DNS.Client;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using System;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.Http;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. namespace FastGithub.Scanner
  10. {
  11. /// <summary>
  12. /// 由本程序提值的dns的httpHandler
  13. /// </summary>
  14. [Service(ServiceLifetime.Transient)]
  15. sealed class LoopbackDnsHttpHandler : DelegatingHandler
  16. {
  17. /// <summary>
  18. /// 本程序的dns
  19. /// </summary>
  20. private static readonly DnsClient dnsClient = new(IPAddress.Loopback);
  21. /// <summary>
  22. /// 发送消息
  23. /// </summary>
  24. /// <param name="request"></param>
  25. /// <param name="cancellationToken"></param>
  26. /// <returns></returns>
  27. protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  28. {
  29. var uri = request.RequestUri;
  30. if (uri != null && uri.HostNameType == UriHostNameType.Dns)
  31. {
  32. var address = await LookupAsync(uri.Host);
  33. if (address != null)
  34. {
  35. var builder = new UriBuilder(uri)
  36. {
  37. Host = address.ToString()
  38. };
  39. request.RequestUri = builder.Uri;
  40. request.Headers.Host = uri.Host;
  41. }
  42. }
  43. return await base.SendAsync(request, cancellationToken);
  44. }
  45. /// <summary>
  46. /// dns解析ip
  47. /// </summary>
  48. /// <param name="host"></param>
  49. /// <returns></returns>
  50. private static async Task<IPAddress?> LookupAsync(string host)
  51. {
  52. try
  53. {
  54. using var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(500d));
  55. var addresses = await dnsClient.Lookup(host, cancellationToken: cancellationTokenSource.Token);
  56. return addresses.FirstOrDefault();
  57. }
  58. catch (Exception)
  59. {
  60. return default;
  61. }
  62. }
  63. }
  64. }