primo commit
This commit is contained in:
66
libraries/vendor/algo26-matthias/idna-convert/src/ToIdn.php
vendored
Normal file
66
libraries/vendor/algo26-matthias/idna-convert/src/ToIdn.php
vendored
Normal file
@ -0,0 +1,66 @@
|
||||
<?php
|
||||
namespace Algo26\IdnaConvert;
|
||||
|
||||
use Algo26\IdnaConvert\Exception\InvalidCharacterException;
|
||||
use Algo26\IdnaConvert\Exception\InvalidIdnVersionException;
|
||||
use Algo26\IdnaConvert\Punycode\ToPunycode;
|
||||
use Algo26\IdnaConvert\TranscodeUnicode\TranscodeUnicode;
|
||||
|
||||
class ToIdn extends AbstractIdnaConvert implements IdnaConvertInterface
|
||||
{
|
||||
/** @var TranscodeUnicode */
|
||||
private $unicodeTransCoder;
|
||||
|
||||
/** @var ToPunycode */
|
||||
private $punycodeEncoder;
|
||||
|
||||
/**
|
||||
* @throws InvalidIdnVersionException
|
||||
*/
|
||||
public function __construct($idnVersion = null)
|
||||
{
|
||||
$this->unicodeTransCoder = new TranscodeUnicode();
|
||||
$this->punycodeEncoder = new ToPunycode($idnVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $host
|
||||
*
|
||||
* @return string
|
||||
* @throws InvalidCharacterException
|
||||
* @throws Exception\AlreadyPunycodeException
|
||||
*/
|
||||
public function convert(string $host): string
|
||||
{
|
||||
if (strlen($host) === 0) {
|
||||
return $host;
|
||||
}
|
||||
|
||||
if (strpos('/', $host) !== false
|
||||
|| strpos(':', $host) !== false
|
||||
|| strpos('?', $host) !== false
|
||||
|| strpos('@', $host) !== false
|
||||
) {
|
||||
throw new InvalidCharacterException('Neither email addresses nor URLs are allowed', 205);
|
||||
}
|
||||
|
||||
// These three punctuation characters are treated like the dot
|
||||
$host = str_replace(['。', '.', '。'], '.', $host);
|
||||
|
||||
// Operate per label
|
||||
$hostLabels = explode('.', $host);
|
||||
foreach ($hostLabels as $index => $label) {
|
||||
$asUcs4Array = $this->unicodeTransCoder->convert(
|
||||
$label,
|
||||
$this->unicodeTransCoder::FORMAT_UTF8,
|
||||
$this->unicodeTransCoder::FORMAT_UCS4_ARRAY
|
||||
);
|
||||
$encoded = $this->punycodeEncoder->convert($asUcs4Array);
|
||||
if ($encoded) {
|
||||
$hostLabels[$index] = $encoded;
|
||||
}
|
||||
}
|
||||
|
||||
return implode('.', $hostLabels);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user