using DNS.Client.RequestResolver; using DNS.Protocol; using DNS.Protocol.ResourceRecords; using FastGithub.Scanner; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System.Linq; using System.Net; using System.Threading; using System.Threading.Tasks; namespace FastGithub.Dns { /// /// github相关域名解析器 /// [Service(ServiceLifetime.Singleton)] sealed class GithubRequestResolver : IRequestResolver { private readonly IGithubScanResults githubScanResults; private readonly IOptionsMonitor options; private readonly ILogger logger; /// /// github相关域名解析器 /// /// /// /// public GithubRequestResolver( IGithubScanResults githubScanResults, IOptionsMonitor options, ILogger logger) { this.githubScanResults = githubScanResults; this.options = options; this.logger = logger; } /// /// 解析域名 /// /// /// /// public Task Resolve(IRequest request, CancellationToken cancellationToken = default) { var response = Response.FromRequest(request); var question = request.Questions.FirstOrDefault(); if (question != null && question.Type == RecordType.A) { var domain = question.Name.ToString(); var address = this.githubScanResults.FindBestAddress(domain); if (address != null) { address = IPAddress.Loopback; var ttl = this.options.CurrentValue.GithubTTL; var record = new IPAddressResourceRecord(question.Name, address, ttl); response.AnswerRecords.Add(record); this.logger.LogInformation(record.ToString()); } } return Task.FromResult(response); } } }