/** * Combines one URI string with this one based on the rules set out in * RFC 3986 Section 2 * * @see http://tools.ietf.org/html/rfc3986#section-5.2 * * @param string $uri */ public function resolveRelativeURI(string $uri) { /* * NOTE: We don't use removeDotSegments in this * algorithm since it's already done by this line! */ $relative = new URI(); $relative->setURI($uri); if ($relative->getScheme() == $this->getScheme()) { $relative->setScheme(''); } $transformed = clone $relative; // 5.2.2 Transform References if (!empty($relative->getScheme())) { $transformed->setScheme($relative->getScheme())->setAuthority($relative->getAuthority())->setPath($relative->getPath())->setQuery($relative->getQuery()); } else { if (!empty($relative->getAuthority())) { $transformed->setAuthority($relative->getAuthority())->setPath($relative->getPath())->setQuery($relative->getQuery()); } else { if ($relative->getPath() == '') { $transformed->setPath($this->getPath()); if (!is_null($relative->getQuery())) { $transformed->setQuery($relative->getQuery()); } else { $transformed->setQuery($this->getQuery()); } } else { if (substr($relative->getPath(), 0, 1) == '/') { $transformed->setPath($relative->getPath()); } else { $transformed->setPath($this->mergePaths($this, $relative)); } $transformed->setQuery($relative->getQuery()); } $transformed->setAuthority($this->getAuthority()); } $transformed->setScheme($this->getScheme()); } $transformed->setFragment($relative->getFragment()); return $transformed; }