mirror of https://github.com/YGGverse/net-php.git
yggverse
9 months ago
2 changed files with 216 additions and 0 deletions
@ -0,0 +1,185 @@
@@ -0,0 +1,185 @@
|
||||
<?php |
||||
|
||||
declare(strict_types=1); |
||||
|
||||
namespace Yggverse\Net; |
||||
|
||||
class Resolve |
||||
{ |
||||
private array $_providers = |
||||
[ |
||||
'1.1.1.1', |
||||
'8.8.8.8' |
||||
]; |
||||
|
||||
private array $_records = |
||||
[ |
||||
'A', |
||||
'AAAA' |
||||
]; |
||||
|
||||
private int $_timeout = 5; |
||||
|
||||
private bool $_shuffle = false; |
||||
|
||||
public function __construct( |
||||
?array $records = null, |
||||
?array $providers = null, |
||||
?int $timeout = null, |
||||
bool $shuffle = false |
||||
) { |
||||
if ($records) |
||||
{ |
||||
$this->setRecords( |
||||
$records |
||||
); |
||||
} |
||||
|
||||
if ($providers) |
||||
{ |
||||
$this->setProviders( |
||||
$providers |
||||
); |
||||
} |
||||
|
||||
if ($timeout) |
||||
{ |
||||
$this->setTimeout( |
||||
$timeout |
||||
); |
||||
} |
||||
|
||||
$this->setShuffle( |
||||
$shuffle |
||||
); |
||||
} |
||||
|
||||
public function getRecords(): array |
||||
{ |
||||
return $this->_records; |
||||
} |
||||
|
||||
public function setRecords(array $records): void |
||||
{ |
||||
foreach ($records as $record) |
||||
{ |
||||
$this->addRecord( |
||||
$record |
||||
); |
||||
} |
||||
} |
||||
|
||||
public function addRecord(string $record): void |
||||
{ |
||||
$this->_records[] = $record; |
||||
|
||||
$this->_records = array_unique( |
||||
$this->_records |
||||
); |
||||
} |
||||
|
||||
public function getProviders(): array |
||||
{ |
||||
return $this->_providers; |
||||
} |
||||
|
||||
public function setProviders(array $providers): void |
||||
{ |
||||
foreach ($providers as $provider) |
||||
{ |
||||
$this->addProvider( |
||||
$provider |
||||
); |
||||
} |
||||
} |
||||
|
||||
public function addProvider(string $provider): void |
||||
{ |
||||
$this->_providers[] = $provider; |
||||
|
||||
$this->_providers = array_unique( |
||||
$this->_providers |
||||
); |
||||
} |
||||
|
||||
public function setTimeout( |
||||
int $timeout |
||||
): void |
||||
{ |
||||
$this->_timeout = $timeout; |
||||
} |
||||
|
||||
public function getTimeout(): int |
||||
{ |
||||
return $this->_timeout; |
||||
} |
||||
|
||||
public function setShuffle( |
||||
bool $shuffle |
||||
): void |
||||
{ |
||||
$this->_shuffle = $shuffle; |
||||
} |
||||
|
||||
public function isShuffle(): bool |
||||
{ |
||||
return $this->_shuffle; |
||||
} |
||||
|
||||
public function address( |
||||
string $url, |
||||
array &$result = [], |
||||
array &$error = [] |
||||
): ?\Yggverse\Net\Address |
||||
{ |
||||
$address = new \Yggverse\Net\Address( |
||||
$url |
||||
); |
||||
|
||||
foreach ($this->_providers as $provider) |
||||
{ |
||||
foreach ( |
||||
\Yggverse\Net\Dig::records( |
||||
$address->getHost(), |
||||
$this->_records, |
||||
$result, |
||||
$error, |
||||
$provider, |
||||
$this->_timeout |
||||
) as $record => $data |
||||
) { |
||||
|
||||
if ($this->_shuffle) |
||||
{ |
||||
shuffle( |
||||
$data |
||||
); |
||||
} |
||||
|
||||
foreach ($data as $host) |
||||
{ |
||||
if (false !== filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) |
||||
{ |
||||
$resolved->setHost( |
||||
sprintf( |
||||
'[%s]', |
||||
$host |
||||
) |
||||
); |
||||
} |
||||
|
||||
else |
||||
{ |
||||
$address->setHost( |
||||
$host |
||||
); |
||||
} |
||||
|
||||
return $address; |
||||
} |
||||
} |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
} |
Loading…
Reference in new issue