1
0
mirror of https://github.com/danog/dns.git synced 2024-11-26 20:14:51 +01:00

Add normalizeName

This commit is contained in:
Niklas Keller 2017-06-15 22:06:50 +02:00
parent 08ada39e3b
commit f06b5fd810

View File

@ -2,7 +2,8 @@
namespace Amp\Dns;
use Amp\{ Loop, Promise };
use Amp\Loop;
use Amp\Promise;
const LOOP_STATE_IDENTIFIER = Resolver::class;
@ -15,15 +16,19 @@ const LOOP_STATE_IDENTIFIER = Resolver::class;
function resolver(Resolver $resolver = null): Resolver {
if ($resolver === null) {
$resolver = Loop::getState(LOOP_STATE_IDENTIFIER);
if ($resolver) {
return $resolver;
}
$resolver = driver();
}
Loop::setState(LOOP_STATE_IDENTIFIER, $resolver);
return $resolver;
}
/**
* Create a new dns resolver best-suited for the current environment
*
@ -67,6 +72,7 @@ function driver(): Resolver {
function resolve(string $name, array $options = []): Promise {
return resolver()->resolve($name, $options);
}
/**
* Query specific DNS records.
*
@ -78,3 +84,33 @@ function resolve(string $name, array $options = []): Promise {
function query(string $name, $type, array $options = []): Promise {
return resolver()->query($name, $type, $options);
}
if (\function_exists('idn_to_ascii')) {
/**
* Normalizes a DNS name.
*
* @param string $label DNS name.
*
* @return string Normalized DNS name.
*
* @throws \Error If an invalid name or an IDN name without ext/intl being installed has been passed.
*/
function normalizeName(string $label): string {
if (false === $result = \idn_to_ascii($label, 0, INTL_IDNA_VARIANT_UTS46)) {
throw new \Error("Label '{$label}' could not be processed for IDN");
}
return $result;
}
} else {
function normalizeName(string $label): string {
if (\preg_match('/[\x80-\xff]/', $label)) {
throw new \Error(
"Label '{$label}' contains non-ASCII characters and IDN support is not available."
. " Verify that ext/intl is installed for IDN support."
);
}
return \strtolower($label);
}
}