Skip to content

Commit d42ae6a

Browse files
Refactor makeRequest method
1 parent f1a218e commit d42ae6a

File tree

1 file changed

+50
-16
lines changed

1 file changed

+50
-16
lines changed

lib/Client.php

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,51 @@ private function buildUrl($queryParams = null)
131131
return sprintf('%s%s%s', $this->host, $this->version ?: '', $path);
132132
}
133133

134+
/**
135+
* Prepare response object
136+
*
137+
* @param resource $curl the curl resource
138+
*
139+
* @return Response object
140+
*/
141+
private function prepareResponse($curl)
142+
{
143+
$response = curl_exec($curl);
144+
145+
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
146+
147+
$statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
148+
149+
$responseBody = substr($response, $headerSize);
150+
151+
$responseHeaders = substr($response, 0, $headerSize);
152+
$responseHeaders = explode("\n", $responseHeaders);
153+
$responseHeaders = array_map('trim', $responseHeaders);
154+
155+
$response = new Response($statusCode, $responseBody, $responseHeaders);
156+
157+
return $response;
158+
}
159+
160+
/**
161+
* Retry request
162+
*
163+
* @param array $responseHeaders headers from rate limited response
164+
* @param string $method the HTTP verb
165+
* @param string $url the final url to call
166+
* @param array $body request body
167+
* @param array $headers original headers
168+
*
169+
* @return Response response object
170+
*/
171+
private function retryRequest($responseHeaders, $method, $url, $body, $headers)
172+
{
173+
$sleepDurations = $responseHeaders['X-Ratelimit-Reset'] - time();
174+
sleep($sleepDurations > 0 ? $sleepDurations : 0);
175+
176+
return $this->makeRequest($method, $url, $body, $headers, false);
177+
}
178+
134179
/**
135180
* Make the API call and return the response. This is separated into
136181
* it's own function, so we can mock it easily for testing.
@@ -158,32 +203,21 @@ public function makeRequest($method, $url, $body = null, $headers = null, $retry
158203
if (isset($headers)) {
159204
$this->headers = array_merge($this->headers, $headers);
160205
}
206+
161207
if (isset($body)) {
162208
$encodedBody = json_encode($body);
163209
curl_setopt($curl, CURLOPT_POSTFIELDS, $encodedBody);
164210
$this->headers = array_merge($this->headers, ['Content-Type: application/json']);
165211
}
166-
curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers);
167212

168-
$response = curl_exec($curl);
169-
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
170-
$statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
171-
172-
$responseBody = substr($response, $headerSize);
173-
$responseHeaders = substr($response, 0, $headerSize);
213+
curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers);
174214

175-
$responseHeaders = explode("\n", $responseHeaders);
176-
$responseHeaders = array_map('trim', $responseHeaders);
215+
$response = $this->prepareResponse($curl);
177216

178217
curl_close($curl);
179-
180-
$response = new Response($statusCode, $responseBody, $responseHeaders);
181218

182-
if ($statusCode == 429 && $retryOnLimit) {
183-
$headers = $response->headers(true);
184-
$sleepDurations = $headers['X-Ratelimit-Reset'] - time();
185-
sleep($sleepDurations > 0 ? $sleepDurations : 0);
186-
return $this->makeRequest($method, $url, $body, $headers, false);
219+
if ($response->statusCode() == 429 && $retryOnLimit) {
220+
return $this->retryRequest($response->headers(true), $method, $url, $body, $headers);
187221
}
188222

189223
return $response;

0 commit comments

Comments
 (0)