From 0fe13489985c79a36bc80731552547b872024bed Mon Sep 17 00:00:00 2001 From: Seth Battis Date: Mon, 17 Aug 2015 12:30:53 -0400 Subject: [PATCH] Allow http_build_query() override This seems like the kind of thing that one should never want to do. Unless... you're dealing with a RESTful API that doesn't seem to understand URL parameters that contain numeric indices for the base array. [For example](https://github.com/smtech/canvaspest/issues/3): Instructure Canvas is expecting URL parameters for arrays that do not include numerical indices: ``` http://canvas-instance.instructure.com/api/v1/courses/123/sections?include[]=students&include[]=enrollments ``` At the same time [`http_build_query()`](https://github.com/smtech/canvaspest/blob/9110d69f756ff49e8da687381eaee52a767c0389/CanvasPest.php#L108) is trying to build legal URL parameters, which require that at least the base URL be indexed, resulting in shenanigans like this: ``` http://canvas-instance.instructure.com/api/v1/courses/123/sections?include%5B0%5D=students&include%5B1%5D=enrollments ``` It appears, at least, that Canvas tolerates URL-encoded arrays, but not the indices, so a request like this would work, allowing the result of `http_build_query()` to be post-processed [as described here](http://php.net/manual/en/function.http-build-query.php#111819): ``` http://canvas-instance.instructure.com/api/v1/courses/123/sections?include%5B%5D=students&include%5B%5D=enrollments ``` --- Pest.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Pest.php b/Pest.php index 7cb9d86..1f9cf1f 100644 --- a/Pest.php +++ b/Pest.php @@ -127,6 +127,15 @@ public function setupProxy($host, $port, $user = NULL, $pass = NULL) $this->curl_opts[CURLOPT_PROXYUSERPWD] = $user . ":" . $pass; } } + + /** + * Allow overriding of `http_build_query()` for idiosyncratic APIs + * @param mixed $data + * @return string + **/ + protected function http_build_query($data) { + return http_build_query($data); + } /** * Perform HTTP GET request @@ -143,7 +152,7 @@ public function get($url, $data = array(), $headers=array()) if ($pos !== false) { $url = substr($url, 0, $pos); } - $url .= '?' . http_build_query($data); + $url .= '?' . $this->http_build_query($data); } $curl_opts = $this->curl_opts; @@ -410,7 +419,7 @@ public function prepData($data) } } - return ($multipart) ? $data : http_build_query($data); + return ($multipart) ? $data : $this->http_build_query($data); } else { return $data; } @@ -452,7 +461,7 @@ public function put($url, $data, $headers = array()) */ public function patch($url, $data, $headers = array()) { - $data = (is_array($data)) ? http_build_query($data) : $data; + $data = (is_array($data)) ? $this->http_build_query($data) : $data; $curl_opts = $this->curl_opts; $curl_opts[CURLOPT_CUSTOMREQUEST] = 'PATCH';