@@ -240,6 +240,43 @@ private function createCurlMultiHandle($requests)
240240 return [$ channels , $ multiHandle ];
241241 }
242242
243+ /**
244+ * Prepare response object
245+ *
246+ * @param resource $curl the curl resource
247+ *
248+ * @return Response object
249+ */
250+ private function prepareResponse ($ curl )
251+ {
252+ $ response = curl_exec ($ curl );
253+ $ headerSize = curl_getinfo ($ curl , CURLINFO_HEADER_SIZE );
254+ $ statusCode = curl_getinfo ($ curl , CURLINFO_HTTP_CODE );
255+ $ responseBody = substr ($ response , $ headerSize );
256+ $ responseHeaders = substr ($ response , 0 , $ headerSize );
257+ $ responseHeaders = explode ("\n" , $ responseHeaders );
258+ $ responseHeaders = array_map ('trim ' , $ responseHeaders );
259+ $ response = new Response ($ statusCode , $ responseBody , $ responseHeaders );
260+ return $ response ;
261+ }
262+ /**
263+ * Retry request
264+ *
265+ * @param array $responseHeaders headers from rate limited response
266+ * @param string $method the HTTP verb
267+ * @param string $url the final url to call
268+ * @param array $body request body
269+ * @param array $headers original headers
270+ *
271+ * @return Response response object
272+ */
273+ private function retryRequest ($ responseHeaders , $ method , $ url , $ body , $ headers )
274+ {
275+ $ sleepDurations = $ responseHeaders ['X-Ratelimit-Reset ' ] - time ();
276+ sleep ($ sleepDurations > 0 ? $ sleepDurations : 0 );
277+ return $ this ->makeRequest ($ method , $ url , $ body , $ headers , false );
278+ }
279+
243280 /**
244281 * Make the API call and return the response. This is separated into
245282 * it's own function, so we can mock it easily for testing.
@@ -260,16 +297,14 @@ public function makeRequest($method, $url, $body = null, $headers = null, $retry
260297
261298 curl_setopt_array ($ curl , $ curlOpts );
262299
263- curl_setopt ($ curl , CURLOPT_HTTPHEADER , $ this ->headers );
264-
265300 $ response = $ this ->prepareResponse ($ curl );
266301
267- curl_close ($ curl );
268-
269302 if ($ response ->statusCode () == 429 && $ retryOnLimit ) {
270303 return $ this ->retryRequest ($ response ->headers (true ), $ method , $ url , $ body , $ headers );
271304 }
272305
306+ curl_close ($ curl );
307+
273308 return $ response ;
274309 }
275310
0 commit comments