/** * perform curl() request * -> caches response by returned HTTP Cache header data * @param string $url * @param array|null $options * @param array $additionalOptions * @param int $retryCount request counter for failed crest call * @return array|FALSE|mixed */ public function request($url, array $options = null, $additionalOptions = [], $retryCount = 0) { $f3 = \Base::instance(); if (!$f3->exists($hash = $this->getCacheKey($url, $options))) { // retry same request until request limit is reached $retry = false; $result = parent::request($url, $options); $result['timeout'] = false; $statusCode = $this->getStatusCodeFromHeaders($result['headers']); switch ($statusCode) { case 100: case 200: // request succeeded -> check if response should be cached $ttl = $this->getCacheTimeFromHeaders($result['headers']); if ($ttl > 0 && !empty(json_decode($result['body'], true))) { $f3->set($hash, $result, $ttl); } break; case 401: case 415: // unauthorized $errorMsg = $this->getErrorMessageFromJsonResponse($statusCode, $options['method'], $url, json_decode($result['body'])); LogController::getLogger('ERROR')->write($errorMsg); break; case 500: case 501: case 502: case 503: case 505: $retry = true; if ($retryCount == self::RETRY_COUNT_MAX) { $errorMsg = $this->getErrorMessageFromJsonResponse($statusCode, $options['method'], $url, json_decode($result['body'])); LogController::getLogger('ERROR')->write($errorMsg); // trigger error if ($additionalOptions['suppressHTTPErrors'] !== true) { $f3->error($statusCode, $errorMsg); } } break; case 504: case 0: $retry = true; if ($retryCount == self::RETRY_COUNT_MAX) { // timeout -> response should not be cached $result['timeout'] = true; $errorMsg = $this->getErrorMessageFromJsonResponse(504, $options['method'], $url, json_decode($result['body'])); // log error LogController::getLogger('ERROR')->write($errorMsg); if ($additionalOptions['suppressHTTPErrors'] !== true) { $f3->error(504, $errorMsg); } } break; default: // unknown status $errorMsg = $this->getErrorMessageFromJsonResponse($statusCode, $options['method'], $url); LogController::getLogger('ERROR')->write($errorMsg); break; } if ($retry && $retryCount < self::RETRY_COUNT_MAX) { $retryCount++; $this->request($url, $options, $additionalOptions, $retryCount); } } else { $result = $f3->get($hash); } return $result; }