mirror of
https://github.com/Yetangitu/ampache
synced 2025-10-05 19:41:55 +02:00
Move from React 0.4.0 to 0.3.4 for PHP 5.3 compatibility reasons
This commit is contained in:
parent
d3f01a3bc7
commit
7f82bea13e
50 changed files with 608 additions and 1937 deletions
|
@ -20,79 +20,40 @@ class Resolver
|
|||
|
||||
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 ($query) {
|
||||
return $this->extractAddress($query, $response);
|
||||
->then(function (Message $response) use ($that) {
|
||||
return $that->extractAddress($response, Message::TYPE_A);
|
||||
});
|
||||
}
|
||||
|
||||
public function extractAddress(Query $query, Message $response)
|
||||
public function extractAddress(Message $response, $type)
|
||||
{
|
||||
$answers = $response->answers;
|
||||
|
||||
$addresses = $this->resolveAliases($answers, $query->name);
|
||||
|
||||
if (0 === count($addresses)) {
|
||||
$message = 'DNS Request did not return valid answer.';
|
||||
throw new RecordNotFoundException($message);
|
||||
}
|
||||
|
||||
$address = $addresses[array_rand($addresses)];
|
||||
$answer = $this->pickRandomAnswerOfType($response, $type);
|
||||
$address = $answer->data;
|
||||
return $address;
|
||||
}
|
||||
|
||||
public function resolveAliases(array $answers, $name)
|
||||
public function pickRandomAnswerOfType(Message $response, $type)
|
||||
{
|
||||
$named = $this->filterByName($answers, $name);
|
||||
$aRecords = $this->filterByType($named, Message::TYPE_A);
|
||||
$cnameRecords = $this->filterByType($named, Message::TYPE_CNAME);
|
||||
// TODO: filter by name to make sure domain matches
|
||||
// TODO: resolve CNAME aliases
|
||||
|
||||
if ($aRecords) {
|
||||
return $this->mapRecordData($aRecords);
|
||||
}
|
||||
|
||||
if ($cnameRecords) {
|
||||
$aRecords = array();
|
||||
|
||||
$cnames = $this->mapRecordData($cnameRecords);
|
||||
foreach ($cnames as $cname) {
|
||||
$targets = $this->filterByName($answers, $cname);
|
||||
$aRecords = array_merge(
|
||||
$aRecords,
|
||||
$this->resolveAliases($answers, $cname)
|
||||
);
|
||||
}
|
||||
|
||||
return $aRecords;
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
|
||||
private function filterByName(array $answers, $name)
|
||||
{
|
||||
return $this->filterByField($answers, 'name', $name);
|
||||
}
|
||||
|
||||
private function filterByType(array $answers, $type)
|
||||
{
|
||||
return $this->filterByField($answers, 'type', $type);
|
||||
}
|
||||
|
||||
private function filterByField(array $answers, $field, $value)
|
||||
{
|
||||
return array_filter($answers, function ($answer) use ($field, $value) {
|
||||
return $value === $answer->$field;
|
||||
$filteredAnswers = array_filter($response->answers, function ($answer) use ($type) {
|
||||
return $type === $answer->type;
|
||||
});
|
||||
}
|
||||
|
||||
private function mapRecordData(array $records)
|
||||
{
|
||||
return array_map(function ($record) {
|
||||
return $record->data;
|
||||
}, $records);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue