Skip to content

Commit aa4d727

Browse files
Merge pull request #89 from sendgrid/88_add_prepareResponse
Fix #88: Missing Function
2 parents cc7138b + 301c9f0 commit aa4d727

File tree

1 file changed

+39
-4
lines changed

1 file changed

+39
-4
lines changed

lib/Client.php

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)