1
0
mirror of https://github.com/guzzle/guzzle.git synced 2025-02-25 02:22:57 +01:00

Fixes edge-cases in Url, QueryString, and Request

Falsy values (the string "0") are now handled properly

e.g. http://foo.com?0, http://foo.com#0
This commit is contained in:
David Abdemoulaie 2013-01-31 14:35:20 -06:00
parent cde72ff57a
commit db5b96d08d
6 changed files with 76 additions and 8 deletions

View File

@ -349,11 +349,7 @@ class Request extends AbstractMessage implements RequestInterface
*/
public function getPath()
{
if ($path = $this->url->getPath()) {
return '/' . ltrim($path, '/');
} else {
return '/';
}
return '/' . ltrim($this->url->getPath(), '/');
}
/**

View File

@ -45,7 +45,7 @@ class QueryString extends Collection
{
$q = new static();
if (!empty($query)) {
if (0 !== strlen($query)) {
if ($query[0] == '?') {
$query = substr($query, 1);
}

View File

@ -35,7 +35,7 @@ class Url
$parts = ParserRegistry::getInstance()->getParser('url')->parseUrl($url);
// Convert the query string into a QueryString object
if ($parts['query']) {
if (0 !== strlen($parts['query'])) {
$parts['query'] = QueryString::fromString($parts['query']);
}
@ -81,7 +81,7 @@ class Url
}
// Add the path component if present
if (!empty($parts['path'])) {
if (isset($parts['path']) && 0 !== strlen($parts['path'])) {
// Always ensure that the path begins with '/' if set and something is before the path
if ($url && $parts['path'][0] != '/' && substr($url, -1) != '/') {
$url .= '/';

View File

@ -337,6 +337,22 @@ class RequestTest extends \Guzzle\Tests\GuzzleTestCase
$this->assertEquals('/index.html', $this->request->getPath());
}
/**
* @covers Guzzle\Http\Message\Request::getHost
* @covers Guzzle\Http\Message\Request::getPath
* @covers Guzzle\Http\Message\Request::getQuery
*/
public function testPermitsFalsyComponents()
{
$request = new Request('GET', 'http://0/0?0');
$this->assertSame('0', $request->getHost());
$this->assertSame('/0', $request->getPath());
$this->assertSame('0=', $request->getQuery(true));
$request = new Request('GET', '0');
$this->assertEquals('/0', $request->getPath());
}
/**
* @covers Guzzle\Http\Message\Request::getPort
* @covers Guzzle\Http\Message\Request::setPort

View File

@ -220,6 +220,18 @@ class QueryStringTest extends \Guzzle\Tests\GuzzleTestCase
$this->assertEquals('foo', (string) $query);
}
/**
* @covers Guzzle\Http\QueryString::fromString
* @covers Guzzle\Http\QueryString::__toString
*/
public function testAllowsFalsyQueryStringValues()
{
$query = QueryString::fromString('0');
$this->assertEquals('0=', (string) $query);
$query->set('0', QueryString::BLANK);
$this->assertSame('0', (string) $query);
}
/**
* @covers Guzzle\Http\QueryString::fromString
*/

View File

@ -46,6 +46,50 @@ class UrlTest extends \Guzzle\Tests\GuzzleTestCase
$this->assertTrue($u->isAbsolute());
}
/**
* @covers Guzzle\Http\Url::factory
* @covers Guzzle\Http\Url::getHost
* @covers Guzzle\Http\Url::getPort
* @covers Guzzle\Http\Url::getQuery
* @covers Guzzle\Http\Url::getPath
* @covers Guzzle\Http\Url::getFragment
* @covers Guzzle\Http\Url::__toString
*/
public function testAllowsFalsyUrlParts()
{
$url = Url::factory('http://0:50/0?0#0');
$this->assertSame('0', $url->getHost());
$this->assertEquals(50, $url->getPort());
$this->assertSame('/0', $url->getPath());
$this->assertEquals('0=', (string) $url->getQuery());
$this->assertSame('0', $url->getFragment());
$this->assertEquals('http://0:50/0?0=#0', (string) $url);
$url = Url::factory('');
$this->assertSame('', (string) $url);
$url = Url::factory('0');
$this->assertSame('0', (string) $url);
}
/**
* @covers Guzzle\Http\Url::buildUrl
*/
public function testBuildsRelativeUrlsWithFalsyParts()
{
$url = Url::buildUrl(array(
'host' => '0',
'path' => '0',
));
$this->assertSame('//0/0', $url);
$url = Url::buildUrl(array(
'path' => '0',
));
$this->assertSame('0', $url);
}
/**
* @covers Guzzle\Http\Url
*/