コード例 #1
0
 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;
 }