public function query(string $nameServer, Query $query) : PromiseInterface { return $this->cache->lookup($query)->then(function ($cachedRecords) use($query) { return $this->buildResponse($query, $cachedRecords); }, function () use($nameServer, $query) { return $this->executor->query($nameServer, $query)->then(function ($response) use($query) { $this->cache->storeResponseMessage($query->getCurrentTime(), $response); 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); }
protected function resolveInternal(string $nameServer, Query $query) { return $this->executor->query($nameServer, $query)->then(function (Message $response) use($query) { return $this->extractAddress($query, $response); }); }