fix: implement the ability to specify DNS servers via their domain name

This commit is contained in:
Rekryt
2025-08-29 21:45:41 +03:00
parent d3be5c105d
commit b31b87b82a

View File

@@ -23,21 +23,18 @@ class DNSHelper {
private float $resolveDelay; private float $resolveDelay;
private bool $isUseIpv4; private bool $isUseIpv4;
private bool $isUseIpv6; private bool $isUseIpv6;
private array $dnsServers;
public function __construct(private array $dnsServers = []) { public function __construct(array $dnsServers = []) {
$this->resolveDelay = (getEnv('SYS_DNS_RESOLVE_DELAY') ?? 500) / 1000; $this->resolveDelay = (getEnv('SYS_DNS_RESOLVE_DELAY') ?? 500) / 1000;
$this->isUseIpv4 = (getEnv('SYS_DNS_RESOLVE_IP4') ?? 'true') == 'true'; $this->isUseIpv4 = (getEnv('SYS_DNS_RESOLVE_IP4') ?? 'true') == 'true';
$this->isUseIpv6 = (getEnv('SYS_DNS_RESOLVE_IP6') ?? 'true') == 'true'; $this->isUseIpv6 = (getEnv('SYS_DNS_RESOLVE_IP6') ?? 'true') == 'true';
}
$this->dnsServers = array_filter(
array_map(
/** /**
* @param array $dnsServers
* @return DnsResolver
* @throws DnsException * @throws DnsException
*/ */ function (string $server): ?string {
private function getResolver(array $dnsServers): DnsResolver {
$resolvedServers = array_filter(
array_map(function (string $server): ?string {
if (str_contains($server, ':')) { if (str_contains($server, ':')) {
[$host, $port] = explode(':', $server, 2); [$host, $port] = explode(':', $server, 2);
} else { } else {
@@ -57,13 +54,22 @@ class DNSHelper {
} }
return $port ? "{$ip}:{$port}" : $ip; return $port ? "{$ip}:{$port}" : $ip;
}, $dnsServers) },
$dnsServers
)
); );
}
/**
* @param array $dnsServers
* @return DnsResolver
* @throws DnsException
*/
private function getResolver(array $dnsServers): DnsResolver {
return dnsResolverFactory( return dnsResolverFactory(
new Rfc1035StubDnsResolver( new Rfc1035StubDnsResolver(
null, null,
new class ($resolvedServers) implements DnsConfigLoader { new class ($dnsServers) implements DnsConfigLoader {
public function __construct(private readonly array $dnsServers = []) { public function __construct(private readonly array $dnsServers = []) {
} }
@@ -78,6 +84,7 @@ class DNSHelper {
/** /**
* @param string $domain * @param string $domain
* @return array[] * @return array[]
* @throws DnsException
*/ */
public function resolve(string $domain): array { public function resolve(string $domain): array {
$ipv4 = []; $ipv4 = [];