Файловый менеджер - Редактировать - /home/avadvi5/calendar.aeronextgen.com/Query.zip
Ðазад
PK ���\��k�c c CancellationException.phpnu �[��� <?php namespace React\Dns\Query; final class CancellationException extends \RuntimeException { } PK ���\E��8`! `! UdpTransportExecutor.phpnu �[��� <?php namespace React\Dns\Query; use React\Dns\Model\Message; use React\Dns\Protocol\BinaryDumper; use React\Dns\Protocol\Parser; use React\EventLoop\Loop; use React\EventLoop\LoopInterface; use React\Promise\Deferred; /** * Send DNS queries over a UDP transport. * * This is the main class that sends a DNS query to your DNS server and is used * internally by the `Resolver` for the actual message transport. * * For more advanced usages one can utilize this class directly. * The following example looks up the `IPv6` address for `igor.io`. * * ```php * $executor = new UdpTransportExecutor('8.8.8.8:53'); * * $executor->query( * new Query($name, Message::TYPE_AAAA, Message::CLASS_IN) * )->then(function (Message $message) { * foreach ($message->answers as $answer) { * echo 'IPv6: ' . $answer->data . PHP_EOL; * } * }, 'printf'); * ``` * * See also the [fourth example](examples). * * Note that this executor does not implement a timeout, so you will very likely * want to use this in combination with a `TimeoutExecutor` like this: * * ```php * $executor = new TimeoutExecutor( * new UdpTransportExecutor($nameserver), * 3.0 * ); * ``` * * Also note that this executor uses an unreliable UDP transport and that it * does not implement any retry logic, so you will likely want to use this in * combination with a `RetryExecutor` like this: * * ```php * $executor = new RetryExecutor( * new TimeoutExecutor( * new UdpTransportExecutor($nameserver), * 3.0 * ) * ); * ``` * * Note that this executor is entirely async and as such allows you to execute * any number of queries concurrently. You should probably limit the number of * concurrent queries in your application or you're very likely going to face * rate limitations and bans on the resolver end. For many common applications, * you may want to avoid sending the same query multiple times when the first * one is still pending, so you will likely want to use this in combination with * a `CoopExecutor` like this: * * ```php * $executor = new CoopExecutor( * new RetryExecutor( * new TimeoutExecutor( * new UdpTransportExecutor($nameserver), * 3.0 * ) * ) * ); * ``` * * > Internally, this class uses PHP's UDP sockets and does not take advantage * of [react/datagram](https://github.com/reactphp/datagram) purely for * organizational reasons to avoid a cyclic dependency between the two * packages. Higher-level components should take advantage of the Datagram * component instead of reimplementing this socket logic from scratch. */ final class UdpTransportExecutor implements ExecutorInterface { private $nameserver; private $loop; private $parser; private $dumper; /** * maximum UDP packet size to send and receive * * @var int */ private $maxPacketSize = 512; /** * @param string $nameserver * @param ?LoopInterface $loop */ public function __construct($nameserver, $loop = null) { if (\strpos($nameserver, '[') === false && \substr_count($nameserver, ':') >= 2 && \strpos($nameserver, '://') === false) { // several colons, but not enclosed in square brackets => enclose IPv6 address in square brackets $nameserver = '[' . $nameserver . ']'; } $parts = \parse_url((\strpos($nameserver, '://') === false ? 'udp://' : '') . $nameserver); if (!isset($parts['scheme'], $parts['host']) || $parts['scheme'] !== 'udp' || @\inet_pton(\trim($parts['host'], '[]')) === false) { throw new \InvalidArgumentException('Invalid nameserver address given'); } if ($loop !== null && !$loop instanceof LoopInterface) { // manual type check to support legacy PHP < 7.1 throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface'); } $this->nameserver = 'udp://' . $parts['host'] . ':' . (isset($parts['port']) ? $parts['port'] : 53); $this->loop = $loop ?: Loop::get(); $this->parser = new Parser(); $this->dumper = new BinaryDumper(); } public function query(Query $query) { $request = Message::createRequestForQuery($query); $queryData = $this->dumper->toBinary($request); if (isset($queryData[$this->maxPacketSize])) { return \React\Promise\reject(new \RuntimeException( 'DNS query for ' . $query->describe() . ' failed: Query too large for UDP transport', \defined('SOCKET_EMSGSIZE') ? \SOCKET_EMSGSIZE : 90 )); } // UDP connections are instant, so try connection without a loop or timeout $errno = 0; $errstr = ''; $socket = @\stream_socket_client($this->nameserver, $errno, $errstr, 0); if ($socket === false) { return \React\Promise\reject(new \RuntimeException( 'DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno )); } // set socket to non-blocking and immediately try to send (fill write buffer) \stream_set_blocking($socket, false); \set_error_handler(function ($_, $error) use (&$errno, &$errstr) { // Write may potentially fail, but most common errors are already caught by connection check above. // Among others, macOS is known to report here when trying to send to broadcast address. // This can also be reproduced by writing data exceeding `stream_set_chunk_size()` to a server refusing UDP data. // fwrite(): send of 8192 bytes failed with errno=111 Connection refused \preg_match('/errno=(\d+) (.+)/', $error, $m); $errno = isset($m[1]) ? (int) $m[1] : 0; $errstr = isset($m[2]) ? $m[2] : $error; }); $written = \fwrite($socket, $queryData); \restore_error_handler(); if ($written !== \strlen($queryData)) { return \React\Promise\reject(new \RuntimeException( 'DNS query for ' . $query->describe() . ' failed: Unable to send query to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno )); } $loop = $this->loop; $deferred = new Deferred(function () use ($loop, $socket, $query) { // cancellation should remove socket from loop and close socket $loop->removeReadStream($socket); \fclose($socket); throw new CancellationException('DNS query for ' . $query->describe() . ' has been cancelled'); }); $max = $this->maxPacketSize; $parser = $this->parser; $nameserver = $this->nameserver; $loop->addReadStream($socket, function ($socket) use ($loop, $deferred, $query, $parser, $request, $max, $nameserver) { // try to read a single data packet from the DNS server // ignoring any errors, this is uses UDP packets and not a stream of data $data = @\fread($socket, $max); if ($data === false) { return; } try { $response = $parser->parseMessage($data); } catch (\Exception $e) { // ignore and await next if we received an invalid message from remote server // this may as well be a fake response from an attacker (possible DOS) return; } // ignore and await next if we received an unexpected response ID // this may as well be a fake response from an attacker (possible cache poisoning) if ($response->id !== $request->id) { return; } // we only react to the first valid message, so remove socket from loop and close $loop->removeReadStream($socket); \fclose($socket); if ($response->tc) { $deferred->reject(new \RuntimeException( 'DNS query for ' . $query->describe() . ' failed: The DNS server ' . $nameserver . ' returned a truncated result for a UDP query', \defined('SOCKET_EMSGSIZE') ? \SOCKET_EMSGSIZE : 90 )); return; } $deferred->resolve($response); }); return $deferred->promise(); } } PK ���\��'��6 �6 TcpTransportExecutor.phpnu �[��� <?php namespace React\Dns\Query; use React\Dns\Model\Message; use React\Dns\Protocol\BinaryDumper; use React\Dns\Protocol\Parser; use React\EventLoop\Loop; use React\EventLoop\LoopInterface; use React\Promise\Deferred; /** * Send DNS queries over a TCP/IP stream transport. * * This is one of the main classes that send a DNS query to your DNS server. * * For more advanced usages one can utilize this class directly. * The following example looks up the `IPv6` address for `reactphp.org`. * * ```php * $executor = new TcpTransportExecutor('8.8.8.8:53'); * * $executor->query( * new Query($name, Message::TYPE_AAAA, Message::CLASS_IN) * )->then(function (Message $message) { * foreach ($message->answers as $answer) { * echo 'IPv6: ' . $answer->data . PHP_EOL; * } * }, 'printf'); * ``` * * See also [example #92](examples). * * Note that this executor does not implement a timeout, so you will very likely * want to use this in combination with a `TimeoutExecutor` like this: * * ```php * $executor = new TimeoutExecutor( * new TcpTransportExecutor($nameserver), * 3.0 * ); * ``` * * Unlike the `UdpTransportExecutor`, this class uses a reliable TCP/IP * transport, so you do not necessarily have to implement any retry logic. * * Note that this executor is entirely async and as such allows you to execute * queries concurrently. The first query will establish a TCP/IP socket * connection to the DNS server which will be kept open for a short period. * Additional queries will automatically reuse this existing socket connection * to the DNS server, will pipeline multiple requests over this single * connection and will keep an idle connection open for a short period. The * initial TCP/IP connection overhead may incur a slight delay if you only send * occasional queries – when sending a larger number of concurrent queries over * an existing connection, it becomes increasingly more efficient and avoids * creating many concurrent sockets like the UDP-based executor. You may still * want to limit the number of (concurrent) queries in your application or you * may be facing rate limitations and bans on the resolver end. For many common * applications, you may want to avoid sending the same query multiple times * when the first one is still pending, so you will likely want to use this in * combination with a `CoopExecutor` like this: * * ```php * $executor = new CoopExecutor( * new TimeoutExecutor( * new TcpTransportExecutor($nameserver), * 3.0 * ) * ); * ``` * * > Internally, this class uses PHP's TCP/IP sockets and does not take advantage * of [react/socket](https://github.com/reactphp/socket) purely for * organizational reasons to avoid a cyclic dependency between the two * packages. Higher-level components should take advantage of the Socket * component instead of reimplementing this socket logic from scratch. */ class TcpTransportExecutor implements ExecutorInterface { private $nameserver; private $loop; private $parser; private $dumper; /** * @var ?resource */ private $socket; /** * @var Deferred[] */ private $pending = array(); /** * @var string[] */ private $names = array(); /** * Maximum idle time when socket is current unused (i.e. no pending queries outstanding) * * If a new query is to be sent during the idle period, we can reuse the * existing socket without having to wait for a new socket connection. * This uses a rather small, hard-coded value to not keep any unneeded * sockets open and to not keep the loop busy longer than needed. * * A future implementation may take advantage of `edns-tcp-keepalive` to keep * the socket open for longer periods. This will likely require explicit * configuration because this may consume additional resources and also keep * the loop busy for longer than expected in some applications. * * @var float * @link https://tools.ietf.org/html/rfc7766#section-6.2.1 * @link https://tools.ietf.org/html/rfc7828 */ private $idlePeriod = 0.001; /** * @var ?\React\EventLoop\TimerInterface */ private $idleTimer; private $writeBuffer = ''; private $writePending = false; private $readBuffer = ''; private $readPending = false; /** @var string */ private $readChunk = 0xffff; /** * @param string $nameserver * @param ?LoopInterface $loop */ public function __construct($nameserver, $loop = null) { if (\strpos($nameserver, '[') === false && \substr_count($nameserver, ':') >= 2 && \strpos($nameserver, '://') === false) { // several colons, but not enclosed in square brackets => enclose IPv6 address in square brackets $nameserver = '[' . $nameserver . ']'; } $parts = \parse_url((\strpos($nameserver, '://') === false ? 'tcp://' : '') . $nameserver); if (!isset($parts['scheme'], $parts['host']) || $parts['scheme'] !== 'tcp' || @\inet_pton(\trim($parts['host'], '[]')) === false) { throw new \InvalidArgumentException('Invalid nameserver address given'); } if ($loop !== null && !$loop instanceof LoopInterface) { // manual type check to support legacy PHP < 7.1 throw new \InvalidArgumentException('Argument #2 ($loop) expected null|React\EventLoop\LoopInterface'); } $this->nameserver = 'tcp://' . $parts['host'] . ':' . (isset($parts['port']) ? $parts['port'] : 53); $this->loop = $loop ?: Loop::get(); $this->parser = new Parser(); $this->dumper = new BinaryDumper(); } public function query(Query $query) { $request = Message::createRequestForQuery($query); // keep shuffing message ID to avoid using the same message ID for two pending queries at the same time while (isset($this->pending[$request->id])) { $request->id = \mt_rand(0, 0xffff); // @codeCoverageIgnore } $queryData = $this->dumper->toBinary($request); $length = \strlen($queryData); if ($length > 0xffff) { return \React\Promise\reject(new \RuntimeException( 'DNS query for ' . $query->describe() . ' failed: Query too large for TCP transport' )); } $queryData = \pack('n', $length) . $queryData; if ($this->socket === null) { // create async TCP/IP connection (may take a while) $socket = @\stream_socket_client($this->nameserver, $errno, $errstr, 0, \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT); if ($socket === false) { return \React\Promise\reject(new \RuntimeException( 'DNS query for ' . $query->describe() . ' failed: Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno )); } // set socket to non-blocking and wait for it to become writable (connection success/rejected) \stream_set_blocking($socket, false); if (\function_exists('stream_set_chunk_size')) { \stream_set_chunk_size($socket, $this->readChunk); // @codeCoverageIgnore } $this->socket = $socket; } if ($this->idleTimer !== null) { $this->loop->cancelTimer($this->idleTimer); $this->idleTimer = null; } // wait for socket to become writable to actually write out data $this->writeBuffer .= $queryData; if (!$this->writePending) { $this->writePending = true; $this->loop->addWriteStream($this->socket, array($this, 'handleWritable')); } $names =& $this->names; $that = $this; $deferred = new Deferred(function () use ($that, &$names, $request) { // remove from list of pending names, but remember pending query $name = $names[$request->id]; unset($names[$request->id]); $that->checkIdle(); throw new CancellationException('DNS query for ' . $name . ' has been cancelled'); }); $this->pending[$request->id] = $deferred; $this->names[$request->id] = $query->describe(); return $deferred->promise(); } /** * @internal */ public function handleWritable() { if ($this->readPending === false) { $name = @\stream_socket_get_name($this->socket, true); if ($name === false) { // Connection failed? Check socket error if available for underlying errno/errstr. // @codeCoverageIgnoreStart if (\function_exists('socket_import_stream')) { $socket = \socket_import_stream($this->socket); $errno = \socket_get_option($socket, \SOL_SOCKET, \SO_ERROR); $errstr = \socket_strerror($errno); } else { $errno = \defined('SOCKET_ECONNREFUSED') ? \SOCKET_ECONNREFUSED : 111; $errstr = 'Connection refused'; } // @codeCoverageIgnoreEnd $this->closeError('Unable to connect to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno); return; } $this->readPending = true; $this->loop->addReadStream($this->socket, array($this, 'handleRead')); } $errno = 0; $errstr = ''; \set_error_handler(function ($_, $error) use (&$errno, &$errstr) { // Match errstr from PHP's warning message. // fwrite(): Send of 327712 bytes failed with errno=32 Broken pipe \preg_match('/errno=(\d+) (.+)/', $error, $m); $errno = isset($m[1]) ? (int) $m[1] : 0; $errstr = isset($m[2]) ? $m[2] : $error; }); $written = \fwrite($this->socket, $this->writeBuffer); \restore_error_handler(); if ($written === false || $written === 0) { $this->closeError( 'Unable to send query to DNS server ' . $this->nameserver . ' (' . $errstr . ')', $errno ); return; } if (isset($this->writeBuffer[$written])) { $this->writeBuffer = \substr($this->writeBuffer, $written); } else { $this->loop->removeWriteStream($this->socket); $this->writePending = false; $this->writeBuffer = ''; } } /** * @internal */ public function handleRead() { // read one chunk of data from the DNS server // any error is fatal, this is a stream of TCP/IP data $chunk = @\fread($this->socket, $this->readChunk); if ($chunk === false || $chunk === '') { $this->closeError('Connection to DNS server ' . $this->nameserver . ' lost'); return; } // reassemble complete message by concatenating all chunks. $this->readBuffer .= $chunk; // response message header contains at least 12 bytes while (isset($this->readBuffer[11])) { // read response message length from first 2 bytes and ensure we have length + data in buffer list(, $length) = \unpack('n', $this->readBuffer); if (!isset($this->readBuffer[$length + 1])) { return; } $data = \substr($this->readBuffer, 2, $length); $this->readBuffer = (string)substr($this->readBuffer, $length + 2); try { $response = $this->parser->parseMessage($data); } catch (\Exception $e) { // reject all pending queries if we received an invalid message from remote server $this->closeError('Invalid message received from DNS server ' . $this->nameserver); return; } // reject all pending queries if we received an unexpected response ID or truncated response if (!isset($this->pending[$response->id]) || $response->tc) { $this->closeError('Invalid response message received from DNS server ' . $this->nameserver); return; } $deferred = $this->pending[$response->id]; unset($this->pending[$response->id], $this->names[$response->id]); $deferred->resolve($response); $this->checkIdle(); } } /** * @internal * @param string $reason * @param int $code */ public function closeError($reason, $code = 0) { $this->readBuffer = ''; if ($this->readPending) { $this->loop->removeReadStream($this->socket); $this->readPending = false; } $this->writeBuffer = ''; if ($this->writePending) { $this->loop->removeWriteStream($this->socket); $this->writePending = false; } if ($this->idleTimer !== null) { $this->loop->cancelTimer($this->idleTimer); $this->idleTimer = null; } @\fclose($this->socket); $this->socket = null; foreach ($this->names as $id => $name) { $this->pending[$id]->reject(new \RuntimeException( 'DNS query for ' . $name . ' failed: ' . $reason, $code )); } $this->pending = $this->names = array(); } /** * @internal */ public function checkIdle() { if ($this->idleTimer === null && !$this->names) { $that = $this; $this->idleTimer = $this->loop->addTimer($this->idlePeriod, function () use ($that) { $that->closeError('Idle timeout'); }); } } } PK ���\B^{5h h CoopExecutor.phpnu �[��� <?php namespace React\Dns\Query; use React\Promise\Promise; /** * Cooperatively resolves hosts via the given base executor to ensure same query is not run concurrently * * Wraps an existing `ExecutorInterface` to keep tracking of pending queries * and only starts a new query when the same query is not already pending. Once * the underlying query is fulfilled/rejected, it will forward its value to all * promises awaiting the same query. * * This means it will not limit concurrency for queries that differ, for example * when sending many queries for different host names or types. * * This is useful because all executors are entirely async and as such allow you * to execute any number of queries concurrently. You should probably limit the * number of concurrent queries in your application or you're very likely going * to face rate limitations and bans on the resolver end. For many common * applications, you may want to avoid sending the same query multiple times * when the first one is still pending, so you will likely want to use this in * combination with some other executor like this: * * ```php * $executor = new CoopExecutor( * new RetryExecutor( * new TimeoutExecutor( * new UdpTransportExecutor($nameserver), * 3.0 * ) * ) * ); * ``` */ final class CoopExecutor implements ExecutorInterface { private $executor; private $pending = array(); private $counts = array(); public function __construct(ExecutorInterface $base) { $this->executor = $base; } public function query(Query $query) { $key = $this->serializeQueryToIdentity($query); if (isset($this->pending[$key])) { // same query is already pending, so use shared reference to pending query $promise = $this->pending[$key]; ++$this->counts[$key]; } else { // no such query pending, so start new query and keep reference until it's fulfilled or rejected $promise = $this->executor->query($query); $this->pending[$key] = $promise; $this->counts[$key] = 1; $pending =& $this->pending; $counts =& $this->counts; $promise->then(function () use ($key, &$pending, &$counts) { unset($pending[$key], $counts[$key]); }, function () use ($key, &$pending, &$counts) { unset($pending[$key], $counts[$key]); }); } // Return a child promise awaiting the pending query. // Cancelling this child promise should only cancel the pending query // when no other child promise is awaiting the same query. $pending =& $this->pending; $counts =& $this->counts; return new Promise(function ($resolve, $reject) use ($promise) { $promise->then($resolve, $reject); }, function () use (&$promise, $key, $query, &$pending, &$counts) { if (--$counts[$key] < 1) { unset($pending[$key], $counts[$key]); $promise->cancel(); $promise = null; } throw new \RuntimeException('DNS query for ' . $query->describe() . ' has been cancelled'); }); } private function serializeQueryToIdentity(Query $query) { return sprintf('%s:%s:%s', $query->name, $query->type, $query->class); } } PK ���\�qj��W �W error_lognu �[��� [13-Apr-2025 18:17:05 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php on line 9 [13-Apr-2025 19:16:56 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php:78 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php on line 78 [13-Apr-2025 20:15:08 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php:83 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php on line 83 [13-Apr-2025 20:49:00 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php on line 9 [13-Apr-2025 21:18:36 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php:8 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php on line 8 [13-Apr-2025 22:18:33 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php:37 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php on line 37 [13-Apr-2025 23:46:05 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php:7 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php on line 7 [14-Apr-2025 03:42:29 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php:17 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php on line 17 [14-Apr-2025 04:58:19 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php:53 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php on line 53 [21-Apr-2025 20:55:57 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php:17 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php on line 17 [21-Apr-2025 21:29:04 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php:78 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php on line 78 [21-Apr-2025 22:28:50 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php on line 9 [21-Apr-2025 23:27:50 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php on line 9 [22-Apr-2025 00:58:58 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php:7 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php on line 7 [22-Apr-2025 03:46:23 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php:53 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php on line 53 [22-Apr-2025 06:00:44 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php:83 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php on line 83 [22-Apr-2025 07:06:41 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php:8 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php on line 8 [22-Apr-2025 11:57:55 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php:37 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php on line 37 [24-Apr-2025 19:10:46 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php:53 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php on line 53 [24-Apr-2025 20:50:14 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php on line 9 [24-Apr-2025 22:31:11 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php:8 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php on line 8 [25-Apr-2025 00:05:39 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php:78 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php on line 78 [25-Apr-2025 01:44:46 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php:7 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php on line 7 [25-Apr-2025 03:48:02 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php:37 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php on line 37 [25-Apr-2025 04:19:17 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php:17 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php on line 17 [25-Apr-2025 04:35:15 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php:83 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php on line 83 [25-Apr-2025 06:18:51 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php on line 9 [30-Apr-2025 07:33:10 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php:78 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php on line 78 [30-Apr-2025 07:39:35 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php:37 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php on line 37 [30-Apr-2025 08:59:38 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php:8 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php on line 8 [30-Apr-2025 09:00:58 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php on line 9 [30-Apr-2025 09:04:39 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php on line 9 [30-Apr-2025 09:06:14 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php:83 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php on line 83 [30-Apr-2025 09:47:46 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php:8 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php on line 8 [30-Apr-2025 10:09:19 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php:78 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php on line 78 [30-Apr-2025 10:13:00 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php:17 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php on line 17 [30-Apr-2025 11:43:44 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php:7 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php on line 7 [30-Apr-2025 11:45:29 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php:53 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php on line 53 [30-Apr-2025 12:21:24 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php on line 9 [30-Apr-2025 13:09:18 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php:17 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php on line 17 [30-Apr-2025 13:16:36 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php:37 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php on line 37 [30-Apr-2025 16:28:16 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php:7 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php on line 7 [30-Apr-2025 18:41:57 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php:83 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php on line 83 [30-Apr-2025 19:53:14 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php on line 9 [30-Apr-2025 20:03:27 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php:53 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php on line 53 [13-May-2025 05:20:34 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php:17 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php on line 17 [13-May-2025 06:10:53 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php:8 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php on line 8 [13-May-2025 06:11:26 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php:37 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php on line 37 [13-May-2025 06:15:47 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php on line 9 [13-May-2025 06:18:29 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php:83 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php on line 83 [13-May-2025 06:19:14 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php:7 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php on line 7 [13-May-2025 06:21:46 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php:53 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php on line 53 [13-May-2025 06:28:33 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php:78 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php on line 78 [13-May-2025 06:46:04 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php on line 9 [14-May-2025 00:31:11 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php:53 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/SelectiveTransportExecutor.php on line 53 [14-May-2025 00:53:15 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php:83 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/UdpTransportExecutor.php on line 83 [14-May-2025 00:54:29 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php:7 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/FallbackExecutor.php on line 7 [14-May-2025 01:00:10 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php:37 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CoopExecutor.php on line 37 [14-May-2025 01:11:00 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php:8 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/RetryExecutor.php on line 8 [14-May-2025 01:23:02 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php:78 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TcpTransportExecutor.php on line 78 [14-May-2025 01:24:16 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php:17 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/HostsFileExecutor.php on line 17 [14-May-2025 01:38:02 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/TimeoutExecutor.php on line 9 [14-May-2025 01:38:13 UTC] PHP Fatal error: Uncaught Error: Interface "React\Dns\Query\ExecutorInterface" not found in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php:9 Stack trace: #0 {main} thrown in /home/avadvi5/calendar.aeronextgen.com/davis/vendor/react/dns/src/Query/CachingExecutor.php on line 9 PK ���\��\� � RetryExecutor.phpnu �[��� <?php namespace React\Dns\Query; use React\Promise\Deferred; use React\Promise\PromiseInterface; final class RetryExecutor implements ExecutorInterface { private $executor; private $retries; public function __construct(ExecutorInterface $executor, $retries = 2) { $this->executor = $executor; $this->retries = $retries; } public function query(Query $query) { return $this->tryQuery($query, $this->retries); } public function tryQuery(Query $query, $retries) { $deferred = new Deferred(function () use (&$promise) { if ($promise instanceof PromiseInterface && \method_exists($promise, 'cancel')) { $promise->cancel(); } }); $success = function ($value) use ($deferred, &$errorback) { $errorback = null; $deferred->resolve($value); }; $executor = $this->executor; $errorback = function ($e) use ($deferred, &$promise, $query, $success, &$errorback, &$retries, $executor) { if (!$e instanceof TimeoutException) { $errorback = null; $deferred->reject($e); } elseif ($retries <= 0) { $errorback = null; $deferred->reject($e = new \RuntimeException( 'DNS query for ' . $query->describe() . ' failed: too many retries', 0, $e )); // avoid garbage references by replacing all closures in call stack. // what a lovely piece of code! $r = new \ReflectionProperty('Exception', 'trace'); $r->setAccessible(true); $trace = $r->getValue($e); // Exception trace arguments are not available on some PHP 7.4 installs // @codeCoverageIgnoreStart foreach ($trace as $ti => $one) { if (isset($one['args'])) { foreach ($one['args'] as $ai => $arg) { if ($arg instanceof \Closure) { $trace[$ti]['args'][$ai] = 'Object(' . \get_class($arg) . ')'; } } } } // @codeCoverageIgnoreEnd $r->setValue($e, $trace); } else { --$retries; $promise = $executor->query($query)->then( $success, $errorback ); } }; $promise = $this->executor->query($query)->then( $success, $errorback ); return $deferred->promise(); } } PK ���\�۾�� � ExecutorInterface.phpnu �[��� <?php namespace React\Dns\Query; interface ExecutorInterface { /** * Executes a query and will return a response message * * It returns a Promise which either fulfills with a response * `React\Dns\Model\Message` on success or rejects with an `Exception` if * the query is not successful. A response message may indicate an error * condition in its `rcode`, but this is considered a valid response message. * * ```php * $executor->query($query)->then( * function (React\Dns\Model\Message $response) { * // response message successfully received * var_dump($response->rcode, $response->answers); * }, * function (Exception $error) { * // failed to query due to $error * } * ); * ``` * * The returned Promise MUST be implemented in such a way that it can be * cancelled when it is still pending. Cancelling a pending promise MUST * reject its value with an Exception. It SHOULD clean up any underlying * resources and references as applicable. * * ```php * $promise = $executor->query($query); * * $promise->cancel(); * ``` * * @param Query $query * @return \React\Promise\PromiseInterface<\React\Dns\Model\Message> * resolves with response message on success or rejects with an Exception on error */ public function query(Query $query); } PK ���\\(�1 1 SelectiveTransportExecutor.phpnu �[��� <?php namespace React\Dns\Query; use React\Promise\Promise; /** * Send DNS queries over a UDP or TCP/IP stream transport. * * This class will automatically choose the correct transport protocol to send * a DNS query to your DNS server. It will always try to send it over the more * efficient UDP transport first. If this query yields a size related issue * (truncated messages), it will retry over a streaming TCP/IP transport. * * For more advanced usages one can utilize this class directly. * The following example looks up the `IPv6` address for `reactphp.org`. * * ```php * $executor = new SelectiveTransportExecutor($udpExecutor, $tcpExecutor); * * $executor->query( * new Query($name, Message::TYPE_AAAA, Message::CLASS_IN) * )->then(function (Message $message) { * foreach ($message->answers as $answer) { * echo 'IPv6: ' . $answer->data . PHP_EOL; * } * }, 'printf'); * ``` * * Note that this executor only implements the logic to select the correct * transport for the given DNS query. Implementing the correct transport logic, * implementing timeouts and any retry logic is left up to the given executors, * see also [`UdpTransportExecutor`](#udptransportexecutor) and * [`TcpTransportExecutor`](#tcptransportexecutor) for more details. * * Note that this executor is entirely async and as such allows you to execute * any number of queries concurrently. You should probably limit the number of * concurrent queries in your application or you're very likely going to face * rate limitations and bans on the resolver end. For many common applications, * you may want to avoid sending the same query multiple times when the first * one is still pending, so you will likely want to use this in combination with * a `CoopExecutor` like this: * * ```php * $executor = new CoopExecutor( * new SelectiveTransportExecutor( * $datagramExecutor, * $streamExecutor * ) * ); * ``` */ class SelectiveTransportExecutor implements ExecutorInterface { private $datagramExecutor; private $streamExecutor; public function __construct(ExecutorInterface $datagramExecutor, ExecutorInterface $streamExecutor) { $this->datagramExecutor = $datagramExecutor; $this->streamExecutor = $streamExecutor; } public function query(Query $query) { $stream = $this->streamExecutor; $pending = $this->datagramExecutor->query($query); return new Promise(function ($resolve, $reject) use (&$pending, $stream, $query) { $pending->then( $resolve, function ($e) use (&$pending, $stream, $query, $resolve, $reject) { if ($e->getCode() === (\defined('SOCKET_EMSGSIZE') ? \SOCKET_EMSGSIZE : 90)) { $pending = $stream->query($query)->then($resolve, $reject); } else { $reject($e); } } ); }, function () use (&$pending) { $pending->cancel(); $pending = null; }); } } PK ���\L�N�� � FallbackExecutor.phpnu �[��� <?php namespace React\Dns\Query; use React\Promise\Promise; final class FallbackExecutor implements ExecutorInterface { private $executor; private $fallback; public function __construct(ExecutorInterface $executor, ExecutorInterface $fallback) { $this->executor = $executor; $this->fallback = $fallback; } public function query(Query $query) { $cancelled = false; $fallback = $this->fallback; $promise = $this->executor->query($query); return new Promise(function ($resolve, $reject) use (&$promise, $fallback, $query, &$cancelled) { $promise->then($resolve, function (\Exception $e1) use ($fallback, $query, $resolve, $reject, &$cancelled, &$promise) { // reject if primary resolution rejected due to cancellation if ($cancelled) { $reject($e1); return; } // start fallback query if primary query rejected $promise = $fallback->query($query)->then($resolve, function (\Exception $e2) use ($e1, $reject) { $append = $e2->getMessage(); if (($pos = strpos($append, ':')) !== false) { $append = substr($append, $pos + 2); } // reject with combined error message if both queries fail $reject(new \RuntimeException($e1->getMessage() . '. ' . $append)); }); }); }, function () use (&$promise, &$cancelled) { // cancel pending query (primary or fallback) $cancelled = true; $promise->cancel(); }); } } PK ���\a���� � TimeoutExecutor.phpnu �[��� <?php namespace React\Dns\Query; use React\EventLoop\Loop; use React\EventLoop\LoopInterface; use React\Promise\Promise; final class TimeoutExecutor implements ExecutorInterface { private $executor; private $loop; private $timeout; /** * @param ExecutorInterface $executor * @param float $timeout * @param ?LoopInterface $loop */ public function __construct(ExecutorInterface $executor, $timeout, $loop = null) { if ($loop !== null && !$loop instanceof LoopInterface) { // manual type check to support legacy PHP < 7.1 throw new \InvalidArgumentException('Argument #3 ($loop) expected null|React\EventLoop\LoopInterface'); } $this->executor = $executor; $this->loop = $loop ?: Loop::get(); $this->timeout = $timeout; } public function query(Query $query) { $promise = $this->executor->query($query); $loop = $this->loop; $time = $this->timeout; return new Promise(function ($resolve, $reject) use ($loop, $time, $promise, $query) { $timer = null; $promise = $promise->then(function ($v) use (&$timer, $loop, $resolve) { if ($timer) { $loop->cancelTimer($timer); } $timer = false; $resolve($v); }, function ($v) use (&$timer, $loop, $reject) { if ($timer) { $loop->cancelTimer($timer); } $timer = false; $reject($v); }); // promise already resolved => no need to start timer if ($timer === false) { return; } // start timeout timer which will cancel the pending promise $timer = $loop->addTimer($time, function () use ($time, &$promise, $reject, $query) { $reject(new TimeoutException( 'DNS query for ' . $query->describe() . ' timed out' )); // Cancel pending query to clean up any underlying resources and references. // Avoid garbage references in call stack by passing pending promise by reference. assert(\method_exists($promise, 'cancel')); $promise->cancel(); $promise = null; }); }, function () use (&$promise) { // Cancelling this promise will cancel the pending query, thus triggering the rejection logic above. // Avoid garbage references in call stack by passing pending promise by reference. assert(\method_exists($promise, 'cancel')); $promise->cancel(); $promise = null; }); } } PK ���\̞Dܰ � CachingExecutor.phpnu �[��� <?php namespace React\Dns\Query; use React\Cache\CacheInterface; use React\Dns\Model\Message; use React\Promise\Promise; final class CachingExecutor implements ExecutorInterface { /** * Default TTL for negative responses (NXDOMAIN etc.). * * @internal */ const TTL = 60; private $executor; private $cache; public function __construct(ExecutorInterface $executor, CacheInterface $cache) { $this->executor = $executor; $this->cache = $cache; } public function query(Query $query) { $id = $query->name . ':' . $query->type . ':' . $query->class; $cache = $this->cache; $that = $this; $executor = $this->executor; $pending = $cache->get($id); return new Promise(function ($resolve, $reject) use ($query, $id, $cache, $executor, &$pending, $that) { $pending->then( function ($message) use ($query, $id, $cache, $executor, &$pending, $that) { // return cached response message on cache hit if ($message !== null) { return $message; } // perform DNS lookup if not already cached return $pending = $executor->query($query)->then( function (Message $message) use ($cache, $id, $that) { // DNS response message received => store in cache when not truncated and return if (!$message->tc) { $cache->set($id, $message, $that->ttl($message)); } return $message; } ); } )->then($resolve, function ($e) use ($reject, &$pending) { $reject($e); $pending = null; }); }, function ($_, $reject) use (&$pending, $query) { $reject(new \RuntimeException('DNS query for ' . $query->describe() . ' has been cancelled')); $pending->cancel(); $pending = null; }); } /** * @param Message $message * @return int * @internal */ public function ttl(Message $message) { // select TTL from answers (should all be the same), use smallest value if available // @link https://tools.ietf.org/html/rfc2181#section-5.2 $ttl = null; foreach ($message->answers as $answer) { if ($ttl === null || $answer->ttl < $ttl) { $ttl = $answer->ttl; } } if ($ttl === null) { $ttl = self::TTL; } return $ttl; } } PK ���\�7Ѓ� � HostsFileExecutor.phpnu �[��� <?php namespace React\Dns\Query; use React\Dns\Config\HostsFile; use React\Dns\Model\Message; use React\Dns\Model\Record; use React\Promise; /** * Resolves hosts from the given HostsFile or falls back to another executor * * If the host is found in the hosts file, it will not be passed to the actual * DNS executor. If the host is not found in the hosts file, it will be passed * to the DNS executor as a fallback. */ final class HostsFileExecutor implements ExecutorInterface { private $hosts; private $fallback; public function __construct(HostsFile $hosts, ExecutorInterface $fallback) { $this->hosts = $hosts; $this->fallback = $fallback; } public function query(Query $query) { if ($query->class === Message::CLASS_IN && ($query->type === Message::TYPE_A || $query->type === Message::TYPE_AAAA)) { // forward lookup for type A or AAAA $records = array(); $expectsColon = $query->type === Message::TYPE_AAAA; foreach ($this->hosts->getIpsForHost($query->name) as $ip) { // ensure this is an IPv4/IPV6 address according to query type if ((strpos($ip, ':') !== false) === $expectsColon) { $records[] = new Record($query->name, $query->type, $query->class, 0, $ip); } } if ($records) { return Promise\resolve( Message::createResponseWithAnswersForQuery($query, $records) ); } } elseif ($query->class === Message::CLASS_IN && $query->type === Message::TYPE_PTR) { // reverse lookup: extract IPv4 or IPv6 from special `.arpa` domain $ip = $this->getIpFromHost($query->name); if ($ip !== null) { $records = array(); foreach ($this->hosts->getHostsForIp($ip) as $host) { $records[] = new Record($query->name, $query->type, $query->class, 0, $host); } if ($records) { return Promise\resolve( Message::createResponseWithAnswersForQuery($query, $records) ); } } } return $this->fallback->query($query); } private function getIpFromHost($host) { if (substr($host, -13) === '.in-addr.arpa') { // IPv4: read as IP and reverse bytes $ip = @inet_pton(substr($host, 0, -13)); if ($ip === false || isset($ip[4])) { return null; } return inet_ntop(strrev($ip)); } elseif (substr($host, -9) === '.ip6.arpa') { // IPv6: replace dots, reverse nibbles and interpret as hexadecimal string $ip = @inet_ntop(pack('H*', strrev(str_replace('.', '', substr($host, 0, -9))))); if ($ip === false) { return null; } return $ip; } else { return null; } } } PK ���\8��W W TimeoutException.phpnu �[��� <?php namespace React\Dns\Query; final class TimeoutException extends \Exception { } PK ���\����� � Query.phpnu �[��� <?php namespace React\Dns\Query; use React\Dns\Model\Message; /** * This class represents a single question in a query/response message * * It uses a structure similar to `\React\Dns\Message\Record`, but does not * contain fields for resulting TTL and resulting record data (IPs etc.). * * @link https://tools.ietf.org/html/rfc1035#section-4.1.2 * @see \React\Dns\Message\Record */ final class Query { /** * @var string query name, i.e. hostname to look up */ public $name; /** * @var int query type (aka QTYPE), see Message::TYPE_* constants */ public $type; /** * @var int query class (aka QCLASS), see Message::CLASS_IN constant */ public $class; /** * @param string $name query name, i.e. hostname to look up * @param int $type query type, see Message::TYPE_* constants * @param int $class query class, see Message::CLASS_IN constant */ public function __construct($name, $type, $class) { $this->name = $name; $this->type = $type; $this->class = $class; } /** * Describes the hostname and query type/class for this query * * The output format is supposed to be human readable and is subject to change. * The format is inspired by RFC 3597 when handling unkown types/classes. * * @return string "example.com (A)" or "example.com (CLASS0 TYPE1234)" * @link https://tools.ietf.org/html/rfc3597 */ public function describe() { $class = $this->class !== Message::CLASS_IN ? 'CLASS' . $this->class . ' ' : ''; $type = 'TYPE' . $this->type; $ref = new \ReflectionClass('React\Dns\Model\Message'); foreach ($ref->getConstants() as $name => $value) { if ($value === $this->type && \strpos($name, 'TYPE_') === 0) { $type = \substr($name, 5); break; } } return $this->name . ' (' . $class . $type . ')'; } } PK ���\��k�c c CancellationException.phpnu �[��� PK ���\E��8`! `! � UdpTransportExecutor.phpnu �[��� PK ���\��'��6 �6 T"