private function extractAddress(Query $query, Message $response) { $answers = $response->answers; $addresses = $this->resolveAliases($answers, $query->getName()); if (0 === count($addresses)) { throw new RecordNotFoundException('DNS Request did not return valid answer.'); } $address = $addresses[array_rand($addresses)]; return $address; }
private function buildResponse(Query $query, array $cachedRecords) : Message { $response = new Message(); $response->header->set('id', $this->generateId()); $response->header->set('qr', 1); $response->header->set('opcode', Message::OPCODE_QUERY); $response->header->set('rd', 1); $response->header->set('rcode', Message::RCODE_OK); $response->questions[] = new Record($query->getName(), $query->getType(), $query->getClass()); foreach ($cachedRecords as $record) { $response->answers[] = $record; } $response->prepare(); return $response; }
public function tryQuery(string $nameServer, Query $query, int $retries, Deferred $deferred) { $errorCallback = function ($error) use($nameServer, $query, $retries, $deferred) { if (false === $error instanceof TimeoutException) { $deferred->reject($error); return; } if (0 >= $retries) { $error = new \RuntimeException(sprintf("DNS query for %s failed: too many retries", $query->getName()), 0, $error); $deferred->reject($error); return; } $this->tryQuery($nameServer, $query, $retries - 1, $deferred); }; $this->executor->query($nameServer, $query)->then([$deferred, 'resolve'], $errorCallback); }
private function serializeQueryToIdentity(Query $query) { return $query->getName() . ':' . $query->getType() . ':' . $query->getClass(); }