using FastGithub.Configuration; using FastGithub.DomainResolve; using System; using System.Net.Http; using System.Threading; using System.Threading.Tasks; namespace FastGithub.Http { /// /// 表示http客户端 /// public class HttpClient : HttpMessageInvoker { private readonly DomainConfig domainConfig; private readonly TimeSpan defaltTimeout = TimeSpan.FromMinutes(2d); /// /// http客户端 /// /// /// public HttpClient(DomainConfig domainConfig, IDomainResolver domainResolver) : this(domainConfig, new HttpClientHandler(domainResolver), disposeHandler: true) { this.domainConfig = domainConfig; } /// /// http客户端 /// /// /// /// internal HttpClient(DomainConfig domainConfig, HttpClientHandler handler, bool disposeHandler) : base(handler, disposeHandler) { this.domainConfig = domainConfig; } /// /// 发送数据 /// /// /// /// public override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { request.SetRequestContext(new RequestContext { Host = request.RequestUri?.Host, IsHttps = request.RequestUri?.Scheme == Uri.UriSchemeHttps, TlsSniPattern = this.domainConfig.GetTlsSniPattern(), TlsIgnoreNameMismatch = this.domainConfig.TlsIgnoreNameMismatch }); using var timeoutTokenSource = new CancellationTokenSource(this.domainConfig.Timeout ?? defaltTimeout); using var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutTokenSource.Token); return base.SendAsync(request, linkedTokenSource.Token); } } }