using FastGithub.Configuration; using System.Collections.Generic; using System.Net; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; namespace FastGithub.DomainResolve { /// /// 域名解析器 /// sealed class DomainResolver : IDomainResolver { private readonly DnsClient dnsClient; private readonly DomainSpeedTestService speedTestService; /// /// 域名解析器 /// /// /// public DomainResolver( DnsClient dnsClient, DomainSpeedTestService speedTestService) { this.dnsClient = dnsClient; this.speedTestService = speedTestService; } /// /// 解析ip /// /// 域名 /// /// public async Task ResolveAsync(string domain, CancellationToken cancellationToken = default) { await foreach (var address in this.ResolveAllAsync(domain, cancellationToken)) { return address; } throw new FastGithubException($"解析不到{domain}的IP"); } /// /// 解析域名 /// /// 域名 /// /// public async IAsyncEnumerable ResolveAllAsync(string domain, [EnumeratorCancellation] CancellationToken cancellationToken) { var addresses = this.speedTestService.GetIPAddresses(domain); if (addresses.Length > 0) { foreach (var address in addresses) { yield return address; } } else { this.speedTestService.Add(domain); await foreach (var address in this.dnsClient.ResolveAsync(domain, cancellationToken)) { yield return address; } } } } }