debugMode = constOn('DBG_CURL'); } /** * Reset connection settings (not results) after connection was closed * */ function _resetSettings() { $this->timeout = 90; $this->followLocation = false; $this->postData = ''; $this->requestHeaders = Array (); $this->options = Array (); } function setOptions($options_hash) { $this->options = array_merge_recursive2($this->options, $options_hash); } function prepareOptions() { if ($this->followLocation && ((defined('SAFE_MODE') && SAFE_MODE) || ini_get('open_basedir'))) { // this won't work with such restrictions, so turn it off $this->followLocation = false; } $default_options = Array ( // customizable options CURLOPT_FOLLOWLOCATION => $this->followLocation ? 1 : 0, CURLOPT_TIMEOUT => $this->timeout, // hardcoded options CURLOPT_RETURNTRANSFER => 1, CURLOPT_REFERER => PROTOCOL.SERVER_NAME, // don't verify SSL certificates CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_HTTPHEADER => Array ('Expect:'), ); if ( isset($_SERVER['HTTP_USER_AGENT']) ) { $default_options[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT']; } if ($this->requestHeaders) { $default_options[CURLOPT_HTTPHEADER] = $this->prepareHeaders(); } // if we have post data, then POST else use GET method instead if ($this->postData) { $default_options[CURLOPT_POST] = 1; $default_options[CURLOPT_POSTFIELDS] = $this->postData; } // $default_options[CURLOPT_HEADERFUNCTION] = Array(&$this, 'ParseHeader'); $user_options = $this->options; // backup options, that user set directly $this->setOptions($default_options); $this->setOptions($user_options); $this->applyOptions(); } function applyOptions() { foreach ($this->options as $option_name => $option_value) { curl_setopt($this->connectionID, $option_name, $option_value); } } function ParseHeader(&$ch, $header) { $this->responceHeaders[] = $header; return strlen($header); } /** * Sets POST data for next query * * @param mixed $post_data Array or string */ function SetPostData($post_data) { if (is_array($post_data)) { $post_data = $this->Application->HttpQuery->_transformArrays($post_data); $params_str = ''; foreach ($post_data as $key => $value) { $params_str .= $key.'='.urlencode($value).'&'; } $post_data = $params_str; } $this->postData = $post_data; } function SetHeaders($headers) { $this->requestHeaders = array_merge_recursive2($this->requestHeaders, $headers); } function SetHeader($name, $value) { $this->requestHeaders[$name] = $value; } /** * Returns compiled header to be used by curl * * @return Array */ function prepareHeaders() { $ret = Array (); foreach ($this->requestHeaders as $header_name => $header_value) { $ret[] = $header_name.': '.$header_value; } return $ret; } function Send($url, $close_connection = true, $log_status = null) { if (isset($log_status)) { // override debug mode setting $this->debugMode = $log_status; } $this->connectionID = curl_init($url); if ($this->debugMode) { safeDefine('DBG_CURL_LOGFILE', '/curl.log'); $this->logFilePointer = fopen((defined('RESTRICTED') ? RESTRICTED : FULL_PATH) . DBG_CURL_LOGFILE, 'a'); $user_id = $this->Application->RecallVar('user_id'); $data = $_SERVER['REMOTE_ADDR'] . ' - ['.adodb_date('D M d H:i:s Y').'] ' . $_SERVER['REQUEST_URI'] . '; user_id: '.$user_id.'; sid: '.$this->Application->GetSID(); fwrite($this->logFilePointer, "\n\n" . str_repeat('=', strlen($data)) . "\n"); fwrite($this->logFilePointer, $data); fwrite($this->logFilePointer, "\n" . str_repeat('=', strlen($data)) . "\n"); curl_setopt($this->connectionID, CURLOPT_FILE, $this->logFilePointer); curl_setopt($this->connectionID, CURLOPT_VERBOSE, true); curl_setopt($this->connectionID, CURLOPT_STDERR, $this->logFilePointer); //curl_setopt($this->connectionID, CURLOPT_WRITEHEADER, $this->logFilePointer); } $this->responceHeaders = Array (); $this->prepareOptions(); $this->lastRespoce = curl_exec($this->connectionID); $this->Finalize($close_connection); return $this->lastRespoce; } /** * Returns various info about request made * * @param int $info_type * @return mixed * * @see http://www.php.net/manual/ru/function.curl-getinfo.php */ function getInfo($info_type) { return curl_getinfo($this->connectionID, $info_type); } function Finalize($close_connection = true) { $this->lastErrorCode = curl_errno($this->connectionID); $this->lastErrorMsg = curl_error($this->connectionID); $this->lastHTTPCode = curl_getinfo($this->connectionID, CURLINFO_HTTP_CODE); if ($close_connection) { $this->CloseConnection(); } $this->_resetSettings(); } function CloseConnection() { curl_close($this->connectionID); if ($this->debugMode) { // only close log after curl resource has been terminated fwrite($this->logFilePointer, "\n" . 'LastHTTPCode: ' . $this->lastHTTPCode . '; LastError: #' . $this->lastErrorCode . ' (' . $this->lastErrorMsg . ')' . "\n"); fwrite($this->logFilePointer, 'Respoce:' . "\n" . $this->lastRespoce); fclose($this->logFilePointer); } // restore debug mode setting $this->debugMode = constOn('DBG_CURL'); } }