| 
<?php
 /**
 * This file is part of the PHP Generics package.
 *
 * @package Generics
 */
 namespace Generics\Util;
 
 use Generics\Socket\InvalidUrlException;
 use Generics\Socket\Url;
 
 /**
 * This class provides a parser to retrieve Url objects out of arbitrary URIs
 *
 * @author Maik Greubel <[email protected]>
 */
 class UrlParser
 {
 
 /**
 * Parse a URI into a Url
 *
 * @param string $url
 * @throws InvalidUrlException
 * @return \Generics\Socket\Url
 */
 public static function parseUrl($url): Url
 {
 $parts = parse_url($url);
 
 if (false === $parts || false === Arrays::hasElement($parts, 'host') || false === Arrays::hasElement($parts, 'scheme')) {
 throw new InvalidUrlException('The URL {url} does not contain necessary parts', array('url' => $url));
 }
 
 $address = $parts['host'];
 $scheme = $parts['scheme'];
 $query = (isset($parts['query']) ? $parts['query'] : '');
 $port = 0;
 $path = "/";
 
 if (isset($parts['port'])) {
 $port = intval($parts['port']);
 }
 
 if ($port == 0) {
 $port = self::getPortByScheme($scheme);
 }
 
 if (isset($parts['path'])) {
 $path = $parts['path'];
 }
 
 return new Url($address, $port, $path, $scheme, $query);
 }
 
 /**
 * Get port number by scheme name.
 * The port will be the default which is defined by
 * http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
 *
 * @param string $scheme
 *            The scheme.
 * @throws InvalidUrlException
 * @return int
 */
 public static function getPortByScheme($scheme): int
 {
 switch ($scheme) {
 case 'http':
 return 80;
 
 case 'https':
 return 443;
 
 case 'ftp':
 return 21;
 
 default:
 throw new InvalidUrlException("Scheme {scheme} is not handled!", array(
 'scheme' => $scheme
 ));
 }
 }
 }
 
 |