Ejemplo n.º 1
0
 public static function getCurrent()
 {
     $url = new Url();
     $url->setScheme(!empty($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'off') ? 'https' : 'http');
     $url->setUser(isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : null);
     $url->setPassword(isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : null);
     if ((isset($_SERVER[$hostname = 'HTTP_HOST']) || isset($_SERVER[$hostname = 'SERVER_NAME'])) && preg_match('#^([a-z0-9_.-]+|\\[[a-f0-9:]+\\])(:\\d+)?\\z#i', $_SERVER[$hostname], $pair)) {
         $url->setHost(strtolower($pair[1]));
         if (isset($pair[2])) {
             $url->setPort(substr($pair[2], 1));
         } else {
             if (isset($_SERVER['SERVER_PORT'])) {
                 $url->setPort($_SERVER['SERVER_PORT']);
             }
         }
     }
     $requestUrl = StringUtils::replace(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/', ['~[.,)]\\z~' => '']);
     $tmp = explode('?', $requestUrl, 2);
     $path = Url::unescape($tmp[0], '%/?#');
     $url->setPath($path);
     $url->setQuery(isset($tmp[1]) ? $tmp[1] : null);
     $lpath = strtolower($path);
     $script = isset($_SERVER['SCRIPT_NAME']) ? strtolower($_SERVER['SCRIPT_NAME']) : null;
     if ($lpath !== $script) {
         $max = min(strlen($lpath), strlen($script));
         for ($i = 0; $i < $max && $lpath[$i] === $script[$i]; $i++) {
             /** no-op */
         }
         $path = $i ? substr($path, 0, strrpos($path, '/', $i - strlen($path) - 1) + 1) : '/';
     }
     $url->setScriptPath($path);
     $query = $url->getQueryParameters();
     $blacklist = '\\x09\\x0A\\x0D\\x20-\\x7E\\xA0-\\x{10FFFF}';
     $chars = '~^[' . $blacklist . ']*+\\z~u';
     $list = [&$query];
     while (list($key, $source) = each($list)) {
         foreach ($source as $k => $v) {
             if (is_string($k) && (!preg_match($chars, $k) || preg_last_error())) {
                 unset($list[$key][$k]);
             } else {
                 if (is_array($v)) {
                     $list[$key][$k] = $v;
                     $list[] =& $list[$key][$k];
                 } else {
                     $list[$key][$k] = (string) preg_replace('~[^' . $blacklist . ']+~u', '', $v);
                 }
             }
         }
     }
     unset($list, $key, $source, $k, $v);
     $url->setQuery($query);
     return $url;
 }