diff --git a/src/Api.php b/src/Api.php index a8e254f..139269d 100644 --- a/src/Api.php +++ b/src/Api.php @@ -223,13 +223,32 @@ class Api if (isset($content) && $method == 'GET') { - $queryString = $request->getUri()->getQuery(); + $query_string = $request->getUri()->getQuery(); - $query = false !== strpos($queryString, '&') - ? explode('&', $queryString) - : []; + $query = array(); + if (!empty($query_string)) { + $queries = explode('&', $query_string); + foreach($queries as $element) { + $key_value_query = explode('=', $element, 2); + $query[$key_value_query[0]] = $key_value_query[1]; + } + } $query = array_merge($query, (array)$content); + + // rewrite query args to properly dump true/false parameters + foreach($query as $key => $value) + { + if ($value === false) + { + $query[$key] = "false"; + } + elseif ($value === true) + { + $query[$key] = "true"; + } + } + $query = \GuzzleHttp\Psr7\build_query($query); $url = $request->getUri()->withQuery($query); diff --git a/tests/ApiTest.php b/tests/ApiTest.php index a1375bc..7c74d34 100644 --- a/tests/ApiTest.php +++ b/tests/ApiTest.php @@ -30,6 +30,7 @@ namespace Ovh\tests; use GuzzleHttp\Client; use GuzzleHttp\Middleware; use GuzzleHttp\Psr7\Response; +use GuzzleHttp\Psr7\Request; use Ovh\Api; /** @@ -280,4 +281,90 @@ class ApiTest extends \PHPUnit_Framework_TestCase $api = new Api($this->application_key, $this->application_secret, $this->endpoint, $this->consumer_key, $this->client); $this->assertEquals($this->consumer_key, $api->getConsumerKey()); } + + + /** + * Test GET query args + */ + public function testGetQueryArgs() + { + $handlerStack = $this->client->getConfig('handler'); + $handlerStack->push(Middleware::mapRequest(function (Request $request) { + if($request->getUri()->getPath() == "/1.0/auth/time") { + return $request; + } + + $query_string = $request->getUri()->getQuery(); + $this->assertEquals($query_string, 'applicationId=49&status=pendingValidation'); + + $request = $request->withUri($request->getUri() + ->withHost('httpbin.org') + ->withPath('/') + ->withQuery('')); + return $request; + })); + //$handlerStack->push(Middleware::mapResponse(function (Response $response) { + // return $response; + //})); + + $api = new Api($this->application_key, $this->application_secret, $this->endpoint, $this->consumer_key, $this->client); + $api->get('/me/api/credential?applicationId=49', ['status' => 'pendingValidation']); + } + + /** + * Test GET overlapping query args + */ + public function testGetOverlappingQueryArgs() + { + $handlerStack = $this->client->getConfig('handler'); + $handlerStack->push(Middleware::mapRequest(function (Request $request) { + if($request->getUri()->getPath() == "/1.0/auth/time") { + return $request; + } + + $query_string = $request->getUri()->getQuery(); + $this->assertEquals($query_string, 'applicationId=49&status=expired&test=success'); + + $request = $request->withUri($request->getUri() + ->withHost('httpbin.org') + ->withPath('/') + ->withQuery('')); + return $request; + })); + //$handlerStack->push(Middleware::mapResponse(function (Response $response) { + // return $response; + //})); + + $api = new Api($this->application_key, $this->application_secret, $this->endpoint, $this->consumer_key, $this->client); + $api->get('/me/api/credential?applicationId=49&status=pendingValidation', ['status' => 'expired', 'test' => "success"]); + } + + /** + * Test GET boolean query args + */ + public function testGetBooleanQueryArgs() + { + $handlerStack = $this->client->getConfig('handler'); + $handlerStack->push(Middleware::mapRequest(function (Request $request) { + if($request->getUri()->getPath() == "/1.0/auth/time") { + return $request; + } + + $query_string = $request->getUri()->getQuery(); + $this->assertEquals($query_string, 'dryRun=true¬DryRun=false'); + + $request = $request->withUri($request->getUri() + ->withHost('httpbin.org') + ->withPath('/') + ->withQuery('')); + return $request; + })); + //$handlerStack->push(Middleware::mapResponse(function (Response $response) { + // return $response; + //})); + + $api = new Api($this->application_key, $this->application_secret, $this->endpoint, $this->consumer_key, $this->client); + $api->get('/me/api/credential', ['dryRun' => true, 'notDryRun' => false]); + } + }