/** * @covers React\Dns\Resolver\Resolver::resolveAliases * @dataProvider provideAliasedAnswers */ public function testResolveAliases(array $expectedAnswers, array $answers, $name) { $executor = $this->createExecutorMock(); $resolver = new Resolver('8.8.8.8:53', $executor); $answers = $resolver->resolveAliases($answers, $name); $this->assertEquals($expectedAnswers, $answers); }
/** * Connect to $numSeeds DNS seeds * * @param int $numSeeds * @return \React\Promise\Promise|\React\Promise\PromiseInterface */ public function queryDnsSeeds($numSeeds = 1) { $peerList = new Deferred(); // Take $numSeeds $seedHosts = self::dnsSeedHosts(); $seeds = array_slice($seedHosts, 0, min($numSeeds, count($seedHosts))); // Connect to $numSeeds peers /** @var Peer[] $vNetAddr */ $vNetAddr = []; foreach ($seeds as $seed) { echo " [ query DNS seed: " . $seed . " ] \n"; $this->dns->resolve($seed)->then(function ($ipList) use(&$vNetAddr, $peerList, &$numSeeds) { $vNetAddr[] = $ipList; if (count($vNetAddr) == $numSeeds) { $peerList->resolve($vNetAddr); } }); } // Compile the list of lists of peers into $this->knownAddresses return $peerList->promise()->then(function (array $vPeerVAddrs) { shuffle($vPeerVAddrs); /** @var NetworkAddressInterface[] $addresses */ $addresses = []; array_map(function (array $value) use(&$addresses) { foreach ($value as $ip) { $addresses[] = new NetworkAddress(Buffer::hex('01', 8), $ip, 8333); } }, $vPeerVAddrs); $this->knownAddresses = array_merge($this->knownAddresses, $addresses); return $this; }); }
/** @test */ public function resolveSouldProvideDefaultErrorbackToExecutor() { $executor = $this->createExecutorMock(); $executor->expects($this->once())->method('query')->with($this->anything(), $this->isInstanceOf('React\\Dns\\Query\\Query'))->will($this->returnCallback(function ($nameserver, $query) { return Promise\resolve(); })); $resolver = new Resolver('8.8.8.8:53', $executor); $resolver->resolve('igor.io')->then($this->expectCallableNever()); }
public function provideListeners(ListenerAcceptorInterface $acceptor) { $acceptor->addListener('lookup', function ($event, $hostname) { $this->resolver->resolve($hostname)->then(function ($ip) { $this->emitter->emit('ip', $ip); $this->emitter->emit('sse', ['type' => 'dns', 'payload' => $ip]); }); }); }
private function tryToMatchPickRandomAnswerOfType(Resolver $resolver, Record $expectedAnswer, Message $message, $type) { foreach (range(1, 100) as $try) { $answer = $resolver->pickRandomAnswerOfType($message, $type); if ($expectedAnswer === $answer) { return true; } } return false; }
/** * @test */ public function resolveWithNoAnswersShouldCallErrbackIfGiven() { $executor = $this->createExecutorMock(); $executor->expects($this->once())->method('query')->with($this->anything(), $this->isInstanceOf('React\\Dns\\Query\\Query'))->will($this->returnCallback(function ($nameserver, $query) { $response = new Message(); $response->header->set('qr', 1); $response->questions[] = new Record($query->name, $query->type, $query->class); return Promise\resolve($response); })); $errback = $this->expectCallableOnceWith($this->isInstanceOf('React\\Dns\\RecordNotFoundException')); $resolver = new Resolver('8.8.8.8:53', $executor); $resolver->resolve('igor.io')->then($this->expectCallableNever(), $errback); }
private function resolve($host) { // return if it's already an IP or we want to resolve remotely (socks 4 only supports resolving locally) if (false !== filter_var($host, FILTER_VALIDATE_IP) || $this->protocolVersion !== '4' && !$this->resolveLocal) { return When::resolve($host); } return $this->resolver->resolve($host); }
/** * @param int $numSeeds * @return \React\Promise\Promise|\React\Promise\PromiseInterface */ private function getPeerList($numSeeds = 1) { $peerList = new Deferred(); // Take $numSeeds $seedHosts = $this->seeds->getHosts(); shuffle($seedHosts); $seeds = array_slice($seedHosts, 0, min($numSeeds, count($seedHosts))); // Connect to $numSeeds peers /** @var Peer[] $vNetAddr */ $vNetAddr = []; $c = 0; foreach ($seeds as $seed) { $this->dns->resolve($seed)->then(function ($ipList) use(&$vNetAddr, $peerList, &$numSeeds, &$c) { $vNetAddr = array_merge($vNetAddr, $ipList); if ($numSeeds === ++$c) { $peerList->resolve($vNetAddr); } }, function ($error) use($peerList) { $peerList->reject($error); }); } // Compile the list of lists of peers into $this->knownAddresses return $peerList->promise(); }