mirror of
https://github.com/danog/dns.git
synced 2025-01-23 05:51:11 +01:00
44 lines
1.5 KiB
PHP
44 lines
1.5 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace Amp\Dns;
|
||
|
|
||
|
use Amp\Failure;
|
||
|
use Amp\Promise;
|
||
|
use Amp\Success;
|
||
|
|
||
|
class BlockingFallbackResolver implements Resolver
|
||
|
{
|
||
|
public function resolve(string $name, int $typeRestriction = null): Promise
|
||
|
{
|
||
|
if (!\in_array($typeRestriction, [Record::A, null], true)) {
|
||
|
return new Failure(new DnsException("Query for '{$name}' failed, because loading the system's DNS configuration failed and querying records other than A records isn't supported in blocking fallback mode."));
|
||
|
}
|
||
|
|
||
|
return $this->query($name, Record::A);
|
||
|
}
|
||
|
|
||
|
public function query(string $name, int $type): Promise
|
||
|
{
|
||
|
if ($type !== Record::A) {
|
||
|
return new Failure(new DnsException("Query for '{$name}' failed, because loading the system's DNS configuration failed and querying records other than A records isn't supported in blocking fallback mode."));
|
||
|
}
|
||
|
|
||
|
$result = \gethostbynamel($name);
|
||
|
if ($result === false) {
|
||
|
return new Failure(new DnsException("Query for '{$name}' failed, because loading the system's DNS configuration failed and blocking fallback via gethostbynamel() failed, too."));
|
||
|
}
|
||
|
|
||
|
if ($result === []) {
|
||
|
return new Failure(new NoRecordException("No records returned for '{$name}' using blocking fallback mode."));
|
||
|
}
|
||
|
|
||
|
$records = [];
|
||
|
|
||
|
foreach ($result as $record) {
|
||
|
$records[] = new Record($record, Record::A, null);
|
||
|
}
|
||
|
|
||
|
return new Success($records);
|
||
|
}
|
||
|
}
|