HttpClient.cs 2.2 KB

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