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)
        {
        }
        /// 
        /// 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);
        }
    }
}