| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |  * Net_URL2, a class representing a URL as per RFC 3986. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENSE: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (c) 2007-2009, Peytz & Co. A/S | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |  * modification, are permitted provided that the following conditions | 
					
						
							|  |  |  |  * are met: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *   * Redistributions of source code must retain the above copyright | 
					
						
							|  |  |  |  *     notice, this list of conditions and the following disclaimer. | 
					
						
							|  |  |  |  *   * Redistributions in binary form must reproduce the above copyright | 
					
						
							|  |  |  |  *     notice, this list of conditions and the following disclaimer in | 
					
						
							|  |  |  |  *     the documentation and/or other materials provided with the distribution. | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |  *   * Neither the name of the Net_URL2 nor the names of its contributors may | 
					
						
							|  |  |  |  *     be used to endorse or promote products derived from this software | 
					
						
							|  |  |  |  *     without specific prior written permission. | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 | 
					
						
							|  |  |  |  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 | 
					
						
							|  |  |  |  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 
					
						
							|  |  |  |  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR | 
					
						
							|  |  |  |  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 
					
						
							|  |  |  |  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 
					
						
							|  |  |  |  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 
					
						
							|  |  |  |  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 
					
						
							|  |  |  |  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | 
					
						
							|  |  |  |  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 
					
						
							|  |  |  |  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  Networking | 
					
						
							|  |  |  |  * @package   Net_URL2 | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |  * @author    Christian Schmidt <schmidt@php.net> | 
					
						
							|  |  |  |  * @copyright 2007-2009 Peytz & Co. A/S | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |  * @license   https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause | 
					
						
							|  |  |  |  * @version   CVS: $Id$ | 
					
						
							|  |  |  |  * @link      https://tools.ietf.org/html/rfc3986 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Represents a URL as per RFC 3986. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  Networking | 
					
						
							|  |  |  |  * @package   Net_URL2 | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |  * @author    Christian Schmidt <schmidt@php.net> | 
					
						
							|  |  |  |  * @copyright 2007-2009 Peytz & Co. A/S | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |  * @license   https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause | 
					
						
							|  |  |  |  * @version   Release: 2.1.2 | 
					
						
							|  |  |  |  * @link      https://pear.php.net/package/Net_URL2 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | class Net_URL2 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Do strict parsing in resolve() (see RFC 3986, section 5.2.2). Default | 
					
						
							|  |  |  |      * is true. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     const OPTION_STRICT = 'strict'; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Represent arrays in query using PHP's [] notation. Default is true. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     const OPTION_USE_BRACKETS = 'use_brackets'; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Drop zero-based integer sequences in query using PHP's [] notation. Default | 
					
						
							|  |  |  |      * is true. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const OPTION_DROP_SEQUENCE = 'drop_sequence'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * URL-encode query variable keys. Default is true. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     const OPTION_ENCODE_KEYS = 'encode_keys'; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Query variable separators when parsing the query string. Every character | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * is considered a separator. Default is "&". | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     const OPTION_SEPARATOR_INPUT = 'input_separator'; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Query variable separator used when generating the query string. Default | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * is "&". | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     const OPTION_SEPARATOR_OUTPUT = 'output_separator'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Default options corresponds to how PHP handles $_GET. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     private $_options = array( | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         self::OPTION_STRICT           => true, | 
					
						
							|  |  |  |         self::OPTION_USE_BRACKETS     => true, | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         self::OPTION_DROP_SEQUENCE    => true, | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         self::OPTION_ENCODE_KEYS      => true, | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         self::OPTION_SEPARATOR_INPUT  => '&', | 
					
						
							|  |  |  |         self::OPTION_SEPARATOR_OUTPUT => '&', | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @var  string|bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     private $_scheme = false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @var  string|bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     private $_userinfo = false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @var  string|bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     private $_host = false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @var  string|bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     private $_port = false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @var  string | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     private $_path = ''; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @var  string|bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     private $_query = false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @var  string|bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     private $_fragment = false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * Constructor. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * @param string $url     an absolute or relative URL | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * @param array  $options an array of OPTION_xxx constants | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @uses   self::parseUrl() | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |     public function __construct($url, array $options = array()) | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         foreach ($options as $optionName => $value) { | 
					
						
							|  |  |  |             if (array_key_exists($optionName, $this->_options)) { | 
					
						
							|  |  |  |                 $this->_options[$optionName] = $value; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         $this->parseUrl($url); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Magic Setter. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * This method will magically set the value of a private variable ($var) | 
					
						
							|  |  |  |      * with the value passed as the args | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @param string $var The private variable to set. | 
					
						
							|  |  |  |      * @param mixed  $arg An argument of any type. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function __set($var, $arg) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $method = 'set' . $var; | 
					
						
							|  |  |  |         if (method_exists($this, $method)) { | 
					
						
							|  |  |  |             $this->$method($arg); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Magic Getter. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * This is the magic get method to retrieve the private variable | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * that was set by either __set() or it's setter... | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @param string $var The property name to retrieve. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return mixed  $this->$var Either a boolean false if the | 
					
						
							|  |  |  |      *                            property is not set or the value | 
					
						
							|  |  |  |      *                            of the private property. | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function __get($var) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $method = 'get' . $var; | 
					
						
							|  |  |  |         if (method_exists($this, $method)) { | 
					
						
							|  |  |  |             return $this->$method(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Returns the scheme, e.g. "http" or "urn", or false if there is no | 
					
						
							|  |  |  |      * scheme specified, i.e. if this is a relative URL. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @return string|bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function getScheme() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         return $this->_scheme; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * Sets the scheme, e.g. "http" or "urn". Specify false if there is no | 
					
						
							|  |  |  |      * scheme specified, i.e. if this is a relative URL. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string|bool $scheme e.g. "http" or "urn", or false if there is no | 
					
						
							|  |  |  |      *                            scheme specified, i.e. if this is a relative | 
					
						
							|  |  |  |      *                            URL | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @return $this | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @see    getScheme | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function setScheme($scheme) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         $this->_scheme = $scheme; | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         return $this; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns the user part of the userinfo part (the part preceding the first | 
					
						
							|  |  |  |      *  ":"), or false if there is no userinfo part. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @return string|bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function getUser() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         return $this->_userinfo !== false | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |             ? preg_replace('(:.*$)', '', $this->_userinfo) | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |             : false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns the password part of the userinfo part (the part after the first | 
					
						
							|  |  |  |      *  ":"), or false if there is no userinfo part (i.e. the URL does not | 
					
						
							|  |  |  |      * contain "@" in front of the hostname) or the userinfo part does not | 
					
						
							|  |  |  |      * contain ":". | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @return string|bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function getPassword() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         return $this->_userinfo !== false | 
					
						
							|  |  |  |             ? substr(strstr($this->_userinfo, ':'), 1) | 
					
						
							|  |  |  |             : false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns the userinfo part, or false if there is none, i.e. if the | 
					
						
							|  |  |  |      * authority part does not contain "@". | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @return string|bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function getUserinfo() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         return $this->_userinfo; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Sets the userinfo part. If two arguments are passed, they are combined | 
					
						
							|  |  |  |      * in the userinfo part as username ":" password. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string|bool $userinfo userinfo or username | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * @param string|bool $password optional password, or false | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @return $this | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function setUserinfo($userinfo, $password = false) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($password !== false) { | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |             $userinfo .= ':' . $password; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($userinfo !== false) { | 
					
						
							|  |  |  |             $userinfo = $this->_encodeData($userinfo); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->_userinfo = $userinfo; | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         return $this; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns the host part, or false if there is no authority part, e.g. | 
					
						
							|  |  |  |      * relative URLs. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @return string|bool a hostname, an IP address, or false | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function getHost() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         return $this->_host; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * Sets the host part. Specify false if there is no authority part, e.g. | 
					
						
							|  |  |  |      * relative URLs. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string|bool $host a hostname, an IP address, or false | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @return $this | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function setHost($host) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         $this->_host = $host; | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         return $this; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns the port number, or false if there is no port number specified, | 
					
						
							|  |  |  |      * i.e. if the default port is to be used. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @return string|bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function getPort() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         return $this->_port; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * Sets the port number. Specify false if there is no port number specified, | 
					
						
							|  |  |  |      * i.e. if the default port is to be used. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @param string|bool $port a port number, or false | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @return $this | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function setPort($port) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         $this->_port = $port; | 
					
						
							|  |  |  |         return $this; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns the authority part, i.e. [ userinfo "@" ] host [ ":" port ], or | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * false if there is no authority. | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return string|bool | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getAuthority() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         if (false === $this->_host) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $authority = ''; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         if (strlen($this->_userinfo)) { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |             $authority .= $this->_userinfo . '@'; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         $authority .= $this->_host; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         if ($this->_port !== false) { | 
					
						
							|  |  |  |             $authority .= ':' . $this->_port; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $authority; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * Sets the authority part, i.e. [ userinfo "@" ] host [ ":" port ]. Specify | 
					
						
							|  |  |  |      * false if there is no authority. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @param string|bool $authority a hostname or an IP address, possibly | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      *                                with userinfo prefixed and port number | 
					
						
							|  |  |  |      *                                appended, e.g. "foo:bar@example.org:81". | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @return $this | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function setAuthority($authority) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         $this->_userinfo = false; | 
					
						
							|  |  |  |         $this->_host     = false; | 
					
						
							|  |  |  |         $this->_port     = false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         if ('' === $authority) { | 
					
						
							|  |  |  |             $this->_host = $authority; | 
					
						
							|  |  |  |             return $this; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!preg_match('(^(([^@]*)@)?(.+?)(:(\d*))?$)', $authority, $matches)) { | 
					
						
							|  |  |  |             return $this; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($matches[1]) { | 
					
						
							|  |  |  |             $this->_userinfo = $this->_encodeData($matches[2]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->_host = $matches[3]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (isset($matches[5]) && strlen($matches[5])) { | 
					
						
							|  |  |  |             $this->_port = $matches[5]; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         return $this; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns the path part (possibly an empty string). | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getPath() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         return $this->_path; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * Sets the path part (possibly an empty string). | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $path a path | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @return $this | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function setPath($path) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         $this->_path = $path; | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         return $this; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns the query string (excluding the leading "?"), or false if "?" | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * is not present in the URL. | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return  string|bool | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @see     getQueryVariables | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function getQuery() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         return $this->_query; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * Sets the query string (excluding the leading "?"). Specify false if "?" | 
					
						
							|  |  |  |      * is not present in the URL. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string|bool $query a query string, e.g. "foo=1&bar=2" | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @return $this | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @see    setQueryVariables | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function setQuery($query) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         $this->_query = $query; | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         return $this; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * Returns the fragment name, or false if "#" is not present in the URL. | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @return string|bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function getFragment() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         return $this->_fragment; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * Sets the fragment name. Specify false if "#" is not present in the URL. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string|bool $fragment a fragment excluding the leading "#", or | 
					
						
							|  |  |  |      *                              false | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @return $this | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function setFragment($fragment) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         $this->_fragment = $fragment; | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         return $this; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns the query string like an array as the variables would appear in | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * $_GET in a PHP script. If the URL does not contain a "?", an empty array | 
					
						
							|  |  |  |      * is returned. | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @return array | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function getQueryVariables() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         $separator   = $this->getOption(self::OPTION_SEPARATOR_INPUT); | 
					
						
							|  |  |  |         $encodeKeys  = $this->getOption(self::OPTION_ENCODE_KEYS); | 
					
						
							|  |  |  |         $useBrackets = $this->getOption(self::OPTION_USE_BRACKETS); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         $return  = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         for ($part = strtok($this->_query, $separator); | 
					
						
							|  |  |  |             strlen($part); | 
					
						
							|  |  |  |             $part = strtok($separator) | 
					
						
							|  |  |  |         ) { | 
					
						
							|  |  |  |             list($key, $value) = explode('=', $part, 2) + array(1 => ''); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |             if ($encodeKeys) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 $key = rawurldecode($key); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $value = rawurldecode($value); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |             if ($useBrackets) { | 
					
						
							|  |  |  |                 $return = $this->_queryArrayByKey($key, $value, $return); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 if (isset($return[$key])) { | 
					
						
							|  |  |  |                     $return[$key]  = (array) $return[$key]; | 
					
						
							|  |  |  |                     $return[$key][] = $value; | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     $return[$key] = $value; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         return $return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Parse a single query key=value pair into an existing php array | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $key   query-key | 
					
						
							|  |  |  |      * @param string $value query-value | 
					
						
							|  |  |  |      * @param array  $array of existing query variables (if any) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function _queryArrayByKey($key, $value, array $array = array()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!strlen($key)) { | 
					
						
							|  |  |  |             return $array; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         $offset = $this->_queryKeyBracketOffset($key); | 
					
						
							|  |  |  |         if ($offset === false) { | 
					
						
							|  |  |  |             $name = $key; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $name = substr($key, 0, $offset); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!strlen($name)) { | 
					
						
							|  |  |  |             return $array; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$offset) { | 
					
						
							|  |  |  |             // named value
 | 
					
						
							|  |  |  |             $array[$name] = $value; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             // array
 | 
					
						
							|  |  |  |             $brackets = substr($key, $offset); | 
					
						
							|  |  |  |             if (!isset($array[$name])) { | 
					
						
							|  |  |  |                 $array[$name] = null; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $array[$name] = $this->_queryArrayByBrackets( | 
					
						
							|  |  |  |                 $brackets, $value, $array[$name] | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $array; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Parse a key-buffer to place value in array | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $buffer to consume all keys from | 
					
						
							|  |  |  |      * @param string $value  to be set/add | 
					
						
							|  |  |  |      * @param array  $array  to traverse and set/add value in | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @throws Exception | 
					
						
							|  |  |  |      * @return array | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function _queryArrayByBrackets($buffer, $value, array $array = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $entry = &$array; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for ($iteration = 0; strlen($buffer); $iteration++) { | 
					
						
							|  |  |  |             $open = $this->_queryKeyBracketOffset($buffer); | 
					
						
							|  |  |  |             if ($open !== 0) { | 
					
						
							|  |  |  |                 // Opening bracket [ must exist at offset 0, if not, there is
 | 
					
						
							|  |  |  |                 // no bracket to parse and the value dropped.
 | 
					
						
							|  |  |  |                 // if this happens in the first iteration, this is flawed, see
 | 
					
						
							|  |  |  |                 // as well the second exception below.
 | 
					
						
							|  |  |  |                 if ($iteration) { | 
					
						
							|  |  |  |                     break; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |                 // @codeCoverageIgnoreStart
 | 
					
						
							|  |  |  |                 throw new Exception( | 
					
						
							|  |  |  |                     'Net_URL2 Internal Error: '. __METHOD__ .'(): ' . | 
					
						
							|  |  |  |                     'Opening bracket [ must exist at offset 0' | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |                 // @codeCoverageIgnoreEnd
 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $close = strpos($buffer, ']', 1); | 
					
						
							|  |  |  |             if (!$close) { | 
					
						
							|  |  |  |                 // this error condition should never be reached as this is a
 | 
					
						
							|  |  |  |                 // private method and bracket pairs are checked beforehand.
 | 
					
						
							|  |  |  |                 // See as well the first exception for the opening bracket.
 | 
					
						
							|  |  |  |                 // @codeCoverageIgnoreStart
 | 
					
						
							|  |  |  |                 throw new Exception( | 
					
						
							|  |  |  |                     'Net_URL2 Internal Error: '. __METHOD__ .'(): ' . | 
					
						
							|  |  |  |                     'Closing bracket ] must exist, not found' | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |                 // @codeCoverageIgnoreEnd
 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $index = substr($buffer, 1, $close - 1); | 
					
						
							|  |  |  |             if (strlen($index)) { | 
					
						
							|  |  |  |                 $entry = &$entry[$index]; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |                 if (!is_array($entry)) { | 
					
						
							|  |  |  |                     $entry = array(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 $entry[] = &$new; | 
					
						
							|  |  |  |                 $entry = &$new; | 
					
						
							|  |  |  |                 unset($new); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |             $buffer = substr($buffer, $close + 1); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         $entry = $value; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $array; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Query-key has brackets ("...[]") | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $key query-key | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return bool|int offset of opening bracket, false if no brackets | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function _queryKeyBracketOffset($key) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (false !== $open = strpos($key, '[') | 
					
						
							|  |  |  |             and false === strpos($key, ']', $open + 1) | 
					
						
							|  |  |  |         ) { | 
					
						
							|  |  |  |             $open = false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $open; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * Sets the query string to the specified variable in the query string. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * @param array $array (name => value) array | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @return $this | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function setQueryVariables(array $array) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!$array) { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |             $this->_query = false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |             $this->_query = $this->buildQuery( | 
					
						
							|  |  |  |                 $array, | 
					
						
							|  |  |  |                 $this->getOption(self::OPTION_SEPARATOR_OUTPUT) | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         return $this; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * Sets the specified variable in the query string. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $name  variable name | 
					
						
							|  |  |  |      * @param mixed  $value variable value | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @return $this | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function setQueryVariable($name, $value) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $array = $this->getQueryVariables(); | 
					
						
							|  |  |  |         $array[$name] = $value; | 
					
						
							|  |  |  |         $this->setQueryVariables($array); | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         return $this; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * Removes the specified variable from the query string. | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param string $name a query string variable, e.g. "foo" in "?foo=1" | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function unsetQueryVariable($name) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $array = $this->getQueryVariables(); | 
					
						
							|  |  |  |         unset($array[$name]); | 
					
						
							|  |  |  |         $this->setQueryVariables($array); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns a string representation of this URL. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @return string | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function getURL() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // See RFC 3986, section 5.3
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         $url = ''; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         if ($this->_scheme !== false) { | 
					
						
							|  |  |  |             $url .= $this->_scheme . ':'; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $authority = $this->getAuthority(); | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         if ($authority === false && strtolower($this->_scheme) === 'file') { | 
					
						
							|  |  |  |             $authority = ''; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $url .= $this->_buildAuthorityAndPath($authority, $this->_path); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         if ($this->_query !== false) { | 
					
						
							|  |  |  |             $url .= '?' . $this->_query; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         if ($this->_fragment !== false) { | 
					
						
							|  |  |  |             $url .= '#' . $this->_fragment; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         return $url; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Put authority and path together, wrapping authority | 
					
						
							|  |  |  |      * into proper separators/terminators. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string|bool $authority authority | 
					
						
							|  |  |  |      * @param string      $path      path | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function _buildAuthorityAndPath($authority, $path) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($authority === false) { | 
					
						
							|  |  |  |             return $path; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $terminator = ($path !== '' && $path[0] !== '/') ? '/' : ''; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return '//' . $authority . $terminator . $path; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Returns a string representation of this URL. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @return string | 
					
						
							|  |  |  |      * @link https://php.net/language.oop5.magic#object.tostring
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function __toString() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->getURL(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * Returns a normalized string representation of this URL. This is useful | 
					
						
							|  |  |  |      * for comparison of URLs. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @return string | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function getNormalizedURL() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $url = clone $this; | 
					
						
							|  |  |  |         $url->normalize(); | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         return $url->getURL(); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Normalizes the URL | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * See RFC 3986, Section 6.  Normalization and Comparison | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @link https://tools.ietf.org/html/rfc3986#section-6
 | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function normalize() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         // See RFC 3986, section 6
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         // Scheme is case-insensitive
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         if ($this->_scheme) { | 
					
						
							|  |  |  |             $this->_scheme = strtolower($this->_scheme); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         // Hostname is case-insensitive
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         if ($this->_host) { | 
					
						
							|  |  |  |             $this->_host = strtolower($this->_host); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Remove default port number for known schemes (RFC 3986, section 6.2.3)
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         if ('' === $this->_port | 
					
						
							|  |  |  |             || $this->_port | 
					
						
							|  |  |  |             && $this->_scheme | 
					
						
							|  |  |  |             && $this->_port == getservbyname($this->_scheme, 'tcp') | 
					
						
							|  |  |  |         ) { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |             $this->_port = false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1)
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         // Normalize percentage-encoded unreserved characters (section 6.2.2.2)
 | 
					
						
							|  |  |  |         $fields = array(&$this->_userinfo, &$this->_host, &$this->_path, | 
					
						
							|  |  |  |                         &$this->_query, &$this->_fragment); | 
					
						
							|  |  |  |         foreach ($fields as &$field) { | 
					
						
							|  |  |  |             if ($field !== false) { | 
					
						
							|  |  |  |                 $field = $this->_normalize("$field"); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         unset($field); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Path segment normalization (RFC 3986, section 6.2.2.3)
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         $this->_path = self::removeDotSegments($this->_path); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Scheme based normalization (RFC 3986, section 6.2.3)
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         if (false !== $this->_host && '' === $this->_path) { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |             $this->_path = '/'; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // path should start with '/' if there is authority (section 3.3.)
 | 
					
						
							|  |  |  |         if (strlen($this->getAuthority()) | 
					
						
							|  |  |  |             && strlen($this->_path) | 
					
						
							|  |  |  |             && $this->_path[0] !== '/' | 
					
						
							|  |  |  |         ) { | 
					
						
							|  |  |  |             $this->_path = '/' . $this->_path; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1) | 
					
						
							|  |  |  |      * Normalize percentage-encoded unreserved characters (section 6.2.2.2) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string|array $mixed string or array of strings to normalize | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return string|array | 
					
						
							|  |  |  |      * @see normalize | 
					
						
							|  |  |  |      * @see _normalizeCallback() | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function _normalize($mixed) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return preg_replace_callback( | 
					
						
							|  |  |  |             '((?:%[0-9a-fA-Z]{2})+)', array($this, '_normalizeCallback'), | 
					
						
							|  |  |  |             $mixed | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Callback for _normalize() of %XX percentage-encodings | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param array $matches as by preg_replace_callback | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      * @see normalize | 
					
						
							|  |  |  |      * @see _normalize | 
					
						
							|  |  |  |      * @SuppressWarnings(PHPMD.UnusedPrivateMethod) | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function _normalizeCallback($matches) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return self::urlencode(urldecode($matches[0])); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns whether this instance represents an absolute URL. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @return bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function isAbsolute() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         return (bool) $this->_scheme; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns an Net_URL2 instance representing an absolute URL relative to | 
					
						
							|  |  |  |      * this URL. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Net_URL2|string $reference relative URL | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @throws Exception | 
					
						
							|  |  |  |      * @return $this | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function resolve($reference) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         if (!$reference instanceof Net_URL2) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             $reference = new self($reference); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         if (!$reference->_isFragmentOnly() && !$this->isAbsolute()) { | 
					
						
							|  |  |  |             throw new Exception( | 
					
						
							|  |  |  |                 'Base-URL must be absolute if reference is not fragment-only' | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // A non-strict parser may ignore a scheme in the reference if it is
 | 
					
						
							|  |  |  |         // identical to the base URI's scheme.
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         if (!$this->getOption(self::OPTION_STRICT) | 
					
						
							|  |  |  |             && $reference->_scheme == $this->_scheme | 
					
						
							|  |  |  |         ) { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |             $reference->_scheme = false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $target = new self(''); | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         if ($reference->_scheme !== false) { | 
					
						
							|  |  |  |             $target->_scheme = $reference->_scheme; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             $target->setAuthority($reference->getAuthority()); | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |             $target->_path  = self::removeDotSegments($reference->_path); | 
					
						
							|  |  |  |             $target->_query = $reference->_query; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } else { | 
					
						
							|  |  |  |             $authority = $reference->getAuthority(); | 
					
						
							|  |  |  |             if ($authority !== false) { | 
					
						
							|  |  |  |                 $target->setAuthority($authority); | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                 $target->_path  = self::removeDotSegments($reference->_path); | 
					
						
							|  |  |  |                 $target->_query = $reference->_query; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                 if ($reference->_path == '') { | 
					
						
							|  |  |  |                     $target->_path = $this->_path; | 
					
						
							|  |  |  |                     if ($reference->_query !== false) { | 
					
						
							|  |  |  |                         $target->_query = $reference->_query; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                     } else { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                         $target->_query = $this->_query; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                     } | 
					
						
							|  |  |  |                 } else { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                     if (substr($reference->_path, 0, 1) == '/') { | 
					
						
							|  |  |  |                         $target->_path = self::removeDotSegments($reference->_path); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                     } else { | 
					
						
							|  |  |  |                         // Merge paths (RFC 3986, section 5.2.3)
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                         if ($this->_host !== false && $this->_path == '') { | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |                             $target->_path = '/' . $reference->_path; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                         } else { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                             $i = strrpos($this->_path, '/'); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                             if ($i !== false) { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                                 $target->_path = substr($this->_path, 0, $i + 1); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                             } | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                             $target->_path .= $reference->_path; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                         } | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                         $target->_path = self::removeDotSegments($target->_path); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                     $target->_query = $reference->_query; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 $target->setAuthority($this->getAuthority()); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |             $target->_scheme = $this->_scheme; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         $target->_fragment = $reference->_fragment; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return $target; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * URL is fragment-only | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @SuppressWarnings(PHPMD.UnusedPrivateMethod) | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function _isFragmentOnly() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return ( | 
					
						
							|  |  |  |             $this->_fragment !== false | 
					
						
							|  |  |  |             && $this->_query === false | 
					
						
							|  |  |  |             && $this->_path === '' | 
					
						
							|  |  |  |             && $this->_port === false | 
					
						
							|  |  |  |             && $this->_host === false | 
					
						
							|  |  |  |             && $this->_userinfo === false | 
					
						
							|  |  |  |             && $this->_scheme === false | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Removes dots as described in RFC 3986, section 5.2.4, e.g. | 
					
						
							|  |  |  |      * "/foo/../bar/baz" => "/bar/baz" | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $path a path | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return string a path | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     public static function removeDotSegments($path) | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         $path = (string) $path; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         $output = ''; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Make sure not to be trapped in an infinite loop due to a bug in this
 | 
					
						
							|  |  |  |         // method
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         $loopLimit = 256; | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         $j = 0; | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         while ('' !== $path && $j++ < $loopLimit) { | 
					
						
							|  |  |  |             if (substr($path, 0, 2) === './') { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                 // Step 2.A
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 $path = substr($path, 2); | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |             } elseif (substr($path, 0, 3) === '../') { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                 // Step 2.A
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 $path = substr($path, 3); | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |             } elseif (substr($path, 0, 3) === '/./' || $path === '/.') { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                 // Step 2.B
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 $path = '/' . substr($path, 3); | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |             } elseif (substr($path, 0, 4) === '/../' || $path === '/..') { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                 // Step 2.C
 | 
					
						
							|  |  |  |                 $path   = '/' . substr($path, 4); | 
					
						
							|  |  |  |                 $i      = strrpos($output, '/'); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 $output = $i === false ? '' : substr($output, 0, $i); | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |             } elseif ($path === '.' || $path === '..') { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                 // Step 2.D
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 $path = ''; | 
					
						
							|  |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |                 // Step 2.E
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |                 $i = strpos($path, '/', $path[0] === '/'); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 if ($i === false) { | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |                     $output .= $path; | 
					
						
							|  |  |  |                     $path = ''; | 
					
						
							|  |  |  |                     break; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 $output .= substr($path, 0, $i); | 
					
						
							|  |  |  |                 $path = substr($path, $i); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         if ($path !== '') { | 
					
						
							|  |  |  |             $message = sprintf( | 
					
						
							|  |  |  |                 'Unable to remove dot segments; hit loop limit %d (left: %s)', | 
					
						
							|  |  |  |                 $j, var_export($path, true) | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |             trigger_error($message, E_USER_WARNING); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         return $output; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Percent-encodes all non-alphanumeric characters except these: _ . - ~ | 
					
						
							|  |  |  |      * Similar to PHP's rawurlencode(), except that it also encodes ~ in PHP | 
					
						
							|  |  |  |      * 5.2.x and earlier. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @param string $string string to encode | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public static function urlencode($string) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         $encoded = rawurlencode($string); | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // This is only necessary in PHP < 5.3.
 | 
					
						
							|  |  |  |         $encoded = str_replace('%7E', '~', $encoded); | 
					
						
							|  |  |  |         return $encoded; | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Returns a Net_URL2 instance representing the canonical URL of the | 
					
						
							|  |  |  |      * currently executing PHP script. | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @throws Exception | 
					
						
							|  |  |  |      * @return string | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public static function getCanonical() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!isset($_SERVER['REQUEST_METHOD'])) { | 
					
						
							|  |  |  |             // ALERT - no current URL
 | 
					
						
							|  |  |  |             throw new Exception('Script was not called through a webserver'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Begin with a relative URL
 | 
					
						
							|  |  |  |         $url = new self($_SERVER['PHP_SELF']); | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         $url->_scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http'; | 
					
						
							|  |  |  |         $url->_host   = $_SERVER['SERVER_NAME']; | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         $port = $_SERVER['SERVER_PORT']; | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         if ($url->_scheme == 'http' && $port != 80 | 
					
						
							|  |  |  |             || $url->_scheme == 'https' && $port != 443 | 
					
						
							|  |  |  |         ) { | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |             $url->_port = $port; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |         return $url; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns the URL used to retrieve the current request. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return  string | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public static function getRequestedURL() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return self::getRequested()->getUrl(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns a Net_URL2 instance representing the URL used to retrieve the | 
					
						
							|  |  |  |      * current request. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @throws Exception | 
					
						
							|  |  |  |      * @return $this | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public static function getRequested() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!isset($_SERVER['REQUEST_METHOD'])) { | 
					
						
							|  |  |  |             // ALERT - no current URL
 | 
					
						
							|  |  |  |             throw new Exception('Script was not called through a webserver'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Begin with a relative URL
 | 
					
						
							|  |  |  |         $url = new self($_SERVER['REQUEST_URI']); | 
					
						
							| 
									
										
										
										
											2009-10-28 15:29:20 -04:00
										 |  |  |         $url->_scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http'; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         // Set host and possibly port
 | 
					
						
							|  |  |  |         $url->setAuthority($_SERVER['HTTP_HOST']); | 
					
						
							|  |  |  |         return $url; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * Returns the value of the specified option. | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @param string $optionName The name of the option to retrieve | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @return mixed | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |     public function getOption($optionName) | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         return isset($this->_options[$optionName]) | 
					
						
							|  |  |  |             ? $this->_options[$optionName] : false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * A simple version of http_build_query in userland. The encoded string is | 
					
						
							|  |  |  |      * percentage encoded according to RFC 3986. | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @param array  $data      An array, which has to be converted into | 
					
						
							|  |  |  |      *                          QUERY_STRING. Anything is possible. | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @param string $separator Separator {@link self::OPTION_SEPARATOR_OUTPUT} | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @param string $key       For stacked values (arrays in an array). | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * @return string | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |     protected function buildQuery(array $data, $separator, $key = null) | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         $query = array(); | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         $drop_names = ( | 
					
						
							|  |  |  |             $this->_options[self::OPTION_DROP_SEQUENCE] === true | 
					
						
							|  |  |  |             && array_keys($data) === array_keys(array_values($data)) | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         foreach ($data as $name => $value) { | 
					
						
							|  |  |  |             if ($this->getOption(self::OPTION_ENCODE_KEYS) === true) { | 
					
						
							|  |  |  |                 $name = rawurlencode($name); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if ($key !== null) { | 
					
						
							|  |  |  |                 if ($this->getOption(self::OPTION_USE_BRACKETS) === true) { | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |                     $drop_names && $name = ''; | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |                     $name = $key . '[' . $name . ']'; | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     $name = $key; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (is_array($value)) { | 
					
						
							|  |  |  |                 $query[] = $this->buildQuery($value, $separator, $name); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 $query[] = $name . '=' . rawurlencode($value); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return implode($separator, $query); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * This method uses a regex to parse the url into the designated parts. | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @param string $url URL | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      * @uses   self::$_scheme, self::setAuthority(), self::$_path, self::$_query, | 
					
						
							|  |  |  |      *         self::$_fragment | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |      * @see    __construct | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |      */ | 
					
						
							|  |  |  |     protected function parseUrl($url) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // The regular expression is copied verbatim from RFC 3986, appendix B.
 | 
					
						
							|  |  |  |         // The expression does not validate the URL but matches any string.
 | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         preg_match( | 
					
						
							|  |  |  |             '(^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)', | 
					
						
							|  |  |  |             $url, $matches | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // "path" is always present (possibly as an empty string); the rest
 | 
					
						
							|  |  |  |         // are optional.
 | 
					
						
							|  |  |  |         $this->_scheme   = !empty($matches[1]) ? $matches[2] : false; | 
					
						
							|  |  |  |         $this->setAuthority(!empty($matches[3]) ? $matches[4] : false); | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  |         $this->_path     = $this->_encodeData($matches[5]); | 
					
						
							|  |  |  |         $this->_query    = !empty($matches[6]) | 
					
						
							|  |  |  |                            ? $this->_encodeData($matches[7]) | 
					
						
							|  |  |  |                            : false | 
					
						
							|  |  |  |             ; | 
					
						
							| 
									
										
										
										
											2013-10-05 14:29:02 +02:00
										 |  |  |         $this->_fragment = !empty($matches[8]) ? $matches[9] : false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-07-10 13:28:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Encode characters that might have been forgotten to encode when passing | 
					
						
							|  |  |  |      * in an URL. Applied onto Userinfo, Path and Query. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $url URL | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      * @see parseUrl | 
					
						
							|  |  |  |      * @see setAuthority | 
					
						
							|  |  |  |      * @link https://pear.php.net/bugs/bug.php?id=20425 | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function _encodeData($url) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return preg_replace_callback( | 
					
						
							|  |  |  |             '([\x-\x20\x22\x3C\x3E\x7F-\xFF]+)', | 
					
						
							|  |  |  |             array($this, '_encodeCallback'), $url | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * callback for encoding character data | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param array $matches Matches | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      * @see _encodeData | 
					
						
							|  |  |  |      * @SuppressWarnings(PHPMD.UnusedPrivateMethod) | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function _encodeCallback(array $matches) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return rawurlencode($matches[0]); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | } |