function call_api($method, $uri, $params, &$options)
{
$prefix = \Cloudinary::option_get($options, "upload_prefix", \Cloudinary::config_get("upload_prefix", "https://api.cloudinary.com"));
$cloud_name = \Cloudinary::option_get($options, "cloud_name", \Cloudinary::config_get("cloud_name"));
if (!$cloud_name) {
throw new \InvalidArgumentException("Must supply cloud_name");
}
$api_key = \Cloudinary::option_get($options, "api_key", \Cloudinary::config_get("api_key"));
if (!$api_key) {
throw new \InvalidArgumentException("Must supply api_key");
}
$api_secret = \Cloudinary::option_get($options, "api_secret", \Cloudinary::config_get("api_secret"));
if (!$api_secret) {
throw new \InvalidArgumentException("Must supply api_secret");
}
$api_url = implode("/", array_merge(array($prefix, "v1_1", $cloud_name), $uri));
$params = array_filter($params, function ($v) {
return !is_null($v) && $v !== "";
});
if ($method == "get") {
$api_url .= "?" . preg_replace("/%5B\\d+%5D/", "%5B%5D", http_build_query($params));
}
$ch = curl_init($api_url);
if ($method != "get") {
$post_params = array();
foreach ($params as $key => $value) {
if (is_array($value)) {
$i = 0;
foreach ($value as $item) {
$post_params[$key . "[{$i}]"] = $item;
$i++;
}
} else {
$post_params[$key] = $value;
}
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_params);
}
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($method));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "{$api_key}:{$api_secret}");
curl_setopt($ch, CURLOPT_CAINFO, realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR . "cacert.pem");
curl_setopt($ch, CURLOPT_USERAGENT, \Cloudinary::userAgent());
curl_setopt($ch, CURLOPT_PROXY, \Cloudinary::option_get($options, "api_proxy", \Cloudinary::config_get("api_proxy")));
$response = $this->execute($ch);
$curl_error = NULL;
if (curl_errno($ch)) {
$curl_error = curl_error($ch);
}
curl_close($ch);
if ($curl_error != NULL) {
throw new \Cloudinary\Api\GeneralError("Error in sending request to server - " . $curl_error);
}
if ($response->responseCode == 200) {
return new \Cloudinary\Api\Response($response);
} else {
$exception_class = \Cloudinary::option_get(self::$CLOUDINARY_API_ERROR_CLASSES, $response->responseCode);
if (!$exception_class) {
throw new \Cloudinary\Api\GeneralError("Server returned unexpected status code - {$response->responseCode} - {$response->body}");
}
$json = $this->parse_json_response($response);
throw new $exception_class($json["error"]["message"]);
}
}