X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=application%2FUrl.php;h=77447c8df96635c17f55a90cb463a1313c35170a;hb=6275a65969a84a360588e0a62b025963e9ec98e0;hp=a4ac2e73cad2537ab28cd6bb604356bd311d14d7;hpb=92ba7b573f2833bd35c7eb2fc7fdbeb1a0ac7b44;p=github%2Fshaarli%2FShaarli.git diff --git a/application/Url.php b/application/Url.php old mode 100755 new mode 100644 index a4ac2e73..77447c8d --- a/application/Url.php +++ b/application/Url.php @@ -62,7 +62,21 @@ function add_trailing_slash($url) { return $url . (!endsWith($url, '/') ? '/' : ''); } +/** + * Converts an URL with an IDN host to a ASCII one. + * + * @param string $url Input URL. + * + * @return string converted URL. + */ +function url_with_idn_to_ascii($url) +{ + $parts = parse_url($url); + $parts['host'] = idn_to_ascii($parts['host']); + $httpUrl = new \http\Url($parts); + return $httpUrl->toString(); +} /** * URL representation and cleanup utilities * @@ -118,13 +132,43 @@ class Url */ public function __construct($url) { - $this->parts = parse_url(trim($url)); + $url = self::cleanupUnparsedUrl(trim($url)); + $this->parts = parse_url($url); if (!empty($url) && empty($this->parts['scheme'])) { $this->parts['scheme'] = 'http'; } } + /** + * Clean up URL before it's parsed. + * ie. handle urlencode, url prefixes, etc. + * + * @param string $url URL to clean. + * + * @return string cleaned URL. + */ + protected static function cleanupUnparsedUrl($url) + { + return self::removeFirefoxAboutReader($url); + } + + /** + * Remove Firefox Reader prefix if it's present. + * + * @param string $input url + * + * @return string cleaned url + */ + protected static function removeFirefoxAboutReader($input) + { + $firefoxPrefix = 'about://reader?url='; + if (startsWith($input, $firefoxPrefix)) { + return urldecode(ltrim($input, $firefoxPrefix)); + } + return $input; + } + /** * Returns a string representation of this URL */ @@ -190,6 +234,22 @@ class Url return $this->toString(); } + /** + * Converts an URL with an International Domain Name host to a ASCII one. + * This requires PHP-intl. If it's not available, just returns this->cleanup(). + * + * @return string converted cleaned up URL. + */ + public function idnToAscii() + { + $out = $this->cleanup(); + if (! function_exists('idn_to_ascii') || ! isset($this->parts['host'])) { + return $out; + } + $asciiHost = idn_to_ascii($this->parts['host']); + return str_replace($this->parts['host'], $asciiHost, $out); + } + /** * Get URL scheme. * @@ -202,6 +262,18 @@ class Url return $this->parts['scheme']; } + /** + * Get URL host. + * + * @return string the URL host or false if none is provided. + */ + public function getHost() { + if (empty($this->parts['host'])) { + return false; + } + return $this->parts['host']; + } + /** * Test if the Url is an HTTP one. *