diff --git a/dns.inc.php b/dns.inc.php index a99adf3..ee98882 100644 --- a/dns.inc.php +++ b/dns.inc.php @@ -2,7 +2,7 @@ /* ------------------------------------------------------------- This file is the PurplePixie PHP DNS Query Classes -The software is (C) Copyright 2008-2016 PurplePixie Systems +The software is (C) Copyright 2008-2025 PurplePixie Systems This is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,3 +27,7 @@ require_once __DIR__ . '/src/PurplePixie/PhpDns/DNSQuery.php'; require_once __DIR__ . '/src/PurplePixie/PhpDns/DNSResult.php'; require_once __DIR__ . '/src/PurplePixie/PhpDns/DNSTypes.php'; + +require_once __DIR__ . '/src/PurplePixie/PhpDns/Exceptions/InvalidQueryTypeId.php'; +require_once __DIR__ . '/src/PurplePixie/PhpDns/Exceptions/InvalidQueryTypeName.php'; +require_once __DIR__ . '/src/PurplePixie/PhpDns/Exceptions/ConnectionFailure.php'; diff --git a/src/PurplePixie/PhpDns/DNSQuery.php b/src/PurplePixie/PhpDns/DNSQuery.php index c790d73..9f9297d 100644 --- a/src/PurplePixie/PhpDns/DNSQuery.php +++ b/src/PurplePixie/PhpDns/DNSQuery.php @@ -57,6 +57,8 @@ class DNSQuery private string $lasterror = ''; + private bool $connectionException = false; + public function __construct(string $server, int $port = 53, int $timeout = 60, bool $udp = true, bool $debug = false, bool $binarydebug = false) { $this->server = $server; @@ -357,7 +359,7 @@ private function readRecord(): array /** * @return DNSAnswer|false - * @throws Exceptions\InvalidQueryTypeName + * @throws Exceptions\InvalidQueryTypeName|Exceptions\ConnectionFailure */ public function query(string $question, string $typeName = DNSTypes::NAME_A) { @@ -374,8 +376,16 @@ public function query(string $question, string $typeName = DNSTypes::NAME_A) $errno = 0; $errstr = ''; - if (!$socket = fsockopen($host, $this->port, $errno, $errstr, $this->timeout)) { - $this->setError('Failed to Open Socket'); + if (!$socket = @fsockopen( + $host, + $this->port, + $errno, + $errstr, + $this->timeout)) + { + $this->setError('Failed to Open Socket (Code '.$errno.', Message: '.$errstr.')'); + if ($this->getConnectionException()) + throw new Exceptions\ConnectionFailure('Failed to Open Socket (Code '.$errno.', Message: '.$errstr.')");'); return false; } @@ -742,4 +752,14 @@ public function getLasterror(): string { return $this->lasterror; } + + public function getConnectionException(): bool + { + return $this->connectionException; + } + + public function setConnectionException(bool $value): void + { + $this->connectionException = $value; + } } diff --git a/src/PurplePixie/PhpDns/Exceptions/ConnectionFailure.php b/src/PurplePixie/PhpDns/Exceptions/ConnectionFailure.php new file mode 100644 index 0000000..e1ef40f --- /dev/null +++ b/src/PurplePixie/PhpDns/Exceptions/ConnectionFailure.php @@ -0,0 +1,29 @@ +query('google.com', 'invalid'); } + public function testConnectionExceptionTCP(): void + { + $query = new DNSQuery("127.0.0.1", 53, 60, false); + $query->setConnectionException(true); + $this->expectException(\PurplePixie\PhpDns\Exceptions\ConnectionFailure::class); + $query->query('google.com', DNSTypes::NAME_A); + } + public function testALookup() : void { $query = new DNSQuery("8.8.8.8");