Beispiel #1
0
 /**
  * @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);
 }
Beispiel #2
0
 /**
  * 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;
     });
 }
Beispiel #3
0
 /** @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);
 }
Beispiel #7
0
 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);
 }
Beispiel #8
0
 /**
  * @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();
 }