1
0
Fork 0
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:
Afterster 2014-04-13 08:58:34 +02:00
parent d3f01a3bc7
commit 7f82bea13e
50 changed files with 608 additions and 1937 deletions

View file

@ -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;
}
}