@@ -240,6 +240,43 @@ private function createCurlMultiHandle($requests)
240
240
return [$ channels , $ multiHandle ];
241
241
}
242
242
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
+
243
280
/**
244
281
* Make the API call and return the response. This is separated into
245
282
* 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
260
297
261
298
curl_setopt_array ($ curl , $ curlOpts );
262
299
263
- curl_setopt ($ curl , CURLOPT_HTTPHEADER , $ this ->headers );
264
-
265
300
$ response = $ this ->prepareResponse ($ curl );
266
301
267
- curl_close ($ curl );
268
-
269
302
if ($ response ->statusCode () == 429 && $ retryOnLimit ) {
270
303
return $ this ->retryRequest ($ response ->headers (true ), $ method , $ url , $ body , $ headers );
271
304
}
272
305
306
+ curl_close ($ curl );
307
+
273
308
return $ response ;
274
309
}
275
310
0 commit comments