1
0
mirror of https://github.com/danog/dns.git synced 2024-12-03 09:57:56 +01:00
dns/lib/Internal/UdpSocket.php
Aaron Piotrowski d26f9bb44f Remove amphp/file and amphp/uri dependencies (#80)
Replaces async loading of hosts and resolver files with blocking reads by default.

Closes #78.
2019-01-04 18:20:52 +01:00

62 lines
1.5 KiB
PHP

<?php
namespace Amp\Dns\Internal;
use Amp\Dns\DnsException;
use Amp\Promise;
use Amp\Success;
use LibDNS\Decoder\DecoderFactory;
use LibDNS\Encoder\EncoderFactory;
use LibDNS\Messages\Message;
use function Amp\call;
/** @internal */
class UdpSocket extends Socket {
/** @var \LibDNS\Encoder\Encoder */
private $encoder;
/** @var \LibDNS\Decoder\Decoder */
private $decoder;
public static function connect(string $uri): Promise {
if (!$socket = @\stream_socket_client($uri, $errno, $errstr, 0, STREAM_CLIENT_ASYNC_CONNECT)) {
throw new DnsException(\sprintf(
"Connection to %s failed: [Error #%d] %s",
$uri,
$errno,
$errstr
));
}
return new Success(new self($socket));
}
protected function __construct($socket) {
parent::__construct($socket);
$this->encoder = (new EncoderFactory)->create();
$this->decoder = (new DecoderFactory)->create();
}
protected function send(Message $message): Promise {
$data = $this->encoder->encode($message);
return $this->write($data);
}
protected function receive(): Promise {
return call(function () {
$data = yield $this->read();
if ($data === null) {
throw new DnsException("Reading from the server failed");
}
return $this->decoder->decode($data);
});
}
public function isAlive(): bool {
return true;
}
}