1
0
mirror of https://github.com/danog/dns.git synced 2025-01-08 14:08:30 +01:00
dns/lib/functions.php

108 lines
2.6 KiB
PHP
Raw Normal View History

<?php
2015-07-28 03:53:44 +02:00
namespace Amp\Dns;
2016-08-24 06:14:10 +02:00
2017-06-15 22:06:50 +02:00
use Amp\Loop;
use Amp\Promise;
2016-08-02 23:57:40 +02:00
const LOOP_STATE_IDENTIFIER = Resolver::class;
2015-07-28 03:53:44 +02:00
/**
2017-06-17 10:49:54 +02:00
* Retrieve the application-wide dns resolver instance.
*
2016-08-02 23:57:40 +02:00
* @param \Amp\Dns\Resolver $resolver Optionally specify a new default dns resolver instance
*
* @return \Amp\Dns\Resolver Returns the application-wide dns resolver instance
*/
2019-01-25 02:27:47 +01:00
function resolver(Resolver $resolver = null): Resolver
{
2016-08-02 23:57:40 +02:00
if ($resolver === null) {
2016-08-12 17:51:40 +02:00
$resolver = Loop::getState(LOOP_STATE_IDENTIFIER);
2017-06-15 22:06:50 +02:00
2016-08-02 23:57:40 +02:00
if ($resolver) {
return $resolver;
}
$resolver = driver();
}
2017-06-15 22:06:50 +02:00
2016-08-12 17:51:40 +02:00
Loop::setState(LOOP_STATE_IDENTIFIER, $resolver);
2017-06-15 22:06:50 +02:00
2016-08-02 23:57:40 +02:00
return $resolver;
}
2017-06-15 22:06:50 +02:00
/**
2017-06-17 10:49:54 +02:00
* Create a new dns resolver best-suited for the current environment.
*
* @return \Amp\Dns\Resolver
*/
2019-01-25 02:27:47 +01:00
function driver(): Resolver
{
2017-06-23 13:14:51 +02:00
return new BasicResolver;
}
2015-08-02 04:18:44 +02:00
/**
* @see Resolver::resolve()
2015-08-02 04:18:44 +02:00
*/
2019-01-25 02:27:47 +01:00
function resolve(string $name, int $typeRestriction = null): Promise
{
return resolver()->resolve($name, $typeRestriction);
}
2017-06-15 22:06:50 +02:00
2015-09-18 15:09:28 +02:00
/**
* @see Resolver::query()
2015-09-18 15:09:28 +02:00
*/
2019-01-25 02:27:47 +01:00
function query(string $name, int $type): Promise
{
2017-06-23 01:02:07 +02:00
return resolver()->query($name, $type);
2017-01-25 16:36:19 +01:00
}
/**
* Checks whether a string is a valid DNS name.
*
* @param string $name String to check.
*
* @return bool
*/
2019-01-25 02:27:47 +01:00
function isValidName(string $name)
{
try {
normalizeName($name);
return true;
} catch (InvalidNameException $e) {
return false;
}
}
/**
* Normalizes a DNS name and automatically checks it for validity.
*
* @param string $name DNS name.
*
* @return string Normalized DNS name.
* @throws InvalidNameException If an invalid name or an IDN name without ext/intl being installed has been passed.
*/
2019-01-25 02:27:47 +01:00
function normalizeName(string $name): string
{
static $pattern = '/^(?<name>[a-z0-9]([a-z0-9-_]{0,61}[a-z0-9])?)(\.(?&name))*$/i';
if (\function_exists('idn_to_ascii') && \defined('INTL_IDNA_VARIANT_UTS46')) {
if (false === $result = \idn_to_ascii($name, 0, \INTL_IDNA_VARIANT_UTS46)) {
throw new InvalidNameException("Name '{$name}' could not be processed for IDN.");
}
$name = $result;
} elseif (\preg_match('/[\x80-\xff]/', $name)) {
throw new InvalidNameException(
"Name '{$name}' contains non-ASCII characters and IDN support is not available. " .
"Verify that ext/intl is installed for IDN support and that ICU is at least version 4.6."
);
}
if (isset($name[253]) || !\preg_match($pattern, $name)) {
throw new InvalidNameException("Name '{$name}' is not a valid hostname.");
}
return $name;
}