HttpClient.cs 2.3 KB

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