X-Git-Url: https://git.cweiske.de/phancap.git/blobdiff_plain/12fc66e66288365731ad40bf2016633d0569bf81..df5d413091c6481259fbadda6afa5895c17d9988:/src/phancap/Options.php?ds=sidebyside diff --git a/src/phancap/Options.php b/src/phancap/Options.php index 061230c..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; @@ -144,15 +146,20 @@ class Options continue; } - if ($arOption['type'] == 'url') { + if ($arValues[$name] === '' + && !isset($arOption['required']) + ) { + //allow empty value; default value will be used + } else if ($arOption['type'] == 'url') { $this->values[$name] = $this->validateUrl($arValues[$name]); } else if ($arOption['type'] == 'int') { $this->values[$name] = $this->validateInt( - $arValues[$name], $arOption['min'], $arOption['max'] + $name, $arValues[$name], + $arOption['min'], $arOption['max'] ); } else if (gettype($arOption['type']) == 'array') { $this->values[$name] = $this->validateArray( - $arValues[$name], $arOption['type'] + $name, $arValues[$name], $arOption['type'] ); } else if ($arOption['type'] == 'age') { $this->values[$name] = $this->clamp( @@ -279,17 +286,18 @@ class Options /** * Check that a given value exists in an array * + * @param string $name Variable name * @param string $value Value to check * @param array $options Array of allowed values * * @return string Value * @throws \InvalidArgumentException If the value does not exist in $options */ - protected function validateArray($value, $options) + protected function validateArray($name, $value, $options) { if (array_search($value, $options) === false) { throw new \InvalidArgumentException( - 'Invalid value ' . $value . '.' + 'Invalid value ' . $value . ' for ' . $name . '.' . ' Allowed: ' . implode(', ', $options) ); } @@ -299,6 +307,7 @@ class Options /** * Validate that a value is numeric and between $min and $max (inclusive) * + * @param string $name Variable name * @param string $value Value to check * @param integer $min Minimum allowed value * @param integer $max Maximum allowed value @@ -306,11 +315,11 @@ class Options * @return integer Value as integer * @throws \InvalidArgumentException When outside range or not numeric */ - protected function validateInt($value, $min, $max) + protected function validateInt($name, $value, $min, $max) { if (!is_numeric($value)) { throw new \InvalidArgumentException( - 'Value must be a number' + $name . ' value must be a number' ); } $value = (int) $value; @@ -327,6 +336,9 @@ class Options */ protected function validateUrl($url) { + if ($url === '') { + throw new \InvalidArgumentException('URL is empty'); + } $parts = parse_url($url); if ($parts === false) { throw new \InvalidArgumentException('Invalid URL'); @@ -340,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; } @@ -356,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"; + } } ?>