public function parseResponse($url, $response, $returnType, $expectedHttpCode, $isArray = false) { // parse response $header = false; $content = array(); $status = 200; foreach (explode("\r\n", $response) as $line) { if (strpos($line, 'HTTP/1.1') === 0) { $lineParts = explode(' ', $line); $status = intval($lineParts[1]); $header = true; } else { if ($line == '') { $header = false; } else { if ($header) { $line = explode(': ', $line); switch ($line[0]) { case 'Status': $status = intval(substr($line[1], 0, 3)); break; case 'X-RateLimit-Limit': $this->rateLimit = intval($line[1]); break; case 'X-RateLimit-Remaining': $this->rateLimitRemaining = intval($line[1]); break; case 'X-RateLimit-Reset': $this->rateLimitReset = intval($line[1]); break; case 'Link': $matches = null; if (preg_match_all('/<https:\\/\\/api\\.github\\.com\\/[^?]+\\?([^>]+)>; rel="([^"]+)"/', $line[1], $matches)) { foreach ($matches[2] as $index => $page) { $this->pageData[$page] = array(); $requestParts = explode('&', $matches[1][$index]); foreach ($requestParts as $requestPart) { list($field, $value) = explode('=', $requestPart, 2); $this->pageData[$page][$field] = $value; } } } break; } } else { $content[] = $line; } } } } if (is_array($expectedHttpCode) && !in_array($status, $expectedHttpCode) || !is_array($expectedHttpCode) && $status !== $expectedHttpCode) { throw new GitHubClientException("Expected status [" . (is_array($expectedHttpCode) ? implode(', ', $expectedHttpCode) : $expectedHttpCode) . "], actual status [{$status}], URL [{$url}]", GitHubClientException::INVALID_HTTP_CODE); } if ($returnType == 'string') { return implode("\n", $content); } if ($returnType) { $response = json_decode(implode("\n", $content)); if (is_array($response)) { return GitHubObject::fromArray($response, $returnType); } elseif (is_object($response)) { return new $returnType($response); } } return null; }