From df5d413091c6481259fbadda6afa5895c17d9988 Mon Sep 17 00:00:00 2001 From: Christian Weiske Date: Mon, 11 Jul 2016 07:52:54 +0200 Subject: [PATCH] Support IDNA - internationalized domain names --- src/phancap/Options.php | 60 +++++++++++++++++++++++++++++++++++++++++ www/index.php | 2 +- www/setup.php | 7 +++++ 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/phancap/Options.php b/src/phancap/Options.php index 47cf2d1..2cfec7e 100644 --- a/src/phancap/Options.php +++ b/src/phancap/Options.php @@ -116,6 +116,8 @@ class Options public $values = array(); /** + * Configuration object + * * @var Config */ protected $config; @@ -350,6 +352,33 @@ class Options if (!isset($parts['host'])) { throw new \InvalidArgumentException('URL host missing'); } + + $rebuild = false; + if (strlen(preg_replace('#[[:ascii:]]#', '', $parts['host']))) { + //non-ascii characters in the host name + $host = idn_to_ascii($parts['host']); + if ($host === false) { + //incoming URL was not UTF-8 but some ISO dialect + $host = idn_to_ascii(utf8_encode($parts['host'])); + if ($host === false) { + throw new \InvalidArgumentException( + 'Strange characters in host name' + ); + } + } + $parts['host'] = $host; + $rebuild = true; + } + if (strlen(preg_replace('#[[:ascii:]]#', '', $parts['path']))) { + //non-ascii characters in the path + $parts['path'] = str_replace('%2F', '/', urlencode($parts['path'])); + $rebuild = true; + } + + if ($rebuild) { + $url = static::http_build_url($parts); + } + return $url; } @@ -366,5 +395,36 @@ class Options $this->options['smaxage']['default'] = $this->config->screenshotMaxAge; $this->options['smaxage']['min'] = $this->config->screenshotMinAge; } + + /** + * Re-build an URL parts array generated by parse_url() + * + * @param string $parts Array of URL parts + * + * @return string URL + */ + protected static function http_build_url($parts) + { + $scheme = isset($parts['scheme']) + ? $parts['scheme'] . '://' : ''; + $host = isset($parts['host']) + ? $parts['host'] : ''; + $port = isset($parts['port']) + ? ':' . $parts['port'] : ''; + $user = isset($parts['user']) + ? $parts['user'] : ''; + $pass = isset($parts['pass']) + + ? ':' . $parts['pass'] : ''; + $pass = ($user || $pass) + ? "$pass@" : ''; + $path = isset($parts['path']) + ? $parts['path'] : ''; + $query = isset($parts['query']) + ? '?' . $parts['query'] : ''; + $fragment = isset($parts['fragment']) + ? '#' . $parts['fragment'] : ''; + return "$scheme$user$pass$host$port$path$query$fragment"; + } } ?> diff --git a/www/index.php b/www/index.php index 2f4c0de..7347517 100644 --- a/www/index.php +++ b/www/index.php @@ -34,7 +34,7 @@ try { phancap - + diff --git a/www/setup.php b/www/setup.php index 10f23fc..7772bad 100644 --- a/www/setup.php +++ b/www/setup.php @@ -82,11 +82,18 @@ foreach ($adapter as $classpart) { } } +if (!function_exists('idn_to_ascii')) { + $messages[][] = array( + 'err', 'Function "idn_to_ascii" is not available' + ); +} + $out = << phancap setup check + -- 2.30.2