$nameservers */ private readonly array $nameservers; private readonly HttpClient $httpClient; private readonly DnsResolver $subResolver; private readonly DnsConfigLoader $configLoader; private readonly Cache $cache; /** * @param non-empty-array $nameservers */ public function __construct(array $nameservers, ?HttpClient $httpClient = null, ?DnsResolver $resolver = null, ?DnsConfigLoader $configLoader = null, ?Cache $cache = null) { /** @psalm-suppress TypeDoesNotContainType */ if (\count($nameservers) < 1) { throw new DnsConfigException("At least one nameserver is required for a valid config"); } foreach ($nameservers as $nameserver) { /** @psalm-suppress DocblockContradiction */ if (!($nameserver instanceof DoHNameserver)) { throw new DnsConfigException("Invalid nameserver: {$nameserver}"); } } $this->nameservers = $nameservers; $this->httpClient = $httpClient ?? HttpClientBuilder::buildDefault(); $this->cache = $cache ?? new LocalCache(256, 5.0); $this->configLoader = $configLoader ?? (\stripos(PHP_OS, "win") === 0 ? new WindowsDnsConfigLoader() : new UnixDnsConfigLoader()); $this->subResolver = $resolver ?? new Rfc1035StubDnsResolver(null, $this->configLoader); } /** * @return non-empty-array */ public function getDoHNameservers(): array { return $this->nameservers; } public function isDoHNameserver(string $string): bool { foreach ($this->nameservers as $nameserver) { if ($nameserver->getHost() === $string) { return true; } } return false; } public function getHttpClient(): HttpClient { return $this->httpClient; } public function getCache(): Cache { return $this->cache; } public function getConfigLoader(): DnsConfigLoader { return $this->configLoader; } public function getSubResolver(): DnsResolver { return $this->subResolver; } }