| 
									
										
										
										
											2011-11-20 03:41:44 +08:00
										 |  |  | <?php defined('BASEPATH') OR exit('No direct script access allowed'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * CodeIgniter Curl Class | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Work with remote servers via cURL much easier than using the native PHP bindings. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @package        	CodeIgniter | 
					
						
							|  |  |  |  * @subpackage    	Libraries | 
					
						
							|  |  |  |  * @category    	Libraries | 
					
						
							|  |  |  |  * @author        	Philip Sturgeon | 
					
						
							|  |  |  |  * @license         http://philsturgeon.co.uk/code/dbad-license | 
					
						
							|  |  |  |  * @link			http://getsparks.org/packages/curl/show | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class Curl { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private $_ci;				// CodeIgniter instance
 | 
					
						
							|  |  |  | 	private $response = '';		  // Contains the cURL response for debug
 | 
					
						
							|  |  |  | 	private $session;		   // Contains the cURL handler for a session
 | 
					
						
							|  |  |  | 	private $url;			   // URL of the session
 | 
					
						
							|  |  |  | 	private $options = array(); // Populates curl_setopt_array
 | 
					
						
							|  |  |  | 	private $headers = array(); // Populates extra HTTP headers
 | 
					
						
							|  |  |  | 	public $error_code;		 // Error code returned as an int
 | 
					
						
							|  |  |  | 	public $error_string;	   // Error message returned as a string
 | 
					
						
							|  |  |  | 	public $info;			   // Returned after request (elapsed time, etc)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function __construct($url = '') | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$this->_ci = & get_instance(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ( ! $this->is_enabled()) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			log_message('error', 'cURL Class - PHP was not built with cURL enabled. Rebuild PHP with --with-curl to use cURL.'); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$url AND $this->create($url); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function __call($method, $arguments) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (in_array($method, array('simple_get', 'simple_post', 'simple_put', 'simple_delete'))) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			// Take off the "simple_" and past get/post/put/delete to _simple_call
 | 
					
						
							|  |  |  | 			$verb = str_replace('simple_', '', $method); | 
					
						
							|  |  |  | 			array_unshift($arguments, $verb); | 
					
						
							|  |  |  | 			return call_user_func_array(array($this, '_simple_call'), $arguments); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* ================================================================================= | 
					
						
							|  |  |  | 	 * SIMPLE METHODS | 
					
						
							|  |  |  | 	 * Using these methods you can make a quick and easy cURL call with one line. | 
					
						
							|  |  |  | 	 * ================================================================================= */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function _simple_call($method, $url, $params = array(), $options = array()) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// Get acts differently, as it doesnt accept parameters in the same way
 | 
					
						
							|  |  |  | 		if ($method === 'get') | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			// If a URL is provided, create new session
 | 
					
						
							|  |  |  | 			$this->create($url.($params ? '?'.http_build_query($params) : '')); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			// If a URL is provided, create new session
 | 
					
						
							|  |  |  | 			$this->create($url); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			$this->{$method}($params); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Add in the specific options provided
 | 
					
						
							|  |  |  | 		$this->options($options); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return $this->execute(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function simple_ftp_get($url, $file_path, $username = '', $password = '') | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// If there is no ftp:// or any protocol entered, add ftp://
 | 
					
						
							|  |  |  | 		if ( ! preg_match('!^(ftp|sftp)://! i', $url)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$url = 'ftp://' . $url; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Use an FTP login
 | 
					
						
							|  |  |  | 		if ($username != '') | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$auth_string = $username; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if ($password != '') | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				$auth_string .= ':' . $password; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// Add the user auth string after the protocol
 | 
					
						
							|  |  |  | 			$url = str_replace('://', '://' . $auth_string . '@', $url); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Add the filepath
 | 
					
						
							|  |  |  | 		$url .= $file_path; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->option(CURLOPT_BINARYTRANSFER, TRUE); | 
					
						
							|  |  |  | 		$this->option(CURLOPT_VERBOSE, TRUE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return $this->execute(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* ================================================================================= | 
					
						
							|  |  |  | 	 * ADVANCED METHODS | 
					
						
							|  |  |  | 	 * Use these methods to build up more complex queries | 
					
						
							|  |  |  | 	 * ================================================================================= */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function post($params = array(), $options = array()) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// If its an array (instead of a query string) then format it correctly
 | 
					
						
							|  |  |  | 		if (is_array($params)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$params = http_build_query($params, NULL, '&'); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Add in the specific options provided
 | 
					
						
							|  |  |  | 		$this->options($options); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->http_method('post'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->option(CURLOPT_POST, TRUE); | 
					
						
							|  |  |  | 		$this->option(CURLOPT_POSTFIELDS, $params); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function put($params = array(), $options = array()) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// If its an array (instead of a query string) then format it correctly
 | 
					
						
							|  |  |  | 		if (is_array($params)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$params = http_build_query($params, NULL, '&'); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Add in the specific options provided
 | 
					
						
							|  |  |  | 		$this->options($options); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->http_method('put'); | 
					
						
							|  |  |  | 		$this->option(CURLOPT_POSTFIELDS, $params); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Override method, I think this overrides $_POST with PUT data but... we'll see eh?
 | 
					
						
							|  |  |  | 		$this->option(CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT')); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function delete($params, $options = array()) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// If its an array (instead of a query string) then format it correctly
 | 
					
						
							|  |  |  | 		if (is_array($params)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$params = http_build_query($params, NULL, '&'); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Add in the specific options provided
 | 
					
						
							|  |  |  | 		$this->options($options); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->http_method('delete'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->option(CURLOPT_POSTFIELDS, $params); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function set_cookies($params = array()) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (is_array($params)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$params = http_build_query($params, NULL, '&'); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->option(CURLOPT_COOKIE, $params); | 
					
						
							|  |  |  | 		return $this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function http_header($header, $content = NULL) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$this->headers[] = $content ? $header . ': ' . $content : $header; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function http_method($method) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$this->options[CURLOPT_CUSTOMREQUEST] = strtoupper($method); | 
					
						
							|  |  |  | 		return $this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function http_login($username = '', $password = '', $type = 'any') | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$this->option(CURLOPT_HTTPAUTH, constant('CURLAUTH_' . strtoupper($type))); | 
					
						
							|  |  |  | 		$this->option(CURLOPT_USERPWD, $username . ':' . $password); | 
					
						
							|  |  |  | 		return $this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function proxy($url = '', $port = 80) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$this->option(CURLOPT_HTTPPROXYTUNNEL, TRUE); | 
					
						
							|  |  |  | 		$this->option(CURLOPT_PROXY, $url . ':' . $port); | 
					
						
							|  |  |  | 		return $this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function proxy_login($username = '', $password = '') | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$this->option(CURLOPT_PROXYUSERPWD, $username . ':' . $password); | 
					
						
							|  |  |  | 		return $this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function ssl($verify_peer = TRUE, $verify_host = 2, $path_to_cert = NULL) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if ($verify_peer) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$this->option(CURLOPT_SSL_VERIFYPEER, TRUE); | 
					
						
							|  |  |  | 			$this->option(CURLOPT_SSL_VERIFYHOST, $verify_host); | 
					
						
							|  |  |  | 			$this->option(CURLOPT_CAINFO, $path_to_cert); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$this->option(CURLOPT_SSL_VERIFYPEER, FALSE); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return $this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function options($options = array()) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// Merge options in with the rest - done as array_merge() does not overwrite numeric keys
 | 
					
						
							|  |  |  | 		foreach ($options as $option_code => $option_value) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$this->option($option_code, $option_value); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Set all options provided
 | 
					
						
							|  |  |  | 		curl_setopt_array($this->session, $this->options); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return $this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function option($code, $value) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (is_string($code) && !is_numeric($code)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$code = constant('CURLOPT_' . strtoupper($code)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->options[$code] = $value; | 
					
						
							|  |  |  | 		return $this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Start a session from a URL
 | 
					
						
							|  |  |  | 	public function create($url) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// If no a protocol in URL, assume its a CI link
 | 
					
						
							|  |  |  | 		if ( ! preg_match('!^\w+://! i', $url)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$this->_ci->load->helper('url'); | 
					
						
							|  |  |  | 			$url = site_url($url); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->url = $url; | 
					
						
							|  |  |  | 		$this->session = curl_init($this->url); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return $this; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// End a session and return the results
 | 
					
						
							|  |  |  | 	public function execute() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// Set two default options, and merge any extra ones in
 | 
					
						
							|  |  |  | 		if ( ! isset($this->options[CURLOPT_TIMEOUT])) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$this->options[CURLOPT_TIMEOUT] = 30; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if ( ! isset($this->options[CURLOPT_RETURNTRANSFER])) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$this->options[CURLOPT_RETURNTRANSFER] = TRUE; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if ( ! isset($this->options[CURLOPT_FAILONERROR])) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$this->options[CURLOPT_FAILONERROR] = TRUE; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Only set follow location if not running securely
 | 
					
						
							|  |  |  | 		if ( ! ini_get('safe_mode') && !ini_get('open_basedir')) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			// Ok, follow location is not set already so lets set it to true
 | 
					
						
							|  |  |  | 			if ( ! isset($this->options[CURLOPT_FOLLOWLOCATION])) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				$this->options[CURLOPT_FOLLOWLOCATION] = TRUE; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ( ! empty($this->headers)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$this->option(CURLOPT_HTTPHEADER, $this->headers); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->options(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Execute the request & and hide all output
 | 
					
						
							|  |  |  | 		$this->response = curl_exec($this->session); | 
					
						
							|  |  |  | 		$this->info = curl_getinfo($this->session); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Request failed
 | 
					
						
							|  |  |  | 		if ($this->response === FALSE) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			$this->error_code = curl_errno($this->session); | 
					
						
							|  |  |  | 			$this->error_string = curl_error($this->session); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			curl_close($this->session); | 
					
						
							|  |  |  | 			$this->set_defaults(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return FALSE; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Request successful
 | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			curl_close($this->session); | 
					
						
							|  |  |  | 			$response = $this->response; | 
					
						
							|  |  |  | 			$this->set_defaults(); | 
					
						
							|  |  |  | 			return $response; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function is_enabled() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return function_exists('curl_init'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function debug() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		echo "=============================================<br/>\n"; | 
					
						
							|  |  |  | 		echo "<h2>CURL Test</h2>\n"; | 
					
						
							|  |  |  | 		echo "=============================================<br/>\n"; | 
					
						
							|  |  |  | 		echo "<h3>Response</h3>\n"; | 
					
						
							|  |  |  | 		echo "<code>" . nl2br(htmlentities($this->response)) . "</code><br/>\n\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ($this->error_string) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			echo "=============================================<br/>\n"; | 
					
						
							|  |  |  | 			echo "<h3>Errors</h3>"; | 
					
						
							|  |  |  | 			echo "<strong>Code:</strong> " . $this->error_code . "<br/>\n"; | 
					
						
							|  |  |  | 			echo "<strong>Message:</strong> " . $this->error_string . "<br/>\n"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		echo "=============================================<br/>\n"; | 
					
						
							|  |  |  | 		echo "<h3>Info</h3>"; | 
					
						
							|  |  |  | 		echo "<pre>"; | 
					
						
							|  |  |  | 		print_r($this->info); | 
					
						
							|  |  |  | 		echo "</pre>"; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function debug_request() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return array( | 
					
						
							|  |  |  | 			'url' => $this->url | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private function set_defaults() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$this->response = ''; | 
					
						
							|  |  |  | 		$this->headers = array(); | 
					
						
							|  |  |  | 		$this->options = array(); | 
					
						
							|  |  |  | 		$this->error_code = NULL; | 
					
						
							|  |  |  | 		$this->error_string = ''; | 
					
						
							|  |  |  | 		$this->session = NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* End of file Curl.php */ | 
					
						
							| 
									
										
										
										
											2023-11-16 16:08:43 +08:00
										 |  |  | /* Location: ./application/libraries/Curl.php */ |