68 lines
2.1 KiB
PHP
68 lines
2.1 KiB
PHP
<?php
|
|
namespace GuzzleHttp;
|
|
|
|
use GuzzleHttp\Exception\InvalidArgumentException;
|
|
use Psr\Http\Message\UriInterface;
|
|
|
|
final class Utils
|
|
{
|
|
/**
|
|
* Wrapper for the hrtime() or microtime() functions
|
|
* (depending on the PHP version, one of the two is used)
|
|
*
|
|
* @return float|mixed UNIX timestamp
|
|
*
|
|
* @internal
|
|
*/
|
|
public static function currentTime()
|
|
{
|
|
return function_exists('hrtime') ? hrtime(true) / 1e9 : microtime(true);
|
|
}
|
|
|
|
/**
|
|
* @param int $options
|
|
*
|
|
* @return UriInterface
|
|
* @throws InvalidArgumentException
|
|
*
|
|
* @internal
|
|
*/
|
|
public static function idnUriConvert(UriInterface $uri, $options = 0)
|
|
{
|
|
if ($uri->getHost()) {
|
|
$idnaVariant = defined('INTL_IDNA_VARIANT_UTS46') ? INTL_IDNA_VARIANT_UTS46 : 0;
|
|
$asciiHost = $idnaVariant === 0
|
|
? idn_to_ascii($uri->getHost(), $options)
|
|
: idn_to_ascii($uri->getHost(), $options, $idnaVariant, $info);
|
|
if ($asciiHost === false) {
|
|
$errorBitSet = isset($info['errors']) ? $info['errors'] : 0;
|
|
|
|
$errorConstants = array_filter(array_keys(get_defined_constants()), function ($name) {
|
|
return substr($name, 0, 11) === 'IDNA_ERROR_';
|
|
});
|
|
|
|
$errors = [];
|
|
foreach ($errorConstants as $errorConstant) {
|
|
if ($errorBitSet & constant($errorConstant)) {
|
|
$errors[] = $errorConstant;
|
|
}
|
|
}
|
|
|
|
$errorMessage = 'IDN conversion failed';
|
|
if ($errors) {
|
|
$errorMessage .= ' (errors: ' . implode(', ', $errors) . ')';
|
|
}
|
|
|
|
throw new InvalidArgumentException($errorMessage);
|
|
} else {
|
|
if ($uri->getHost() !== $asciiHost) {
|
|
// Replace URI only if the ASCII version is different
|
|
$uri = $uri->withHost($asciiHost);
|
|
}
|
|
}
|
|
}
|
|
|
|
return $uri;
|
|
}
|
|
}
|