Skip to content
Snippets Groups Projects
CurlModel.php 11.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?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
     */
    
    
    Damien's avatar
    Damien committed
    namespace SrcCore\models;
    
    Damien's avatar
    Damien committed
    use SrcCore\controllers\LogsController;
    
    
    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) {
    
    Damien's avatar
    Damien committed
                        if (is_object($value)) {
    
    Damien's avatar
    Damien committed
                            $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);
    
            $error = curl_error($curl);
    
            curl_close($curl);
    
    Damien's avatar
    Damien committed
            LogsController::add([
                'isTech'    => true,
                'moduleId'  => 'curl',
                'level'     => 'DEBUG',
                'tableName' => '',
    
                'recordId'  => 'Body : ' . json_encode($bodyData),
                'eventType' => 'Exec Curl : ' . $curlConfig['url'],
    
    Damien's avatar
    Damien committed
                'eventId'   => $rawResponse
            ]);
    
    
            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);
        }
    
    
    Damien's avatar
    Damien committed
        public static function execSOAP(array $aArgs)
        {
    
    Damien's avatar
    Damien committed
            ValidatorModel::notEmpty($aArgs, ['xmlPostString', 'url']);
    
    Damien's avatar
    Damien committed
            ValidatorModel::stringType($aArgs, ['xmlPostString', 'url', 'soapAction']);
    
    Damien's avatar
    Damien committed
            ValidatorModel::arrayType($aArgs, ['options']);
    
    Damien's avatar
    Damien committed
    
            $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
    
    Damien's avatar
    Damien committed
            if (!empty($aArgs['soapAction'])) {
                $opts[CURLOPT_HTTPHEADER][] = "SOAPAction: \"{$aArgs['soapAction']}\"";
            }
    
            if (!empty($aArgs['Cookie'])) {
                $opts[CURLOPT_HTTPHEADER][] = "Cookie:{$aArgs['Cookie']}";
            }
    
    Damien's avatar
    Damien committed
            if (!empty($aArgs['options'])) {
    
    Damien's avatar
    Damien committed
                foreach ($aArgs['options'] as $key => $option) {
                    $opts[$key] = $option;
                }
    
    Damien's avatar
    Damien committed
            $curl = curl_init();
            curl_setopt_array($curl, $opts);
            $rawResponse = curl_exec($curl);
    
            $error = curl_error($curl);
    
            $infos = curl_getinfo($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
    
                if (empty($body)) {
    
                    $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);
    
    Damien's avatar
    Damien committed
            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];
    
    Damien's avatar
    Damien committed
        public static function execSimple(array $args)
        {
            ValidatorModel::notEmpty($args, ['url', 'method']);
    
            ValidatorModel::stringType($args, ['url', 'method']);
    
            ValidatorModel::arrayType($args, ['headers', 'queryParams', 'basicAuth', 'bearerAuth']);
    
            $opts = [CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => true, CURLOPT_SSL_VERIFYPEER => false];
    
    Damien's avatar
    Damien committed
    
            //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'];
            }
    
    
    Damien's avatar
    Damien committed
            //QueryParams
    
    Damien's avatar
    Damien committed
            if (!empty($args['queryParams'])) {
                $args['url'] .= '?';
                $i = 0;
                foreach ($args['queryParams'] as $queryKey => $queryParam) {
                    if ($i > 0) {
                        $args['url'] .= '&';
                    }
                    $args['url'] .= "{$queryKey}={$queryParam}";
                    ++$i;
                }
            }
    
    
    Damien's avatar
    Damien committed
            //Body
    
    Damien's avatar
    Damien committed
            if (!empty($args['body'])) {
    
                $opts[CURLOPT_POSTFIELDS] = $args['body'];
    
    Damien's avatar
    Damien committed
            }
    
    Damien's avatar
    Damien committed
            //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
    
    Damien's avatar
    Damien committed
            if ($args['method'] == 'POST') {
    
    Damien's avatar
    Damien committed
                $opts[CURLOPT_POST] = true;
    
    Damien's avatar
    Damien committed
            } elseif ($args['method'] == 'PUT' || $args['method'] == 'PATCH' || $args['method'] == 'DELETE') {
                $opts[CURLOPT_CUSTOMREQUEST] = $args['method'];
            }
    
    
    Damien's avatar
    Damien committed
            //Url
            $opts[CURLOPT_URL] = $args['url'];
    
    
    Damien's avatar
    Damien committed
            $curl = curl_init();
            curl_setopt_array($curl, $opts);
            $rawResponse = curl_exec($curl);
            $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    
    Damien's avatar
    Damien committed
            $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
    
    Damien's avatar
    Damien committed
            $errors = curl_error($curl);
    
    Damien's avatar
    Damien committed
            curl_close($curl);
    
    
    Damien's avatar
    Damien committed
            $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}"
                ]);
            }
    
                $response = simplexml_load_string($response);
    
            }
    
            return ['code' => $code, 'headers' => $headers, 'response' => $response, 'errors' => $errors];
    
    Damien's avatar
    Damien committed
        }
    
    Damien's avatar
    Damien committed
        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";
                }
    
    Damien's avatar
    Damien committed
            }
    
    Damien's avatar
    Damien committed
            $postData .= "--{$delimiter}--\r\n";
    
    Damien's avatar
    Damien committed
            return $postData;
    
    Damien's avatar
    Damien committed
        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;
        }