2
0

HttpClient.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using System;
  2. using System.Net.Http;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. namespace FastGithub.Http
  6. {
  7. /// <summary>
  8. /// 表示http客户端
  9. /// </summary>
  10. public class HttpClient : HttpMessageInvoker
  11. {
  12. private readonly DomainConfig domainConfig;
  13. private readonly TimeSpan defaltTimeout = TimeSpan.FromMinutes(2d);
  14. /// <summary>
  15. /// http客户端
  16. /// </summary>
  17. /// <param name="domainConfig"></param>
  18. /// <param name="domainResolver"></param>
  19. public HttpClient(DomainConfig domainConfig, IDomainResolver domainResolver)
  20. : this(domainConfig, new HttpClientHandler(domainResolver), disposeHandler: true)
  21. {
  22. this.domainConfig = domainConfig;
  23. }
  24. /// <summary>
  25. /// http客户端
  26. /// </summary>
  27. /// <param name="domainConfig"></param>
  28. /// <param name="handler"></param>
  29. /// <param name="disposeHandler"></param>
  30. internal HttpClient(DomainConfig domainConfig, HttpClientHandler handler, bool disposeHandler)
  31. : base(handler, disposeHandler)
  32. {
  33. this.domainConfig = domainConfig;
  34. }
  35. /// <summary>
  36. /// 发送数据
  37. /// </summary>
  38. /// <param name="request"></param>
  39. /// <param name="cancellationToken"></param>
  40. /// <returns></returns>
  41. public override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  42. {
  43. request.SetRequestContext(new RequestContext
  44. {
  45. Host = request.RequestUri?.Host,
  46. IsHttps = request.RequestUri?.Scheme == Uri.UriSchemeHttps,
  47. TlsSniPattern = this.domainConfig.GetTlsSniPattern(),
  48. TlsIgnoreNameMismatch = this.domainConfig.TlsIgnoreNameMismatch
  49. });
  50. using var timeoutTokenSource = new CancellationTokenSource(this.domainConfig.Timeout ?? defaltTimeout);
  51. using var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutTokenSource.Token);
  52. return base.SendAsync(request, linkedTokenSource.Token);
  53. }
  54. }
  55. }