1
0
Fork 0
mirror of https://github.com/Yetangitu/ampache synced 2025-10-04 18:29:40 +02:00
ampache/modules/React/Dns/Resolver/Resolver.php

59 lines
1.6 KiB
PHP

<?php
namespace React\Dns\Resolver;
use React\Dns\Query\ExecutorInterface;
use React\Dns\Query\Query;
use React\Dns\RecordNotFoundException;
use React\Dns\Model\Message;
class Resolver
{
private $nameserver;
private $executor;
public function __construct($nameserver, ExecutorInterface $executor)
{
$this->nameserver = $nameserver;
$this->executor = $executor;
}
public function resolve($domain)
{
$that = $this;
$query = new Query($domain, Message::TYPE_A, Message::CLASS_IN, time());
return $this->executor
->query($this->nameserver, $query)
->then(function (Message $response) use ($that) {
return $that->extractAddress($response, Message::TYPE_A);
});
}
public function extractAddress(Message $response, $type)
{
$answer = $this->pickRandomAnswerOfType($response, $type);
$address = $answer->data;
return $address;
}
public function pickRandomAnswerOfType(Message $response, $type)
{
// TODO: filter by name to make sure domain matches
// TODO: resolve CNAME aliases
$filteredAnswers = array_filter($response->answers, function ($answer) use ($type) {
return $type === $answer->type;
});
if (0 === count($filteredAnswers)) {
$message = sprintf('DNS Request did not return valid answer. Received answers: %s', json_encode($response->answers));
throw new RecordNotFoundException($message);
}
$answer = $filteredAnswers[array_rand($filteredAnswers)];
return $answer;
}
}