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 DomainSpeedTester speedTester; /// /// 域名解析器 /// /// public DomainResolver(DomainSpeedTester speedTester) { this.speedTester = speedTester; } /// /// 解析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) { if (this.speedTester.TryGetOrderAllIPAddresses(domain, out var addresses)) { foreach (var address in addresses) { yield return address; } } else { this.speedTester.Add(domain); await foreach (var address in this.speedTester.GetOrderAnyIPAddressAsync(domain, cancellationToken)) { yield return address; } } } } }