Last active
July 11, 2023 04:08
-
-
Save nkmswot/3d076fd34b40cc91d17071c4258a452f to your computer and use it in GitHub Desktop.
PHP cURL Class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* PHP Curl Class | |
* | |
* Work with remote servers via cURL. | |
* | |
* @subpackage Libraries | |
* @category Libraries | |
*/ | |
class Curl { | |
protected $response = ''; // Contains the cURL response for debug | |
protected $session; // Contains the cURL handler for a session | |
protected $url; // URL of the session | |
protected $options = array(); // Populates curl_setopt_array | |
protected $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 = '') | |
{ | |
// Log::write('debug', 'cURL Class Initialized'); | |
if ( ! $this->is_enabled()) | |
{ | |
// Log::write('error', 'cURL Class - PHP was not built with cURL enabled. Rebuild PHP with --with-curl to use cURL.'); | |
} | |
$url AND $this->create($url); | |
} | |
public 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, NULL, '&') : '')); | |
} | |
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; | |
return $this; | |
} | |
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; | |
} | |
//if using SSL | |
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); | |
if (isset($path_to_cert)) { | |
$path_to_cert = realpath($path_to_cert); | |
$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 Laravel link | |
if ( ! preg_match('!^\w+://! i', $url)) | |
{ | |
$url = 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) | |
{ | |
$errno = curl_errno($this->session); | |
$error = curl_error($this->session); | |
curl_close($this->session); | |
$this->set_defaults(); | |
$this->error_code = $errno; | |
$this->error_string = $error; | |
return FALSE; | |
} | |
// Request successful | |
else | |
{ | |
curl_close($this->session); | |
$this->last_response = $this->response; | |
$this->set_defaults(); | |
return $this->last_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->last_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 | |
); | |
} | |
public 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 */ | |
/* Location: ./libraries/Curl.php */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment