Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php/*** An Object Oriented interface to PHP's cURL extension** PHP version 5.1.0+** Copyright (c) 2007, The PEAR Group** All rights reserved.** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions are met:** - Redistributions of source code must retain the above copyright notice,* this list of conditions and the following disclaimer.* - Redistributions in binary form must reproduce the above copyright notice,* this list of conditions and the following disclaimer in the documentation* and/or other materials provided with the distribution.* - Neither the name of the The PEAR Group nor the names of its contributors* may be used to endorse or promote products derived from this software* without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE* POSSIBILITY OF SUCH DAMAGE.** @category Net* @package Net_Curl* @author David Costa <gurugeek@php.net>* @author Sterling Hughes <sterling@php.net>* @author Joe Stump <joe@joestump.net>* @author Philippe Jausions <jausions@php.net>* @copyright 1997-2008 The PHP Group* @license http://www.opensource.org/licenses/bsd-license.php New BSD License* @version CVS: $Revision: 1.15 $* @link http://pear.php.net/package/Net_Curl*//*** Include PEAR package for error handling*/require_once 'PEAR.php';/*** Object-oriented implementation of the Curl extension** @category Net* @package Net_Curl* @author David Costa <gurugeek@php.net>* @author Sterling Hughes <sterling@php.net>* @author Joe Stump <joe@joestump.net>* @author Philippe Jausions <jausions@php.net>* @license http://www.opensource.org/licenses/bsd-license.php New BSD License* @link http://pear.php.net/package/Net_Curl*/class Net_Curl{// {{{ Public Properties/*** The URL for cURL to work with** @var string $url* @access public*/var $url;/*** The Username for standard HTTP Authentication** @var string $username* @access public*/var $username = '';/*** The Password for standard HTTP Authentication** @var string $password* @access public*/var $password = '';/*** The SSL version for the transfer** @var integer $sslVersion* @access public*/var $sslVersion;/*** The filename of the SSL certificate** @var string $sslCert* @access public*/var $sslCert;/*** The password corresponding to the certificate* in the $sslCert property** @var string $sslCertPasswd* @access public*/var $sslCertPasswd;/*** User Agent string when making an HTTP request** @var string $userAgent* @access public*/var $userAgent;/*** Whether or not to include the header in the results* of the CURL transfer** @var boolean $header*/var $header = false;/*** Whether or not to output debug information while executing a* curl transfer** @var boolean $verbose* @access public*/var $verbose = false;/*** Whether or not to display a progress meter for the current transfer** @var boolean $progress* @access public*/var $progress = false;/*** Whether or not to suppress error messages** @var boolean $mute* @access public*/var $mute = false;/*** Whether or not to follow HTTP Location headers.** @var boolean $followLocation* @access public*/var $followLocation = true;/*** Whether or not to follow HTTP Location headers.** @var boolean $follow_location* @access public* @deprecated*/var $follow_location = false;/*** Time allowed for current transfer, in seconds. 0 means no limit** @var int $timeout* @access public*/var $timeout = 0;/*** Whether or not to return the results of the* current transfer** @var boolean $returnTransfer* @access public*/var $returnTransfer = true;/*** Whether or not to return the results of the* current transfer** @var boolean $return_transfer* @access public* @deprecated*/var $return_transfer = false;/*** The type of transfer to perform (ie. 'POST', 'GET', 'PUT', etc)** @var string $type* @access public*/var $type;/*** The file to upload (PUT, or FTP methods)** @var string $file* @access public*/var $file;/*** The file size of the file pointed to by the $file* property** @var integer $fileSize* @access public*/var $fileSize;/*** The file size of the file pointed to by the $file* property** @var integer $file_size* @access public* @deprecated*/var $file_size = false;/*** The cookies to send to the remote site** @var array $cookies* @access public*/var $cookies = array();/*** Additional HTTP headers to send to the remote site** @var array $httpHeaders* @access public*/var $httpHeaders = null;/*** Additional HTTP headers to send to the remote site** @var array $http_headers* @access public* @deprecated*/var $http_headers = false;/*** The fields to send in a 'POST' request** @var array $fields* @access public*/var $fields;/*** The proxy server to go through** @var string $proxy* @access public*/var $proxy;/*** The username for the Proxy server** @var string $proxyUser* @access public*/var $proxyUser;/*** The password for the Proxy server** @var string $proxyPassword* @access public*/var $proxyPassword;/*** $verifyPeer** FALSE to stop CURL from verifying the peer's certificate.* Alternate certificates to verify against can be specified* with the CURLOPT_CAINFO option or a certificate directory* can be specified with the CURLOPT_CAPATH option.* CURLOPT_SSL_VERIFYHOST may also need to be TRUE or FALSE* if CURLOPT_SSL_VERIFYPEER is disabled (it defaults to 2).** @var boolean $verifyPeer* @access public*/var $verifyPeer = true;/*** $verifyHost** 0 : to stop CURL from verifying the host's certificate.* 1 : to check the existence of a common name in the SSL peer certificate.* 2 : to check the existence of a common name and also verify that it* matches the hostname provided.** @var bool $verifyHost* @access public*/var $verifyHost = 2;/*** $caInfo** Set value for CURLOPT_CAINFO. The name of a file holding one or more* certificates to verify the peer with. This only makes sense when used* in combination with CURLOPT_SSL_VERIFYPEER. curl-ca-bundle.crt is* avaible on the Curl website http://curl.haxx.se/ for download inside* the packages.** @var string $caInfo* @access public*/var $caInfo = '';/*** $caPath** Set value for CURLOPT_CAPATH. A directory that holds multiple CA* certificates. Use this option alongside CURLOPT_SSL_VERIFYPEER.** @var string $caPath* @access public*/var $caPath;// }}}// {{{ Private Properties/*** The current curl handle** @var resource $_ch* @access private* @see Net_Curl::create()*/var $_ch = null;/*** The file upload resource** The CURLOPT_INFILE requires a file resource and not just a file name.* This is used by execute to open the file.** @var resource $_fp* @access private* @see Net_Curl::execute()*/var $_fp = null;// }}}// {{{ __construct($url = '', $userAgent = '')/*** The Net_Curl PHP 5.x constructor, called when a new Net_Curl object* is initialized (also called via 4.x constructor)** @param string $url The URL to fetch (can be set using the $url* property as well)* @param string $userAgent The userAgent string (can be set using the* $userAgent property as well)** @access public* @author Joe Stump <joe@joestump.net>* @return void*/function __construct($url = '', $userAgent = ''){if (is_string($url) && strlen($url)) {$this->url = $url;}if (is_string($userAgent) && strlen($userAgent)) {$this->userAgent = $userAgent;}}// }}}// {{{ Net_Curl($url = '', $userAgent = '')/*** Net_Curl** PHP 4.x constructor.** @param string $url The URL to fetch (can be set using the $url* property as well)* @param string $userAgent The userAgent string (can be set using the* $userAgent property as well)** @access public* @return void*/function Net_Curl($url = '', $userAgent = ''){$this->__construct($url, $userAgent);}// }}}// {{{ execute()/*** Executes a prepared CURL transfer** Run this function to execute your cURL request. If all goes well you* should get a string (the output from the remote host regarding your* request) or true (if you choose to output directly to the browser). If* something fails then PEAR_Error is returned.** <code>* <?php* require_once 'Net/Curl.php';** $curl = new Net_Curl('http://www.example.com');* $curl->fields = array('foo' => '1', 'bar' => 'apple');* $result = $curl->execute();* if (!PEAR::isError($result)) {* echo $result;* }* ?>* </code>** @access public* @author Sterling Hughes <sterling@php.net>* @author Joe Stump <joe@joestump.net>* @return PEAR_Error on failure, true/result on success* @since PHP 4.0.5*/function execute(){// Create cURL handle if it hasn't already been createdif (!is_resource($this->_ch)) {$result = $this->create();if (PEAR::isError($result)) {return $result;}}// Map the deprecated variables and throw a bunch of errors$this->_mapDeprecatedVariables();// Default return value is true.$ret = true;// Basic stuff$ret = curl_setopt($this->_ch, CURLOPT_URL, $this->url);$ret = curl_setopt($this->_ch, CURLOPT_HEADER, $this->header);// Whether or not to return the transfer contentsif ($this->returnTransfer === true || $this->mute === true) {$ret = curl_setopt($this->_ch, CURLOPT_RETURNTRANSFER, true);}// HTTP Authenticationif ($this->username != '') {$ret = curl_setopt($this->_ch,CURLOPT_USERPWD,$this->username . ':' . $this->password);}// SSL Checksif (isset($this->sslVersion)) {$ret = curl_setopt($this->_ch,CURLOPT_SSLVERSION,$this->sslVersion);}if (isset($this->sslCert)) {$ret = curl_setopt($this->_ch, CURLOPT_SSLCERT, $this->sslCert);}if (isset($this->sslCertPasswd)) {$ret = curl_setopt($this->_ch,CURLOPT_SSLCERTPASSWD,$this->sslCertPasswd);}// Proxy Related checksif (isset($this->proxy)) {$ret = curl_setopt($this->_ch, CURLOPT_PROXY, $this->proxy);}if (isset($this->proxyUser) || isset($this->proxyPassword)) {$ret = curl_setopt($this->_ch,CURLOPT_PROXYUSERPWD,$this->proxyUser . ':' . $this->proxyPassword);}if (is_bool($this->verifyPeer)) {if (!$this->setOption(CURLOPT_SSL_VERIFYPEER, $this->verifyPeer)) {return PEAR::raiseError('Error setting CURLOPT_SSL_VERIFYPEER');}}if (is_numeric($this->verifyHost) && $this->verifyHost >= 0 &&$this->verifyHost <= 2) {if (!$this->setOption(CURLOPT_SSL_VERIFYHOST, $this->verifyHost)) {return PEAR::raiseError('Error setting CURLOPT_SSL_VERIFYPEER');}}if (is_bool($this->verifyPeer) && $this->verifyPeer == true) {if (isset($this->caInfo) && strlen($this->caInfo)) {if (file_exists($this->caInfo)) {if (!$this->setOption(CURLOPT_CAINFO, $this->caInfo)) {return PEAR::raiseError('Error setting CURLOPT_CAINFO');}} else {return PEAR::raiseError('Could not find CA info: '.$this->caInfo);}}if (isset($this->caPath) && is_string($this->caPath)) {if (!$this->setOption(CURLOPT_CAPATH, $this->caPath)) {return PEAR::raiseError('Error setting CURLOPT_CAPATH');}}}// Transfer typeif (isset($this->type)) {switch (strtolower($this->type)) {case 'post':$ret = curl_setopt($this->_ch, CURLOPT_POST, true);break;case 'put':$ret = curl_setopt($this->_ch, CURLOPT_PUT, true);break;}}// Transfer upload, etc. relatedif (isset($this->file)) {if (!file_exists($this->file)) {return PEAR::raiseError('File does not exist: '.$this->file);}$this->_fp = fopen($this->file, 'r');if (!is_resource($this->_fp)) {return PEAR::raiseError('Could not open file: '.$this->file);}if (!isset($this->fileSize)) {$this->fileSize = filesize($this->file);}$ret = curl_setopt($this->_ch, CURLOPT_INFILE, $this->_fp);$ret = curl_setopt($this->_ch, CURLOPT_INFILESIZE, $this->fileSize);$ret = curl_setopt($this->_ch, CURLOPT_UPLOAD, true);}if (isset($this->fields)) {$sets = null;if (!isset($this->type)) {$this->type = 'post';$ret = curl_setopt($this->_ch, CURLOPT_POST, true);}// If fields is an array then turn it into a string. Sometimes// cURL doesn't like fields as an array.// Exception: if a value is prefixed with "@" and the rest of the// value resolves to an existing file, then pass// the values as the original array.if (is_array($this->fields)) {$sets = array();foreach ($this->fields as $key => $val) {if (strlen($val) > 1 && $val{0} == '@') {$file = substr($val, 1);if (is_file($file) && is_readable($file)) {$sets = null;break;}}$sets[] = urlencode($key) . '=' . urlencode($val);}}if (!is_null($sets)) {$fields = implode('&', $sets);} else {$fields = $this->fields;}$ret = curl_setopt($this->_ch, CURLOPT_POSTFIELDS, $fields);}// Error relatedif ($this->progress === true) {$ret = curl_setopt($this->_ch, CURLOPT_PROGRESS, true);}if ($this->verbose === true) {$ret = curl_setopt($this->_ch, CURLOPT_VERBOSE, true);}// If a Location: header is passed then follow it$ret = curl_setopt($this->_ch,CURLOPT_FOLLOWLOCATION,$this->followLocation);// If a timeout is set and is greater then zero then set itif (is_numeric($this->timeout) && $this->timeout > 0) {$ret = curl_setopt($this->_ch, CURLOPT_TIMEOUT, $this->timeout);}if (isset($this->userAgent)) {$ret = curl_setopt($this->_ch, CURLOPT_USERAGENT, $this->userAgent);}// Cookiesif (is_array($this->cookies) && count($this->cookies)) {$cookieData = '';foreach ($this->cookies as $name => $value) {$cookieData .= $name . '=' . $value . ';';}$ret = curl_setopt($this->_ch, CURLOPT_COOKIE, $cookieData);}// Other HTTP headersif ($this->httpHeaders !== null) {if (is_array($this->httpHeaders)) {$ret = curl_setopt($this->_ch,CURLOPT_HTTPHEADER,$this->httpHeaders);} else {return PEAR::raiseError('Net_Curl::$httpHeaders must be an array');}}$ret = curl_exec($this->_ch);// Close the file before we return anythingif (is_resource($this->_fp)) {fclose($this->_fp);}if (curl_errno($this->_ch)) {return PEAR::raiseError(curl_error($this->_ch), curl_errno($this->_ch));}// Check to make sure we get a 2XX/3XX code and not a 404 or something.$info = $this->getInfo();if (!isset($info['http_code'])) {return PEAR::raiseError('Unknown or invalid HTTP response');} else {$type = substr($info['http_code'], 0, 1);if ($type != 2 && $type != 3) {return PEAR::raiseError('Unexpected HTTP code: ' .$info['http_code']);}}return $ret;}// }}}// {{{ setOption($option, $value)/*** Sets an option for your cURL session. Please note that the cURL handler* is NOT created before execute(). This is for error checking purposes.* You should use setOption() in the following manner:** <code>* <?php** require_once 'Net/Curl.php';* $curl = new Net_Curl('http://www.example.com');* $check = $curl->create();* if (!PEAR::isError($check)) {* $curl->setOption(CURLOPT_FOO, 'bar');* $result = $curl->execute();* if (!PEAR::isError($result)) {* echo $result;* }* }** ?>* </code>** @param int $option cURL constant (ie. CURLOPT_URL)* @param mixed $value The option's value** @author Joe Stump <joe@joestump.net>* @access public* @return boolean*/function setOption($option, $value){if (is_resource($this->_ch)) {return curl_setopt($this->_ch, $option, $value);}return false;}// }}}// {{{ getInfo()/*** Returns the info from the cURL session. PEAR_Error if you try and run* this before you execute the session.** @author Joe Stump <joe@joestump.net>* @access public* @return mixed PEAR_Error if there is no resource, info on success*/function getInfo(){if (is_resource($this->_ch)) {return curl_getinfo($this->_ch);}return PEAR::isError('cURL handler does not exist!');}// }}}// {{{ create()/*** Creates a cURL resource. If curl_init() doesn't exist or we could not* create a resource it will error out.** @author Joe Stump <joe@joestump.net>* @return boolean TRUE on success, PEAR_Error on failure*/function create(){if (!PEAR::loadExtension('curl')) {return PEAR::raiseError('CURL extension is not available');}if (!function_exists('curl_init')) {return PEAR::raiseError('Function curl_init() not found');}$this->_ch = curl_init();if (!is_resource($this->_ch)) {return PEAR::raiseError('Could not initialize cURL handler');}return true;}// }}}// {{{ verboseAll()/*** Sets verbose output** Turns on super debugging mode by not suppressing errors, turning on* verbose mode, showing headers and displaying progress.** @access public* @author David Costa <gurugeek@php.net>* @return void*/function verboseAll(){$this->verbose = true;$this->mute = false;$this->header = true;$this->progress = true;}// }}}// {{{ verbose_all()/*** Sets verbose output** @access public* @author David Costa <gurugeek@php.net>* @return void* @deprecated*/function verbose_all(){$this->verboseAll();PEAR::raiseError('Net_Curl::verbose_all() is deprecated! Please use Net_Curl::verboseAll()'." <br />\n", null, PEAR_ERROR_PRINT);}// }}}// {{{ close()/*** Closes the curl transfer and finishes the object (kinda ;)** @access public* @author Sterling Hughes <sterling@php.net>* @return void* @since PHP 4.0.5*/function close(){if (is_resource($this->_ch)) {curl_close($this->_ch);}}// }}}// {{{ _mapDeprecatedVariables()/*** Maps deprecated variables into the appropriate places. It also throws* the necessary notices.** @author Joe Stump <joe@joestump.net>* @access private* @return void*/function _mapDeprecatedVariables(){$bad = array();if ($this->follow_location !== false) {if ($this->follow_location > 0) {$this->followLocation = true;} else {$this->followLocation = false;}$bad[] = array('follow_location', 'followLocation');}if ($this->return_transfer !== false) {if ($this->return_transfer > 0) {$this->returnTransfer = true;} else {$this->returnTransfer = false;}$bad[] = array('return_transfer', 'returnTransfer');}if ($this->file_size !== false) {$this->fileSize = $this->file_size;$bad[] = array('file_size', 'fileSize');}if ($this->http_headers !== false) {$this->httpHeaders = $this->http_headers;$bad[] = array('http_headers', 'httpHeaders');}foreach ($bad as $map) {PEAR::raiseError('Net_Curl::$'. $map[0]. ' is deprecated! Please use Net_Curl::$'.$map[1]." instead! <br />\n", null, PEAR_ERROR_PRINT);}}// }}}// {{{ __destruct()/*** PHP 5.x destructor.** Runs Net_Curl::close() to make sure we close our cURL connection.** @author Joe Stump <joe@joestump.net>* @see Net_Curl::close()*/function __destruct(){$this->close();}// }}}}?>