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(); }