/** * Generate a base string for a RSA-SHA1 signature * based on the given a url, method, and any parameters. * * @param Url $url * @param string $method * @param array $parameters * * @return string */ protected function baseString(Url $url, $method = 'POST', array $parameters = []) { $baseString = rawurlencode($method) . '&'; $schemeHostPath = $url->getScheme() . '://' . $url->getHost(); if ($url->getPort() != '') { $schemeHostPath .= ':' . $url->getPort(); } if ($url->getPath() != '') { $schemeHostPath .= $url->getPath(); } $baseString .= rawurlencode($schemeHostPath) . '&'; $data = []; parse_str($url->getQuery(), $query); foreach (array_merge($query, $parameters) as $key => $value) { $data[rawurlencode($key)] = rawurlencode($value); } ksort($data); array_walk($data, function (&$value, $key) { $value = $key . '=' . $value; }); $baseString .= rawurlencode(implode('&', $data)); return $baseString; }
function testUrl() { $url = new Url(self::TEST_URL); $this->assertEquals($url->getFull(), self::TEST_URL); $this->assertEquals($url->getScheme(), 'https'); $this->assertEquals($url->getHost(), 'www.google.com'); $this->assertEquals($url->getPort(), '80'); $this->assertEquals($url->getPath(), '/some_path'); // The HTML entities remain intact $this->assertEquals($url->getQuery(), 'some=query&something=%20weird'); // The HTML entities are resolved $this->assertEquals($url->getParam('some'), 'query'); $this->assertEquals($url->getParam('something'), ' weird'); $this->assertEquals($url->getParams(), ['some' => 'query', 'something' => ' weird']); $this->assertEquals($url->getFragment(), 'some_fragment'); $this->assertEquals($url->getUser(), 'user'); $this->assertEquals($url->getPass(), 'pass'); }
/** * Checks this url is base uri for the given url. * * @param Url $targetUri The url to inspect the base part. * * @return boolean */ public function isBaseOf(Url $targetUri) { if ($this->_parts['scheme'] !== $targetUri->getScheme() || $this->_parts['host'] !== $targetUri->getHost() || $this->getPort() !== $targetUri->getPort()) { return false; } $srcSegmentCount = count($this->_segments); $targetSegments = $targetUri->getSegments(); $targetSegmentCount = count($targetSegments); if ($srcSegmentCount > $targetSegmentCount) { return false; } for ($i = 0; $i < $srcSegmentCount; $i++) { if ($this->_segments[$i] !== $targetSegments[$i]) { return false; } } return true; }
/** * get a link from the current URL to another one * @param UrlInterface|string $url the URL to link to * @param boolean $forceAbsolute should an absolute path be used, defaults to `true`) * @return string the link */ public function linkTo($url, $forceAbsolute = true) { if (is_string($url)) { $url = new Url($url); } $str = (string) $url; if ($this->getScheme() !== $url->getScheme()) { return $str; } $str = preg_replace('(^[^/]+//)', '', $str); if ($this->getHost() !== $url->getHost() || $this->getPort() !== $url->getPort()) { return '//' . $str; } $str = preg_replace('(^[^/]+)', '', $str); if ($this->getPath() !== $url->getPath()) { if ($forceAbsolute) { return $str; } $cnt = 0; $tseg = $this->getSegments(); $useg = $url->getSegments(); foreach ($tseg as $k => $v) { if (!isset($useg[$k]) || $useg[$k] !== $v) { break; } $cnt++; } $str = './' . str_repeat('../', count($useg) - $cnt) . implode('/', array_slice($useg, $cnt)); if ($url->getQuery()) { $str .= '?' . $url->getQuery(); } if ($url->getFragment()) { $str .= '#' . $url->getFragment(); } return $str; } $str = preg_replace('(^[^?]+)', '', $str); if ($this->getQuery() !== $url->getQuery() || $url->getFragment() === null) { return $str; } return '#' . $url->getFragment(); }
/** * @param $url * @param $expectedPort * * @dataProvider dataProviderForTestGetPort */ public function testGetPort($url, $expectedPort) { $url = new Url($url); $this->assertEquals($expectedPort, $url->getPort()); }
public function testUrlFragmentEncoding() { $url = new Url('http://127.0.0.1/foobar?bar=foo#!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'); $this->assertEquals('http', $url->getScheme()); $this->assertEquals(null, $url->getUserInfo()); $this->assertEquals('127.0.0.1', $url->getHost()); $this->assertEquals(null, $url->getPort()); $this->assertEquals('/foobar', $url->getPath()); $this->assertEquals(array('bar' => 'foo'), $url->getParameters()); $this->assertEquals('!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~', $url->getFragment()); }