Example #1
0
 /**
  * Returns an Net_URL2 instance representing an absolute URL relative to
  * this URL.
  *
  * @param Net_URL2|string $reference relative URL
  *
  * @throws Exception
  * @return $this
  */
 public function resolve($reference)
 {
     if (!$reference instanceof Net_URL2) {
         $reference = new self($reference);
     }
     if (!$reference->_isFragmentOnly() && !$this->isAbsolute()) {
         throw new Exception('Base-URL must be absolute if reference is not fragment-only');
     }
     // A non-strict parser may ignore a scheme in the reference if it is
     // identical to the base URI's scheme.
     if (!$this->getOption(self::OPTION_STRICT) && $reference->_scheme == $this->_scheme) {
         $reference->_scheme = false;
     }
     $target = new self('');
     if ($reference->_scheme !== false) {
         $target->_scheme = $reference->_scheme;
         $target->setAuthority($reference->getAuthority());
         $target->_path = self::removeDotSegments($reference->_path);
         $target->_query = $reference->_query;
     } else {
         $authority = $reference->getAuthority();
         if ($authority !== false) {
             $target->setAuthority($authority);
             $target->_path = self::removeDotSegments($reference->_path);
             $target->_query = $reference->_query;
         } else {
             if ($reference->_path == '') {
                 $target->_path = $this->_path;
                 if ($reference->_query !== false) {
                     $target->_query = $reference->_query;
                 } else {
                     $target->_query = $this->_query;
                 }
             } else {
                 if (substr($reference->_path, 0, 1) == '/') {
                     $target->_path = self::removeDotSegments($reference->_path);
                 } else {
                     // Merge paths (RFC 3986, section 5.2.3)
                     if ($this->_host !== false && $this->_path == '') {
                         $target->_path = '/' . $reference->_path;
                     } else {
                         $i = strrpos($this->_path, '/');
                         if ($i !== false) {
                             $target->_path = substr($this->_path, 0, $i + 1);
                         }
                         $target->_path .= $reference->_path;
                     }
                     $target->_path = self::removeDotSegments($target->_path);
                 }
                 $target->_query = $reference->_query;
             }
             $target->setAuthority($this->getAuthority());
         }
         $target->_scheme = $this->_scheme;
     }
     $target->_fragment = $reference->_fragment;
     return $target;
 }