HttpClientFactory.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Microsoft.Extensions.Options;
  2. using System;
  3. using System.Net.Http;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. namespace FastGithub.ReverseProxy
  7. {
  8. /// <summary>
  9. /// HttpClient工厂
  10. /// </summary>
  11. sealed class HttpClientFactory
  12. {
  13. private HttpClientHanlder httpClientHanlder;
  14. /// <summary>
  15. /// HttpClient工厂
  16. /// </summary>
  17. /// <param name="domainResolver"></param>
  18. /// <param name="options"></param>
  19. public HttpClientFactory(
  20. DomainResolver domainResolver,
  21. IOptionsMonitor<FastGithubOptions> options)
  22. {
  23. this.httpClientHanlder = new HttpClientHanlder(domainResolver);
  24. options.OnChange(opt => this.httpClientHanlder = new HttpClientHanlder(domainResolver));
  25. }
  26. /// <summary>
  27. /// 创建httpClient
  28. /// </summary>
  29. /// <param name="domainConfig"></param>
  30. /// <returns></returns>
  31. public HttpMessageInvoker CreateHttpClient(DomainConfig domainConfig)
  32. {
  33. return new HttpClient(this.httpClientHanlder, domainConfig, disposeHandler: false);
  34. }
  35. /// <summary>
  36. /// http客户端
  37. /// </summary>
  38. private class HttpClient : HttpMessageInvoker
  39. {
  40. private readonly DomainConfig domainConfig;
  41. public HttpClient(
  42. HttpMessageHandler handler,
  43. DomainConfig domainConfig,
  44. bool disposeHandler = false) : base(handler, disposeHandler)
  45. {
  46. this.domainConfig = domainConfig;
  47. }
  48. /// <summary>
  49. /// 发送数据
  50. /// </summary>
  51. /// <param name="request"></param>
  52. /// <param name="cancellationToken"></param>
  53. /// <returns></returns>
  54. public override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  55. {
  56. request.SetRequestContext(new RequestContext
  57. {
  58. Host = request.RequestUri?.Host,
  59. IsHttps = request.RequestUri?.Scheme == Uri.UriSchemeHttps,
  60. TlsSniPattern = this.domainConfig.GetTlsSniPattern(),
  61. TlsIgnoreNameMismatch = this.domainConfig.TlsIgnoreNameMismatch
  62. });
  63. return base.SendAsync(request, cancellationToken);
  64. }
  65. }
  66. }
  67. }