Exemplo n.º 1
0
 private function doQuery($nameServer, $transport, $queryData, $name) : PromiseInterface
 {
     $response = new Message();
     $deferred = new Deferred();
     $retryWithTcp = function () use($nameServer, $queryData, $name) {
         return $this->doQuery($nameServer, 'tcp', $queryData, $name);
     };
     $connection = $this->createConnection($nameServer, $transport);
     $timer = $this->loop->addTimer($this->timeout, function () use($connection, $name, $deferred) {
         $connection->close();
         $deferred->reject(new TimeoutException($name));
     });
     $connection->on('data', function ($data) use($retryWithTcp, $connection, &$response, $transport, $deferred, $timer) {
         $responseReady = $this->parser->parseChunk($data, $response);
         if (!$responseReady) {
             return;
         }
         $timer->cancel();
         if ($response->header->isTruncated()) {
             if ('tcp' === $transport) {
                 $deferred->reject(new BadServerException('The server set the truncated bit although we issued a TCP request'));
             } else {
                 $connection->end();
                 $deferred->resolve($retryWithTcp());
             }
             return;
         }
         $connection->end();
         $deferred->resolve($response);
     });
     $connection->write($queryData);
     return $deferred->promise();
 }