Newer
Older
<?php
/**
* Copyright Maarch since 2008 under licence GPLv3.
* See LICENCE.txt file at the root folder for more details.
* This file is part of Maarch software.
*
*/
/**
* @brief Curl Model
* @author dev@maarch.org
*/
class CurlModel
{
public static function exec(array $aArgs)
{
ValidatorModel::arrayType($aArgs, ['bodyData']);
ValidatorModel::boolType($aArgs, ['noAuth', 'multipleObject']);
$curlConfig['url'] = $aArgs['url'];
$curlConfig['user'] = $aArgs['user'];
$curlConfig['password'] = $aArgs['password'];
$curlConfig['method'] = $aArgs['method'];
$opts = [
CURLOPT_URL => $curlConfig['url'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
if (empty($aArgs['multipleObject'])) {
$opts[CURLOPT_HTTPHEADER][] = 'accept:application/json';
$opts[CURLOPT_HTTPHEADER][] = 'content-type:application/json';
}
if (empty($aArgs['noAuth']) && !empty($curlConfig['user']) && !empty($curlConfig['password'])) {
$opts[CURLOPT_HTTPHEADER][] = 'Authorization: Basic ' . base64_encode($curlConfig['user']. ':' .$curlConfig['password']);
}
if (!empty($curlConfig['header'])) {
if (empty($opts[CURLOPT_HTTPHEADER])) {
$opts[CURLOPT_HTTPHEADER] = [];
}
$opts[CURLOPT_HTTPHEADER] = array_merge($opts[CURLOPT_HTTPHEADER], $curlConfig['header']);
if ($curlConfig['method'] == 'POST' || $curlConfig['method'] == 'PUT') {
if (is_array($aArgs['bodyData']) && !empty($aArgs['bodyData']) && $aArgs['multipleObject']) {
$bodyData = [];
foreach ($aArgs['bodyData'] as $key => $value) {
$bodyData[$key] = $value;
} else {
$bodyData[$key] = json_encode($value);
}
}
} else {
$bodyData = json_encode($aArgs['bodyData']);
}
$opts[CURLOPT_POSTFIELDS] = $bodyData;
if ($curlConfig['method'] == 'POST' && empty($aArgs['multipleObject'])) {
$opts[CURLOPT_POST] = true;
} elseif ($curlConfig['method'] == 'PUT' || $curlConfig['method'] == 'DELETE') {
$opts[CURLOPT_CUSTOMREQUEST] = $curlConfig['method'];
}
$curl = curl_init();
curl_setopt_array($curl, $opts);
$rawResponse = curl_exec($curl);
LogsController::add([
'isTech' => true,
'moduleId' => 'curl',
'level' => 'DEBUG',
'tableName' => '',
'recordId' => 'Body : ' . json_encode($bodyData),
'eventType' => 'Exec Curl : ' . $curlConfig['url'],
if (!empty($error)) {
LogsController::add([
'isTech' => true,
'moduleId' => 'curl',
'level' => 'ERROR',
'tableName' => '',
'recordId' => '',
'eventType' => 'Error Exec Curl : ' . $error,
'eventId' => $rawResponse
]);
return ['error' => $error];
}
return json_decode($rawResponse, true);
}
public static function execSOAP(array $aArgs)
{
ValidatorModel::notEmpty($aArgs, ['xmlPostString', 'url']);
ValidatorModel::stringType($aArgs, ['xmlPostString', 'url', 'soapAction']);
ValidatorModel::arrayType($aArgs, ['options']);
$opts = [
CURLOPT_URL => $aArgs['url'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $aArgs['xmlPostString'],
CURLOPT_HTTPHEADER => [
'content-type:text/xml;charset="utf-8"',
'accept:text/xml',
'Cache-Control: no-cache',
'Pragma: no-cache',
'Content-length: ' . strlen($aArgs['xmlPostString']),
],
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false
if (!empty($aArgs['soapAction'])) {
$opts[CURLOPT_HTTPHEADER][] = "SOAPAction: \"{$aArgs['soapAction']}\"";
}
if (!empty($aArgs['Cookie'])) {
$opts[CURLOPT_HTTPHEADER][] = "Cookie:{$aArgs['Cookie']}";
}
foreach ($aArgs['options'] as $key => $option) {
$opts[$key] = $option;
}
$curl = curl_init();
curl_setopt_array($curl, $opts);
$rawResponse = curl_exec($curl);
if (!empty($aArgs['options'][CURLOPT_HEADER])) {
preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $rawResponse, $matches);
foreach ($matches[1] as $item) {
$cookie = explode("=", $item);
$cookies = array_merge($cookies, [$cookie[0] => $cookie[1]]);
$rawResponse = substr($rawResponse, $infos['header_size']);
} elseif (!empty($aArgs['delete_header'])) { // Delete header for iparapheur
$body = strstr($rawResponse, '<?xml'); // put the header ahead
$body = explode(PHP_EOL, $rawResponse);
// we remove the 4 starting item of the array (header)
for ($i=0; $i < 5; $i++) {
array_shift($body);
}
// and the last item (footer)
array_pop($body);
$body = join('', $body);
}
$pattern = '/--uuid:[0-9a-f-]+--/'; // And also the footer
$rawResponse = preg_replace($pattern, '', $body);
LogsController::add([
'isTech' => true,
'moduleId' => 'curl',
'level' => 'DEBUG',
'tableName' => '',
'recordId' => '',
'eventType' => 'Exec Curl : ' . $aArgs['url'],
'eventId' => $rawResponse
]);
if (!empty($error)) {
LogsController::add([
'isTech' => true,
'moduleId' => 'curl',
'level' => 'ERROR',
'tableName' => '',
'recordId' => '',
'eventType' => 'Error Exec Curl : ' . $error,
'eventId' => $rawResponse
]);
}
return ['response' => simplexml_load_string($rawResponse), 'infos' => $infos, 'cookies' => $cookies, 'raw' => $rawResponse, 'error' => $error];
public static function execSimple(array $args)
{
ValidatorModel::notEmpty($args, ['url', 'method']);
ValidatorModel::stringType($args, ['url', 'method']);
ValidatorModel::arrayType($args, ['headers', 'queryParams', 'basicAuth', 'bearerAuth']);
Guillaume Heurtier
committed
ValidatorModel::boolType($args, ['isXml']);
Guillaume Heurtier
committed
$args['isXml'] = $args['isXml'] ?? false;
$opts = [CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => true, CURLOPT_SSL_VERIFYPEER => false];
//Headers
if (!empty($args['headers'])) {
$opts[CURLOPT_HTTPHEADER] = $args['headers'];
}
//Auth
if (!empty($args['basicAuth'])) {
$opts[CURLOPT_HTTPHEADER][] = 'Authorization: Basic ' . base64_encode($args['basicAuth']['user']. ':' .$args['basicAuth']['password']);
}
if (!empty($args['bearerAuth'])) {
$opts[CURLOPT_HTTPHEADER][] = 'Authorization: Bearer ' . $args['bearerAuth']['token'];
}
if (!empty($args['queryParams'])) {
$args['url'] .= '?';
$i = 0;
foreach ($args['queryParams'] as $queryKey => $queryParam) {
if ($i > 0) {
$args['url'] .= '&';
}
$args['url'] .= "{$queryKey}={$queryParam}";
++$i;
}
}
$opts[CURLOPT_POSTFIELDS] = $args['body'];
//MultipartBody
if (!empty($args['multipartBody'])) {
$boundary = uniqid();
$postData = CurlModel::createMultipartFormData(['boundary' => $boundary, 'body' => $args['multipartBody']]);
$opts[CURLOPT_HTTPHEADER][] = "Content-Type: multipart/form-data; boundary=-------------{$boundary}";
$opts[CURLOPT_POSTFIELDS] = $postData;
}
//Method
} elseif ($args['method'] == 'PUT' || $args['method'] == 'PATCH' || $args['method'] == 'DELETE') {
$opts[CURLOPT_CUSTOMREQUEST] = $args['method'];
}
$curl = curl_init();
curl_setopt_array($curl, $opts);
$rawResponse = curl_exec($curl);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$headers = substr($rawResponse, 0, $headerSize);
$headers = explode("\r\n", $headers);
$response = substr($rawResponse, $headerSize);
if (empty($args['noLogs'])) {
LogsController::add([
'isTech' => true,
'moduleId' => 'curl',
'level' => 'DEBUG',
'tableName' => 'curl',
'recordId' => 'execSimple',
'eventType' => "Url : {$args['url']} HttpCode : {$code} Errors : {$errors}",
'eventId' => "Response : {$response}"
]);
}
Guillaume Heurtier
committed
if ($args['isXml']) {
$response = simplexml_load_string($response);
Guillaume Heurtier
committed
} else {
$response = json_decode($response, true);
}
return ['code' => $code, 'headers' => $headers, 'response' => $response, 'errors' => $errors];
private static function createMultipartFormData(array $args)
{
ValidatorModel::notEmpty($args, ['boundary', 'body']);
ValidatorModel::stringType($args, ['boundary']);
ValidatorModel::arrayType($args, ['body']);
$delimiter = "-------------{$args['boundary']}";
$postData = '';
foreach ($args['body'] as $key => $value) {
$postData .= "--{$delimiter}\r\n";
if (is_array($value) && $value['isFile']) {
$postData .= "Content-Disposition: form-data; name=\"{$key}\"; filename=\"{$value['filename']}\"\r\n";
$postData .= "\r\n{$value['content']}\r\n";
} else {
$postData .= "Content-Disposition: form-data; name=\"{$key}\"\r\n";
$postData .= "\r\n{$value}\r\n";
}
public static function makeCurlFile(array $aArgs)
{
ValidatorModel::notEmpty($aArgs, ['path']);
ValidatorModel::stringType($aArgs, ['path']);
$mime = mime_content_type($aArgs['path']);
$info = pathinfo($aArgs['path']);
$name = $info['basename'];
$output = new \CURLFile($aArgs['path'], $mime, $name);
return $output;
}