diff --git a/src/Guzzle/Http/Message/Request.php b/src/Guzzle/Http/Message/Request.php index e617bada..50490bbb 100644 --- a/src/Guzzle/Http/Message/Request.php +++ b/src/Guzzle/Http/Message/Request.php @@ -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(), '/'); } /** diff --git a/src/Guzzle/Http/QueryString.php b/src/Guzzle/Http/QueryString.php index 8efbb930..6cd3aaa5 100644 --- a/src/Guzzle/Http/QueryString.php +++ b/src/Guzzle/Http/QueryString.php @@ -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); } diff --git a/src/Guzzle/Http/Url.php b/src/Guzzle/Http/Url.php index 63f5ad4a..03ad8c14 100644 --- a/src/Guzzle/Http/Url.php +++ b/src/Guzzle/Http/Url.php @@ -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 .= '/'; diff --git a/tests/Guzzle/Tests/Http/Message/RequestTest.php b/tests/Guzzle/Tests/Http/Message/RequestTest.php index 1e9ed261..92b72215 100644 --- a/tests/Guzzle/Tests/Http/Message/RequestTest.php +++ b/tests/Guzzle/Tests/Http/Message/RequestTest.php @@ -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 diff --git a/tests/Guzzle/Tests/Http/QueryStringTest.php b/tests/Guzzle/Tests/Http/QueryStringTest.php index b7e340c4..31caac5f 100644 --- a/tests/Guzzle/Tests/Http/QueryStringTest.php +++ b/tests/Guzzle/Tests/Http/QueryStringTest.php @@ -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 */ diff --git a/tests/Guzzle/Tests/Http/UrlTest.php b/tests/Guzzle/Tests/Http/UrlTest.php index dda0c01f..8a64eb97 100644 --- a/tests/Guzzle/Tests/Http/UrlTest.php +++ b/tests/Guzzle/Tests/Http/UrlTest.php @@ -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 */