2000-07-16 19:37:33 +00:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2004-01-08 08:18:22 +00:00
| PHP Version 5 |
2000-07-16 19:37:33 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2006-01-01 12:51:34 +00:00
| Copyright ( c ) 1997 - 2006 The PHP Group |
2000-07-16 19:37:33 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2006-01-01 12:51:34 +00:00
| This source file is subject to version 3.01 of the PHP license , |
2000-07-16 19:37:33 +00:00
| that is bundled with this package in the file LICENSE , and is |
2003-06-10 20:04:29 +00:00
| available through the world - wide - web at the following url : |
2006-01-01 12:51:34 +00:00
| http : //www.php.net/license/3_01.txt |
2000-07-16 19:37:33 +00:00
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world - wide - web , please send a note to |
| license @ php . net so we can mail you a copy immediately . |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2001-02-15 16:20:13 +00:00
| Author : Sterling Hughes < sterling @ php . net > |
2000-07-16 19:37:33 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
/* $Id$ */
2003-02-25 07:19:44 +00:00
# define ZEND_INCLUDE_FULL_WINDOWS_HEADERS
2001-05-24 10:07:29 +00:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
2000-07-16 19:37:33 +00:00
# include "php.h"
# if HAVE_CURL
# include <stdio.h>
2000-09-30 03:09:54 +00:00
# include <string.h>
2000-08-15 16:50:14 +00:00
# ifdef PHP_WIN32
2003-02-16 03:48:49 +00:00
# include <winsock2.h>
2000-08-20 08:28:00 +00:00
# include <sys/types.h>
2000-08-15 16:50:14 +00:00
# endif
2000-09-30 03:09:54 +00:00
2000-07-16 19:37:33 +00:00
# include <curl/curl.h>
# include <curl/easy.h>
2000-09-30 03:09:54 +00:00
2004-03-22 18:42:03 +00:00
/* As of curl 7.11.1 this is no longer defined inside curl.h */
# ifndef HttpPost
# define HttpPost curl_httppost
# endif
2005-10-25 14:32:33 +00:00
/* {{{ cruft for thread safe SSL crypto locks */
# if defined(ZTS) && defined(HAVE_CURL_SSL)
2005-10-26 11:33:25 +00:00
# ifdef PHP_WIN32
# define PHP_CURL_NEED_OPENSSL_TSL
# include <openssl / crypto.h>
# else /* !PHP_WIN32 */
# if defined(HAVE_CURL_OPENSSL)
# if defined(HAVE_OPENSSL_CRYPTO_H)
# define PHP_CURL_NEED_OPENSSL_TSL
# include <openssl / crypto.h>
# else
# warning \
" libcurl was compiled with OpenSSL support, but configure could not find " \
" openssl/crypto.h; thus no SSL crypto locking callbacks will be set, which may " \
" cause random crashes on SSL requests "
# endif
# elif defined(HAVE_CURL_GNUTLS)
# if defined(HAVE_GCRYPT_H)
# define PHP_CURL_NEED_GNUTLS_TSL
# include <gcrypt.h>
# else
# warning \
" libcurl was compiled with GnuTLS support, but configure could not find " \
" gcrypt.h; thus no SSL crypto locking callbacks will be set, which may " \
" cause random crashes on SSL requests "
# endif
# else
# warning \
" libcurl was compiled with SSL support, but configure could not determine which " \
" library was used; thus no SSL crypto locking callbacks will be set, which may " \
" cause random crashes on SSL requests "
# endif /* HAVE_CURL_OPENSSL || HAVE_CURL_GNUTLS */
# endif /* PHP_WIN32 */
2005-10-25 14:32:33 +00:00
# endif /* ZTS && HAVE_CURL_SSL */
/* }}} */
2001-08-02 19:28:33 +00:00
# define SMART_STR_PREALLOC 4096
# include "ext/standard/php_smart_str.h"
2000-07-16 19:37:33 +00:00
# include "ext/standard/info.h"
2000-11-23 15:57:24 +00:00
# include "ext/standard/file.h"
2005-03-14 09:02:23 +00:00
# include "ext/standard/url.h"
2000-07-16 19:37:33 +00:00
# include "php_curl.h"
2005-07-15 16:47:48 +00:00
int le_curl ;
int le_curl_multi_handle ;
2006-01-26 13:23:33 +00:00
# ifdef PHP_CURL_NEED_OPENSSL_TSL /* {{{ */
static MUTEX_T * php_curl_openssl_tsl = NULL ;
static void php_curl_ssl_lock ( int mode , int n , const char * file , int line )
{
if ( mode & CRYPTO_LOCK ) {
tsrm_mutex_lock ( php_curl_openssl_tsl [ n ] ) ;
} else {
tsrm_mutex_unlock ( php_curl_openssl_tsl [ n ] ) ;
}
}
static unsigned long php_curl_ssl_id ( void )
{
return ( unsigned long ) tsrm_thread_id ( ) ;
}
2005-10-25 14:32:33 +00:00
# endif
2006-01-26 13:23:33 +00:00
/* }}} */
# ifdef PHP_CURL_NEED_GNUTLS_TSL /* {{{ */
static int php_curl_ssl_mutex_create ( void * * m )
{
if ( * ( ( MUTEX_T * ) m ) = tsrm_mutex_alloc ( ) ) {
return SUCCESS ;
} else {
return FAILURE ;
}
}
static int php_curl_ssl_mutex_destroy ( void * * m )
{
tsrm_mutex_free ( * ( ( MUTEX_T * ) m ) ) ;
return SUCCESS ;
}
static int php_curl_ssl_mutex_lock ( void * * m )
{
return tsrm_mutex_lock ( * ( ( MUTEX_T * ) m ) ) ;
}
static int php_curl_ssl_mutex_unlock ( void * * m )
{
return tsrm_mutex_unlock ( * ( ( MUTEX_T * ) m ) ) ;
}
static struct gcry_thread_cbs php_curl_gnutls_tsl = {
GCRY_THREAD_OPTION_USER ,
NULL ,
php_curl_ssl_mutex_create ,
php_curl_ssl_mutex_destroy ,
php_curl_ssl_mutex_lock ,
php_curl_ssl_mutex_unlock
} ;
# endif
/* }}} */
2005-10-25 14:32:33 +00:00
2001-07-31 05:44:11 +00:00
static void _php_curl_close ( zend_rsrc_list_entry * rsrc TSRMLS_DC ) ;
2001-04-30 14:36:19 +00:00
# define SAVE_CURL_ERROR(__handle, __err) (__handle)->err.no = (int) __err;
2000-09-30 03:09:54 +00:00
2002-11-08 17:58:43 +00:00
# define CAAL(s, v) add_assoc_long_ex(return_value, s, sizeof(s), (long) v);
# define CAAD(s, v) add_assoc_double_ex(return_value, s, sizeof(s), (double) v);
# define CAAS(s, v) add_assoc_string_ex(return_value, s, sizeof(s), (char *) v, 1);
# define CAAZ(s, v) add_assoc_zval_ex(return_value, s, sizeof(s), (zval *) v);
2005-03-14 09:02:23 +00:00
# define PHP_CURL_CHECK_OPEN_BASEDIR(str, len) \
2005-10-06 20:47:41 +00:00
if ( ( ( PG ( open_basedir ) & & * PG ( open_basedir ) ) | | PG ( safe_mode ) ) & & \
2005-11-27 20:07:36 +00:00
strncasecmp ( str , " file: " , sizeof ( " file: " ) - 1 ) = = 0 ) \
2005-03-14 09:02:23 +00:00
{ \
php_url * tmp_url ; \
2006-05-21 16:31:57 +00:00
\
2005-03-14 09:02:23 +00:00
if ( ! ( tmp_url = php_url_parse_ex ( str , len ) ) ) { \
2006-06-29 14:31:56 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Invalid URL '%s' " , str ) ; \
2005-03-14 09:02:23 +00:00
RETURN_FALSE ; \
} \
2006-05-21 16:31:57 +00:00
\
if ( php_memnstr ( str , tmp_url - > path , strlen ( tmp_url - > path ) , str + len ) ) { \
2006-06-29 14:31:56 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " URL '%s' contains unencoded control characters. " , str ) ; \
2006-05-21 16:31:57 +00:00
RETURN_FALSE ; \
} \
2005-03-14 09:02:23 +00:00
\
2005-10-31 23:44:40 +00:00
if ( tmp_url - > query | | tmp_url - > fragment | | php_check_open_basedir ( tmp_url - > path TSRMLS_CC ) | | \
2005-03-14 09:02:23 +00:00
( PG ( safe_mode ) & & ! php_checkuid ( tmp_url - > path , " rb+ " , CHECKUID_CHECK_MODE_PARAM ) ) \
) { \
php_url_free ( tmp_url ) ; \
RETURN_FALSE ; \
} \
php_url_free ( tmp_url ) ; \
}
2006-06-11 01:42:17 +00:00
/* {{{ arginfo */
static
ZEND_BEGIN_ARG_INFO_EX ( arginfo_curl_version , 0 , 0 , 0 )
ZEND_ARG_INFO ( 0 , version )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO_EX ( arginfo_curl_init , 0 , 0 , 0 )
ZEND_ARG_INFO ( 0 , url )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO ( arginfo_curl_copy_handle , 0 )
ZEND_ARG_INFO ( 0 , ch )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO ( arginfo_curl_setopt , 0 )
ZEND_ARG_INFO ( 0 , ch )
ZEND_ARG_INFO ( 0 , option )
ZEND_ARG_INFO ( 0 , value )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO ( arginfo_curl_setopt_array , 0 )
ZEND_ARG_INFO ( 0 , ch )
2006-06-15 15:31:54 +00:00
ZEND_ARG_INFO ( 0 , options ) /* ARRAY_INFO(0, options, 0) */
2006-06-11 01:42:17 +00:00
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO ( arginfo_curl_exec , 0 )
ZEND_ARG_INFO ( 0 , ch )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO_EX ( arginfo_curl_getinfo , 0 , 0 , 1 )
ZEND_ARG_INFO ( 0 , ch )
ZEND_ARG_INFO ( 0 , option )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO ( arginfo_curl_error , 0 )
ZEND_ARG_INFO ( 0 , ch )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO ( arginfo_curl_errno , 0 )
ZEND_ARG_INFO ( 0 , ch )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO ( arginfo_curl_close , 0 )
ZEND_ARG_INFO ( 0 , ch )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO ( arginfo_curl_multi_init , 0 )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO ( arginfo_curl_multi_add_handle , 0 )
ZEND_ARG_INFO ( 0 , mh )
ZEND_ARG_INFO ( 0 , ch )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO ( arginfo_curl_multi_remove_handle , 0 )
ZEND_ARG_INFO ( 0 , mh )
ZEND_ARG_INFO ( 0 , ch )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO_EX ( arginfo_curl_multi_select , 0 , 0 , 1 )
ZEND_ARG_INFO ( 0 , mh )
ZEND_ARG_INFO ( 0 , timeout )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO_EX ( arginfo_curl_multi_exec , 0 , 0 , 1 )
ZEND_ARG_INFO ( 0 , mh )
ZEND_ARG_INFO ( 1 , still_running )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO ( arginfo_curl_multi_getcontent , 0 )
ZEND_ARG_INFO ( 0 , ch )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO_EX ( arginfo_curl_multi_info_read , 0 , 0 , 1 )
ZEND_ARG_INFO ( 0 , mh )
ZEND_ARG_INFO ( 0 , msgs_in_queue )
ZEND_END_ARG_INFO ( )
static
ZEND_BEGIN_ARG_INFO ( arginfo_curl_multi_close , 0 )
ZEND_ARG_INFO ( 0 , mh )
ZEND_END_ARG_INFO ( )
/* }}} */
2001-06-05 13:12:10 +00:00
/* {{{ curl_functions[]
*/
2005-12-06 02:28:41 +00:00
zend_function_entry curl_functions [ ] = {
2006-06-11 01:42:17 +00:00
PHP_FE ( curl_init , arginfo_curl_init )
PHP_FE ( curl_copy_handle , arginfo_curl_copy_handle )
PHP_FE ( curl_version , arginfo_curl_version )
PHP_FE ( curl_setopt , arginfo_curl_setopt )
PHP_FE ( curl_setopt_array , arginfo_curl_setopt_array )
PHP_FE ( curl_exec , arginfo_curl_exec )
PHP_FE ( curl_getinfo , arginfo_curl_getinfo )
PHP_FE ( curl_error , arginfo_curl_error )
PHP_FE ( curl_errno , arginfo_curl_errno )
PHP_FE ( curl_close , arginfo_curl_close )
PHP_FE ( curl_multi_init , arginfo_curl_multi_init )
PHP_FE ( curl_multi_add_handle , arginfo_curl_multi_add_handle )
PHP_FE ( curl_multi_remove_handle , arginfo_curl_multi_remove_handle )
PHP_FE ( curl_multi_select , arginfo_curl_multi_select )
PHP_FE ( curl_multi_exec , arginfo_curl_multi_exec )
PHP_FE ( curl_multi_getcontent , arginfo_curl_multi_getcontent )
PHP_FE ( curl_multi_info_read , arginfo_curl_multi_info_read )
PHP_FE ( curl_multi_close , arginfo_curl_multi_close )
2000-07-16 19:37:33 +00:00
{ NULL , NULL , NULL }
} ;
2001-06-05 13:12:10 +00:00
/* }}} */
2000-07-16 19:37:33 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ curl_module_entry
*/
2000-07-16 19:37:33 +00:00
zend_module_entry curl_module_entry = {
2001-10-11 23:33:59 +00:00
STANDARD_MODULE_HEADER ,
2000-07-16 19:37:33 +00:00
" curl " ,
curl_functions ,
PHP_MINIT ( curl ) ,
2001-09-22 00:38:59 +00:00
PHP_MSHUTDOWN ( curl ) ,
2000-08-17 02:14:41 +00:00
NULL ,
2000-07-16 19:37:33 +00:00
NULL ,
PHP_MINFO ( curl ) ,
2001-12-10 13:22:48 +00:00
NO_VERSION_YET ,
2000-07-16 19:37:33 +00:00
STANDARD_MODULE_PROPERTIES
} ;
2001-06-05 13:12:10 +00:00
/* }}} */
2000-07-16 19:37:33 +00:00
# ifdef COMPILE_DL_CURL
ZEND_GET_MODULE ( curl )
# endif
2001-06-05 13:12:10 +00:00
/* {{{ PHP_MINFO_FUNCTION
*/
2000-07-16 19:37:33 +00:00
PHP_MINFO_FUNCTION ( curl )
{
2000-08-13 19:32:09 +00:00
php_info_print_table_start ( ) ;
2001-03-20 21:30:42 +00:00
php_info_print_table_row ( 2 , " CURL support " , " enabled " ) ;
2000-08-13 19:32:09 +00:00
php_info_print_table_row ( 2 , " CURL Information " , curl_version ( ) ) ;
php_info_print_table_end ( ) ;
2000-07-16 19:37:33 +00:00
}
2001-06-05 13:12:10 +00:00
/* }}} */
2000-07-16 19:37:33 +00:00
2001-09-22 00:38:59 +00:00
# define REGISTER_CURL_CONSTANT(__c) REGISTER_LONG_CONSTANT(#__c, __c, CONST_CS | CONST_PERSISTENT)
2001-04-30 14:36:19 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ PHP_MINIT_FUNCTION
*/
2000-07-16 19:37:33 +00:00
PHP_MINIT_FUNCTION ( curl )
{
2000-10-25 17:44:02 +00:00
le_curl = zend_register_list_destructors_ex ( _php_curl_close , NULL , " curl " , module_number ) ;
2002-11-13 22:25:33 +00:00
le_curl_multi_handle = zend_register_list_destructors_ex ( _php_curl_multi_close , NULL , " curl " , module_number ) ;
2000-08-15 16:50:14 +00:00
/* Constants for curl_setopt() */
2002-07-31 22:10:58 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_DNS_USE_GLOBAL_CACHE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_DNS_CACHE_TIMEOUT ) ;
2001-09-22 00:38:59 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_PORT ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_FILE ) ;
2004-03-12 16:12:47 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_READDATA ) ;
2001-09-22 00:38:59 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_INFILE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_INFILESIZE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_URL ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_PROXY ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_VERBOSE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_HEADER ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_HTTPHEADER ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_NOPROGRESS ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_NOBODY ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_FAILONERROR ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_UPLOAD ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_POST ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_FTPLISTONLY ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_FTPAPPEND ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_NETRC ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_FOLLOWLOCATION ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_FTPASCII ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_PUT ) ;
2004-03-22 18:42:03 +00:00
# if CURLOPT_MUTE != 0
2001-09-22 00:38:59 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_MUTE ) ;
2004-03-22 18:42:03 +00:00
# endif
2001-09-22 00:38:59 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_USERPWD ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_PROXYUSERPWD ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_RANGE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_TIMEOUT ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_POSTFIELDS ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_REFERER ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_USERAGENT ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_FTPPORT ) ;
2002-10-02 16:44:48 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_FTP_USE_EPSV ) ;
2001-09-22 00:38:59 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_LOW_SPEED_LIMIT ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_LOW_SPEED_TIME ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_RESUME_FROM ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_COOKIE ) ;
2005-07-16 18:33:09 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_COOKIESESSION ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_AUTOREFERER ) ;
2001-09-22 00:38:59 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_SSLCERT ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_SSLCERTPASSWD ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_WRITEHEADER ) ;
2001-11-13 01:01:47 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_SSL_VERIFYHOST ) ;
2001-09-22 00:38:59 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_COOKIEFILE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_SSLVERSION ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_TIMECONDITION ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_TIMEVALUE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_CUSTOMREQUEST ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_STDERR ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_TRANSFERTEXT ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_RETURNTRANSFER ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_QUOTE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_POSTQUOTE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_INTERFACE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_KRB4LEVEL ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_HTTPPROXYTUNNEL ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_FILETIME ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_WRITEFUNCTION ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_READFUNCTION ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_PASSWDFUNCTION ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_HEADERFUNCTION ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_MAXREDIRS ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_MAXCONNECTS ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_CLOSEPOLICY ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_FRESH_CONNECT ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_FORBID_REUSE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_RANDOM_FILE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_EGDSOCKET ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_CONNECTTIMEOUT ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_SSL_VERIFYPEER ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_CAINFO ) ;
2002-11-09 13:52:00 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_CAPATH ) ;
2001-09-22 00:38:59 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_COOKIEJAR ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_SSL_CIPHER_LIST ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_BINARYTRANSFER ) ;
2002-11-13 22:25:33 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_NOSIGNAL ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_PROXYTYPE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_BUFFERSIZE ) ;
2002-11-09 13:52:00 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_HTTPGET ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_HTTP_VERSION ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_SSLKEY ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_SSLKEYTYPE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_SSLKEYPASSWD ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_SSLENGINE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_SSLENGINE_DEFAULT ) ;
2003-06-19 22:12:21 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_SSLCERTTYPE ) ;
2002-11-09 13:52:00 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_CRLF ) ;
2003-02-02 20:56:51 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_ENCODING ) ;
2003-06-19 22:12:21 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_PROXYPORT ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_UNRESTRICTED_AUTH ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_FTP_USE_EPRT ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_HTTP200ALIASES ) ;
2004-08-20 00:55:56 +00:00
REGISTER_CURL_CONSTANT ( CURL_TIMECOND_IFMODSINCE ) ;
REGISTER_CURL_CONSTANT ( CURL_TIMECOND_IFUNMODSINCE ) ;
REGISTER_CURL_CONSTANT ( CURL_TIMECOND_LASTMOD ) ;
2003-06-19 22:12:21 +00:00
2004-01-26 04:59:59 +00:00
# if LIBCURL_VERSION_NUM > 0x070a05 /* CURLOPT_HTTPAUTH is available since curl 7.10.6 */
2003-06-19 22:12:21 +00:00
REGISTER_CURL_CONSTANT ( CURLOPT_HTTPAUTH ) ;
/* http authentication options */
2004-01-26 04:59:59 +00:00
REGISTER_CURL_CONSTANT ( CURLAUTH_BASIC ) ;
REGISTER_CURL_CONSTANT ( CURLAUTH_DIGEST ) ;
REGISTER_CURL_CONSTANT ( CURLAUTH_GSSNEGOTIATE ) ;
REGISTER_CURL_CONSTANT ( CURLAUTH_NTLM ) ;
REGISTER_CURL_CONSTANT ( CURLAUTH_ANY ) ;
REGISTER_CURL_CONSTANT ( CURLAUTH_ANYSAFE ) ;
2003-06-19 22:12:21 +00:00
# endif
2004-08-18 21:27:24 +00:00
# if LIBCURL_VERSION_NUM > 0x070a06 /* CURLOPT_PROXYAUTH is available since curl 7.10.7 */
REGISTER_CURL_CONSTANT ( CURLOPT_PROXYAUTH ) ;
# endif
2001-04-30 14:36:19 +00:00
/* Constants effecting the way CURLOPT_CLOSEPOLICY works */
2001-09-22 00:38:59 +00:00
REGISTER_CURL_CONSTANT ( CURLCLOSEPOLICY_LEAST_RECENTLY_USED ) ;
REGISTER_CURL_CONSTANT ( CURLCLOSEPOLICY_LEAST_TRAFFIC ) ;
REGISTER_CURL_CONSTANT ( CURLCLOSEPOLICY_SLOWEST ) ;
REGISTER_CURL_CONSTANT ( CURLCLOSEPOLICY_CALLBACK ) ;
REGISTER_CURL_CONSTANT ( CURLCLOSEPOLICY_OLDEST ) ;
2000-10-20 04:57:14 +00:00
/* Info constants */
2001-09-22 00:38:59 +00:00
REGISTER_CURL_CONSTANT ( CURLINFO_EFFECTIVE_URL ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_HTTP_CODE ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_HEADER_SIZE ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_REQUEST_SIZE ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_TOTAL_TIME ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_NAMELOOKUP_TIME ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_CONNECT_TIME ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_PRETRANSFER_TIME ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_SIZE_UPLOAD ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_SIZE_DOWNLOAD ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_SPEED_DOWNLOAD ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_SPEED_UPLOAD ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_FILETIME ) ;
2001-09-24 18:45:08 +00:00
REGISTER_CURL_CONSTANT ( CURLINFO_SSL_VERIFYRESULT ) ;
2001-09-22 00:38:59 +00:00
REGISTER_CURL_CONSTANT ( CURLINFO_CONTENT_LENGTH_DOWNLOAD ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_CONTENT_LENGTH_UPLOAD ) ;
2002-11-08 17:58:43 +00:00
REGISTER_CURL_CONSTANT ( CURLINFO_STARTTRANSFER_TIME ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_CONTENT_TYPE ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_REDIRECT_TIME ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_REDIRECT_COUNT ) ;
2006-01-24 20:11:14 +00:00
REGISTER_CURL_CONSTANT ( CURLINFO_HEADER_OUT ) ;
2002-11-08 17:58:43 +00:00
2002-11-13 22:25:33 +00:00
/* cURL protocol constants (curl_version) */
REGISTER_CURL_CONSTANT ( CURL_VERSION_IPV6 ) ;
REGISTER_CURL_CONSTANT ( CURL_VERSION_KERBEROS4 ) ;
REGISTER_CURL_CONSTANT ( CURL_VERSION_SSL ) ;
REGISTER_CURL_CONSTANT ( CURL_VERSION_LIBZ ) ;
/* version constants */
REGISTER_CURL_CONSTANT ( CURLVERSION_NOW ) ;
2000-08-15 16:50:14 +00:00
/* Error Constants */
2001-09-22 00:38:59 +00:00
REGISTER_CURL_CONSTANT ( CURLE_OK ) ;
REGISTER_CURL_CONSTANT ( CURLE_UNSUPPORTED_PROTOCOL ) ;
REGISTER_CURL_CONSTANT ( CURLE_FAILED_INIT ) ;
REGISTER_CURL_CONSTANT ( CURLE_URL_MALFORMAT ) ;
REGISTER_CURL_CONSTANT ( CURLE_URL_MALFORMAT_USER ) ;
REGISTER_CURL_CONSTANT ( CURLE_COULDNT_RESOLVE_PROXY ) ;
REGISTER_CURL_CONSTANT ( CURLE_COULDNT_RESOLVE_HOST ) ;
REGISTER_CURL_CONSTANT ( CURLE_COULDNT_CONNECT ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_WEIRD_SERVER_REPLY ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_ACCESS_DENIED ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_USER_PASSWORD_INCORRECT ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_WEIRD_PASS_REPLY ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_WEIRD_USER_REPLY ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_WEIRD_PASV_REPLY ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_WEIRD_227_FORMAT ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_CANT_GET_HOST ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_CANT_RECONNECT ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_COULDNT_SET_BINARY ) ;
REGISTER_CURL_CONSTANT ( CURLE_PARTIAL_FILE ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_COULDNT_RETR_FILE ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_WRITE_ERROR ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_QUOTE_ERROR ) ;
REGISTER_CURL_CONSTANT ( CURLE_HTTP_NOT_FOUND ) ;
REGISTER_CURL_CONSTANT ( CURLE_WRITE_ERROR ) ;
REGISTER_CURL_CONSTANT ( CURLE_MALFORMAT_USER ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_COULDNT_STOR_FILE ) ;
REGISTER_CURL_CONSTANT ( CURLE_READ_ERROR ) ;
REGISTER_CURL_CONSTANT ( CURLE_OUT_OF_MEMORY ) ;
REGISTER_CURL_CONSTANT ( CURLE_OPERATION_TIMEOUTED ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_COULDNT_SET_ASCII ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_PORT_FAILED ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_COULDNT_USE_REST ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_COULDNT_GET_SIZE ) ;
REGISTER_CURL_CONSTANT ( CURLE_HTTP_RANGE_ERROR ) ;
REGISTER_CURL_CONSTANT ( CURLE_HTTP_POST_ERROR ) ;
REGISTER_CURL_CONSTANT ( CURLE_SSL_CONNECT_ERROR ) ;
REGISTER_CURL_CONSTANT ( CURLE_FTP_BAD_DOWNLOAD_RESUME ) ;
REGISTER_CURL_CONSTANT ( CURLE_FILE_COULDNT_READ_FILE ) ;
REGISTER_CURL_CONSTANT ( CURLE_LDAP_CANNOT_BIND ) ;
REGISTER_CURL_CONSTANT ( CURLE_LDAP_SEARCH_FAILED ) ;
REGISTER_CURL_CONSTANT ( CURLE_LIBRARY_NOT_FOUND ) ;
REGISTER_CURL_CONSTANT ( CURLE_FUNCTION_NOT_FOUND ) ;
REGISTER_CURL_CONSTANT ( CURLE_ABORTED_BY_CALLBACK ) ;
REGISTER_CURL_CONSTANT ( CURLE_BAD_FUNCTION_ARGUMENT ) ;
REGISTER_CURL_CONSTANT ( CURLE_BAD_CALLING_ORDER ) ;
REGISTER_CURL_CONSTANT ( CURLE_HTTP_PORT_FAILED ) ;
REGISTER_CURL_CONSTANT ( CURLE_BAD_PASSWORD_ENTERED ) ;
REGISTER_CURL_CONSTANT ( CURLE_TOO_MANY_REDIRECTS ) ;
REGISTER_CURL_CONSTANT ( CURLE_UNKNOWN_TELNET_OPTION ) ;
REGISTER_CURL_CONSTANT ( CURLE_TELNET_OPTION_SYNTAX ) ;
REGISTER_CURL_CONSTANT ( CURLE_OBSOLETE ) ;
REGISTER_CURL_CONSTANT ( CURLE_SSL_PEER_CERTIFICATE ) ;
2004-04-29 16:25:42 +00:00
REGISTER_CURL_CONSTANT ( CURLE_GOT_NOTHING ) ;
REGISTER_CURL_CONSTANT ( CURLE_SSL_ENGINE_NOTFOUND ) ;
REGISTER_CURL_CONSTANT ( CURLE_SSL_ENGINE_SETFAILED ) ;
REGISTER_CURL_CONSTANT ( CURLE_SEND_ERROR ) ;
REGISTER_CURL_CONSTANT ( CURLE_RECV_ERROR ) ;
REGISTER_CURL_CONSTANT ( CURLE_SHARE_IN_USE ) ;
REGISTER_CURL_CONSTANT ( CURLE_SSL_CERTPROBLEM ) ;
REGISTER_CURL_CONSTANT ( CURLE_SSL_CIPHER ) ;
REGISTER_CURL_CONSTANT ( CURLE_SSL_CACERT ) ;
REGISTER_CURL_CONSTANT ( CURLE_BAD_CONTENT_ENCODING ) ;
# ifdef CURLE_LDAP_INVALID_URL
REGISTER_CURL_CONSTANT ( CURLE_LDAP_INVALID_URL ) ;
# endif
# ifdef CURLE_FILESIZE_EXCEEDED
REGISTER_CURL_CONSTANT ( CURLE_FILESIZE_EXCEEDED ) ;
# endif
# ifdef CURLE_FTP_SSL_FAILED
REGISTER_CURL_CONSTANT ( CURLE_FTP_SSL_FAILED ) ;
# endif
2001-11-13 11:47:52 +00:00
2002-11-13 22:25:33 +00:00
REGISTER_CURL_CONSTANT ( CURLPROXY_HTTP ) ;
REGISTER_CURL_CONSTANT ( CURLPROXY_SOCKS5 ) ;
2002-11-09 13:52:00 +00:00
REGISTER_CURL_CONSTANT ( CURL_NETRC_OPTIONAL ) ;
REGISTER_CURL_CONSTANT ( CURL_NETRC_IGNORED ) ;
REGISTER_CURL_CONSTANT ( CURL_NETRC_REQUIRED ) ;
REGISTER_CURL_CONSTANT ( CURL_HTTP_VERSION_NONE ) ;
REGISTER_CURL_CONSTANT ( CURL_HTTP_VERSION_1_0 ) ;
REGISTER_CURL_CONSTANT ( CURL_HTTP_VERSION_1_1 ) ;
2002-11-13 22:25:33 +00:00
REGISTER_CURL_CONSTANT ( CURLM_CALL_MULTI_PERFORM ) ;
REGISTER_CURL_CONSTANT ( CURLM_OK ) ;
REGISTER_CURL_CONSTANT ( CURLM_BAD_HANDLE ) ;
REGISTER_CURL_CONSTANT ( CURLM_BAD_EASY_HANDLE ) ;
REGISTER_CURL_CONSTANT ( CURLM_OUT_OF_MEMORY ) ;
REGISTER_CURL_CONSTANT ( CURLM_INTERNAL_ERROR ) ;
REGISTER_CURL_CONSTANT ( CURLMSG_DONE ) ;
2004-11-14 20:00:16 +00:00
# ifdef CURLOPT_FTPSSLAUTH
REGISTER_CURL_CONSTANT ( CURLOPT_FTPSSLAUTH ) ;
REGISTER_CURL_CONSTANT ( CURLFTPAUTH_DEFAULT ) ;
REGISTER_CURL_CONSTANT ( CURLFTPAUTH_SSL ) ;
REGISTER_CURL_CONSTANT ( CURLFTPAUTH_TLS ) ;
# endif
2006-01-26 13:23:33 +00:00
# ifdef PHP_CURL_NEED_OPENSSL_TSL
{
int i , c = CRYPTO_num_locks ( ) ;
php_curl_openssl_tsl = malloc ( c * sizeof ( MUTEX_T ) ) ;
for ( i = 0 ; i < c ; + + i ) {
php_curl_openssl_tsl [ i ] = tsrm_mutex_alloc ( ) ;
}
CRYPTO_set_id_callback ( php_curl_ssl_id ) ;
CRYPTO_set_locking_callback ( php_curl_ssl_lock ) ;
}
2005-10-25 14:32:33 +00:00
# endif
2006-01-26 13:23:33 +00:00
# ifdef PHP_CURL_NEED_GNUTLS_TSL
gcry_control ( GCRYCTL_SET_THREAD_CBS , & php_curl_gnutls_tsl ) ;
# endif
2002-01-27 06:11:50 +00:00
if ( curl_global_init ( CURL_GLOBAL_SSL ) ! = CURLE_OK ) {
2001-09-22 00:38:59 +00:00
return FAILURE ;
}
2002-08-12 15:56:13 +00:00
# ifdef PHP_CURL_URL_WRAPPERS
2002-11-14 11:41:24 +00:00
# if HAVE_CURL_VERSION_INFO
{
curl_version_info_data * info = curl_version_info ( CURLVERSION_NOW ) ;
char * * p = ( char * * ) info - > protocols ;
while ( * p ! = NULL ) {
php_register_url_stream_wrapper ( * p + + , & php_curl_wrapper TSRMLS_CC ) ;
}
}
# else
2002-08-12 15:56:13 +00:00
php_register_url_stream_wrapper ( " http " , & php_curl_wrapper TSRMLS_CC ) ;
php_register_url_stream_wrapper ( " https " , & php_curl_wrapper TSRMLS_CC ) ;
php_register_url_stream_wrapper ( " ftp " , & php_curl_wrapper TSRMLS_CC ) ;
php_register_url_stream_wrapper ( " ldap " , & php_curl_wrapper TSRMLS_CC ) ;
2002-11-14 11:41:24 +00:00
# endif
2002-08-12 15:56:13 +00:00
# endif
2001-09-22 00:38:59 +00:00
return SUCCESS ;
}
/* }}} */
/* {{{ PHP_MSHUTDOWN_FUNCTION
*/
PHP_MSHUTDOWN_FUNCTION ( curl )
{
2002-08-12 15:56:13 +00:00
# ifdef PHP_CURL_URL_WRAPPERS
php_unregister_url_stream_wrapper ( " http " TSRMLS_CC ) ;
php_unregister_url_stream_wrapper ( " https " TSRMLS_CC ) ;
php_unregister_url_stream_wrapper ( " ftp " TSRMLS_CC ) ;
php_unregister_url_stream_wrapper ( " ldap " TSRMLS_CC ) ;
2006-01-26 13:23:33 +00:00
# endif
# ifdef PHP_CURL_NEED_OPENSSL_TSL
/* ensure there are valid callbacks set */
CRYPTO_set_id_callback ( php_curl_ssl_id ) ;
CRYPTO_set_locking_callback ( php_curl_ssl_lock ) ;
2002-08-12 15:56:13 +00:00
# endif
2001-09-22 00:38:59 +00:00
curl_global_cleanup ( ) ;
2006-01-26 13:23:33 +00:00
# ifdef PHP_CURL_NEED_OPENSSL_TSL
if ( php_curl_openssl_tsl ) {
int i , c = CRYPTO_num_locks ( ) ;
CRYPTO_set_id_callback ( NULL ) ;
CRYPTO_set_locking_callback ( NULL ) ;
for ( i = 0 ; i < c ; + + i ) {
tsrm_mutex_free ( php_curl_openssl_tsl [ i ] ) ;
}
free ( php_curl_openssl_tsl ) ;
php_curl_openssl_tsl = NULL ;
}
2005-10-25 14:32:33 +00:00
# endif
2000-10-22 17:29:33 +00:00
return SUCCESS ;
2000-08-15 16:50:14 +00:00
}
2001-06-05 13:12:10 +00:00
/* }}} */
2000-08-15 16:50:14 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ curl_write
*/
2001-10-18 19:24:51 +00:00
static size_t curl_write ( char * data , size_t size , size_t nmemb , void * ctx )
2001-04-30 14:36:19 +00:00
{
php_curl * ch = ( php_curl * ) ctx ;
2001-05-04 04:20:38 +00:00
php_curl_write * t = ch - > handlers - > write ;
2001-04-30 14:36:19 +00:00
size_t length = size * nmemb ;
2003-04-27 22:15:19 +00:00
TSRMLS_FETCH_FROM_CTX ( ch - > thread_ctx ) ;
2001-04-30 14:36:19 +00:00
2002-11-13 22:25:33 +00:00
# if PHP_CURL_DEBUG
fprintf ( stderr , " curl_write() called \n " ) ;
2003-03-17 15:06:11 +00:00
fprintf ( stderr , " data = %s, size = %d, nmemb = %d, ctx = %x \n " , data , size , nmemb , ctx ) ;
2002-11-13 22:25:33 +00:00
# endif
2001-04-30 14:36:19 +00:00
switch ( t - > method ) {
2003-03-17 15:06:11 +00:00
case PHP_CURL_STDOUT :
2003-05-17 14:12:36 +00:00
PHPWRITE ( data , length ) ;
2003-03-17 15:06:11 +00:00
break ;
case PHP_CURL_FILE :
return fwrite ( data , size , nmemb , t - > fp ) ;
case PHP_CURL_RETURN :
smart_str_appendl ( & t - > buf , data , ( int ) length ) ;
break ;
case PHP_CURL_USER : {
2003-05-21 23:15:28 +00:00
zval * * argv [ 2 ] ;
zval * retval_ptr = NULL ;
zval * handle = NULL ;
zval * zdata = NULL ;
2003-03-17 15:06:11 +00:00
int error ;
2003-08-05 10:29:03 +00:00
zend_fcall_info fci ;
2001-04-30 14:36:19 +00:00
2003-05-21 23:15:28 +00:00
MAKE_STD_ZVAL ( handle ) ;
ZVAL_RESOURCE ( handle , ch - > id ) ;
2003-03-17 15:06:11 +00:00
zend_list_addref ( ch - > id ) ;
2003-05-21 23:15:28 +00:00
argv [ 0 ] = & handle ;
MAKE_STD_ZVAL ( zdata ) ;
ZVAL_STRINGL ( zdata , data , length , 1 ) ;
argv [ 1 ] = & zdata ;
2003-03-17 15:06:11 +00:00
2003-08-05 10:29:03 +00:00
fci . size = sizeof ( fci ) ;
fci . function_table = EG ( function_table ) ;
fci . object_pp = NULL ;
fci . function_name = t - > func_name ;
fci . retval_ptr_ptr = & retval_ptr ;
fci . param_count = 2 ;
fci . params = argv ;
fci . no_separation = 0 ;
fci . symbol_table = NULL ;
2005-06-02 21:04:12 +00:00
ch - > in_callback = 1 ;
2003-08-05 10:29:03 +00:00
error = zend_call_function ( & fci , & t - > fci_cache TSRMLS_CC ) ;
2005-06-02 21:04:12 +00:00
ch - > in_callback = 0 ;
2003-03-17 15:06:11 +00:00
if ( error = = FAILURE ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not call the CURLOPT_WRITEFUNCTION " ) ;
length = - 1 ;
2005-06-02 21:04:12 +00:00
} else if ( retval_ptr ) {
2004-03-12 17:31:10 +00:00
if ( Z_TYPE_P ( retval_ptr ) ! = IS_LONG ) {
convert_to_long_ex ( & retval_ptr ) ;
}
2003-05-21 23:15:28 +00:00
length = Z_LVAL_P ( retval_ptr ) ;
2005-06-02 21:04:12 +00:00
zval_ptr_dtor ( & retval_ptr ) ;
2003-03-17 15:06:11 +00:00
}
2003-05-21 23:15:28 +00:00
zval_ptr_dtor ( argv [ 0 ] ) ;
zval_ptr_dtor ( argv [ 1 ] ) ;
2003-03-17 15:06:11 +00:00
break ;
}
2001-04-30 14:36:19 +00:00
}
return length ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
2001-04-30 14:36:19 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ curl_read
*/
2001-05-04 04:20:38 +00:00
static size_t curl_read ( char * data , size_t size , size_t nmemb , void * ctx )
2001-04-30 14:36:19 +00:00
{
php_curl * ch = ( php_curl * ) ctx ;
2001-05-04 04:20:38 +00:00
php_curl_read * t = ch - > handlers - > read ;
2001-04-30 14:36:19 +00:00
int length = - 1 ;
switch ( t - > method ) {
2003-03-17 15:06:11 +00:00
case PHP_CURL_DIRECT :
if ( t - > fp ) {
length = fread ( data , size , nmemb , t - > fp ) ;
}
break ;
case PHP_CURL_USER : {
2003-05-21 23:27:12 +00:00
zval * * argv [ 3 ] ;
zval * handle = NULL ;
zval * zfd = NULL ;
zval * zlength = NULL ;
zval * retval_ptr ;
2003-03-17 15:06:11 +00:00
int error ;
2003-08-05 10:29:03 +00:00
zend_fcall_info fci ;
2003-04-27 22:15:19 +00:00
TSRMLS_FETCH_FROM_CTX ( ch - > thread_ctx ) ;
2001-04-30 14:36:19 +00:00
2003-05-21 23:27:12 +00:00
MAKE_STD_ZVAL ( handle ) ;
MAKE_STD_ZVAL ( zfd ) ;
MAKE_STD_ZVAL ( zlength ) ;
2003-03-17 15:06:11 +00:00
2003-05-21 23:27:12 +00:00
ZVAL_RESOURCE ( handle , ch - > id ) ;
2003-03-17 15:06:11 +00:00
zend_list_addref ( ch - > id ) ;
2003-05-21 23:27:12 +00:00
ZVAL_RESOURCE ( zfd , t - > fd ) ;
2003-03-17 15:06:11 +00:00
zend_list_addref ( t - > fd ) ;
2003-05-21 23:27:12 +00:00
ZVAL_LONG ( zlength , ( int ) size * nmemb ) ;
2003-03-17 15:06:11 +00:00
2003-05-21 23:27:12 +00:00
argv [ 0 ] = & handle ;
argv [ 1 ] = & zfd ;
argv [ 2 ] = & zlength ;
2003-08-05 10:29:03 +00:00
fci . size = sizeof ( fci ) ;
fci . function_table = EG ( function_table ) ;
fci . function_name = t - > func_name ;
fci . object_pp = NULL ;
fci . retval_ptr_ptr = & retval_ptr ;
fci . param_count = 3 ;
fci . params = argv ;
fci . no_separation = 0 ;
fci . symbol_table = NULL ;
2005-06-02 21:04:12 +00:00
ch - > in_callback = 1 ;
2003-08-05 10:29:03 +00:00
error = zend_call_function ( & fci , & t - > fci_cache TSRMLS_CC ) ;
2005-06-02 21:04:12 +00:00
ch - > in_callback = 0 ;
2003-03-17 15:06:11 +00:00
if ( error = = FAILURE ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Cannot call the CURLOPT_READFUNCTION " ) ;
2005-06-02 21:04:12 +00:00
length = - 1 ;
} else if ( retval_ptr ) {
2004-03-12 16:36:30 +00:00
if ( Z_TYPE_P ( retval_ptr ) = = IS_STRING ) {
2004-03-12 17:31:10 +00:00
length = MIN ( size * nmemb , Z_STRLEN_P ( retval_ptr ) ) ;
memcpy ( data , Z_STRVAL_P ( retval_ptr ) , length ) ;
2004-03-12 16:08:11 +00:00
}
2005-06-02 21:04:12 +00:00
zval_ptr_dtor ( & retval_ptr ) ;
2003-03-17 15:06:11 +00:00
}
2003-05-21 23:27:12 +00:00
zval_ptr_dtor ( argv [ 0 ] ) ;
zval_ptr_dtor ( argv [ 1 ] ) ;
zval_ptr_dtor ( argv [ 2 ] ) ;
2003-03-17 15:06:11 +00:00
break ;
}
2001-04-30 14:36:19 +00:00
}
return length ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
2001-04-30 14:36:19 +00:00
2001-06-25 15:14:20 +00:00
/* {{{ curl_write_header
2001-06-05 13:12:10 +00:00
*/
2001-10-18 19:24:51 +00:00
static size_t curl_write_header ( char * data , size_t size , size_t nmemb , void * ctx )
2001-04-30 14:36:19 +00:00
{
2001-06-25 15:14:20 +00:00
php_curl * ch = ( php_curl * ) ctx ;
php_curl_write * t = ch - > handlers - > write_header ;
2002-03-24 10:40:21 +00:00
size_t length = size * nmemb ;
2003-04-27 22:15:19 +00:00
TSRMLS_FETCH_FROM_CTX ( ch - > thread_ctx ) ;
2001-06-25 15:14:20 +00:00
switch ( t - > method ) {
2002-07-03 12:02:17 +00:00
case PHP_CURL_STDOUT :
/* Handle special case write when we're returning the entire transfer
*/
2003-03-17 15:06:11 +00:00
if ( ch - > handlers - > write - > method = = PHP_CURL_RETURN ) {
2002-07-03 12:02:17 +00:00
smart_str_appendl ( & ch - > handlers - > write - > buf , data , ( int ) length ) ;
2003-03-17 15:06:11 +00:00
} else {
2003-05-17 14:12:36 +00:00
PHPWRITE ( data , length ) ;
2003-03-17 15:06:11 +00:00
}
2002-07-03 12:02:17 +00:00
break ;
case PHP_CURL_FILE :
return fwrite ( data , size , nmemb , t - > fp ) ;
case PHP_CURL_USER : {
2003-05-21 23:27:12 +00:00
zval * * argv [ 2 ] ;
zval * handle = NULL ;
zval * zdata = NULL ;
zval * retval_ptr ;
2002-07-03 12:02:17 +00:00
int error ;
2003-08-05 10:29:03 +00:00
zend_fcall_info fci ;
2002-07-03 12:02:17 +00:00
2003-05-21 23:27:12 +00:00
MAKE_STD_ZVAL ( handle ) ;
MAKE_STD_ZVAL ( zdata ) ;
2002-07-03 12:02:17 +00:00
2003-05-21 23:27:12 +00:00
ZVAL_RESOURCE ( handle , ch - > id ) ;
2002-07-03 12:02:17 +00:00
zend_list_addref ( ch - > id ) ;
2003-05-21 23:27:12 +00:00
ZVAL_STRINGL ( zdata , data , length , 1 ) ;
2002-07-03 12:02:17 +00:00
2003-05-21 23:27:12 +00:00
argv [ 0 ] = & handle ;
argv [ 1 ] = & zdata ;
2003-08-05 10:29:03 +00:00
fci . size = sizeof ( fci ) ;
fci . function_table = EG ( function_table ) ;
fci . function_name = t - > func_name ;
fci . symbol_table = NULL ;
fci . object_pp = NULL ;
fci . retval_ptr_ptr = & retval_ptr ;
fci . param_count = 2 ;
fci . params = argv ;
fci . no_separation = 0 ;
2005-06-02 21:04:12 +00:00
ch - > in_callback = 1 ;
2003-08-05 23:50:59 +00:00
error = zend_call_function ( & fci , & t - > fci_cache TSRMLS_CC ) ;
2005-06-02 21:04:12 +00:00
ch - > in_callback = 0 ;
2002-07-03 12:02:17 +00:00
if ( error = = FAILURE ) {
2003-03-17 15:06:11 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not call the CURLOPT_HEADERFUNCTION " ) ;
2002-07-03 12:02:17 +00:00
length = - 1 ;
2005-06-02 21:04:12 +00:00
} else if ( retval_ptr ) {
2004-03-12 17:31:10 +00:00
if ( Z_TYPE_P ( retval_ptr ) ! = IS_LONG ) {
convert_to_long_ex ( & retval_ptr ) ;
}
2003-05-21 23:27:12 +00:00
length = Z_LVAL_P ( retval_ptr ) ;
2005-06-02 21:04:12 +00:00
zval_ptr_dtor ( & retval_ptr ) ;
2002-07-03 12:02:17 +00:00
}
2003-05-21 23:27:12 +00:00
zval_ptr_dtor ( argv [ 0 ] ) ;
zval_ptr_dtor ( argv [ 1 ] ) ;
2002-07-03 12:02:17 +00:00
break ;
2001-06-25 15:14:20 +00:00
}
2004-03-12 17:31:10 +00:00
2002-07-03 12:02:17 +00:00
case PHP_CURL_IGNORE :
return length ;
2004-03-12 17:31:10 +00:00
default :
return - 1 ;
2001-04-30 14:36:19 +00:00
}
2003-03-17 15:06:11 +00:00
2001-04-30 14:36:19 +00:00
return length ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
2001-04-30 14:36:19 +00:00
2006-01-24 20:11:14 +00:00
static int curl_debug ( CURL * cp , curl_infotype type , char * buf , size_t buf_len , void * ctx )
{
php_curl * ch = ( php_curl * ) ctx ;
if ( type = = CURLINFO_HEADER_OUT ) {
if ( ch - > header . str_len ) {
efree ( ch - > header . str ) ;
}
if ( buf_len > 0 ) {
ch - > header . str = estrndup ( buf , buf_len ) ;
ch - > header . str_len = buf_len ;
}
}
return 0 ;
}
2004-03-22 18:42:03 +00:00
# if CURLOPT_PASSWDFUNCTION != 0
2001-06-25 15:14:20 +00:00
/* {{{ curl_passwd
2001-06-05 13:12:10 +00:00
*/
2001-06-25 15:14:20 +00:00
static size_t curl_passwd ( void * ctx , char * prompt , char * buf , int buflen )
2001-04-30 14:36:19 +00:00
{
php_curl * ch = ( php_curl * ) ctx ;
zval * func = ch - > handlers - > passwd ;
zval * argv [ 3 ] ;
2001-10-18 17:46:57 +00:00
zval * retval = NULL ;
2001-04-30 14:36:19 +00:00
int error ;
2004-03-12 17:31:10 +00:00
int ret = - 1 ;
2003-04-27 22:15:19 +00:00
TSRMLS_FETCH_FROM_CTX ( ch - > thread_ctx ) ;
2001-04-30 14:36:19 +00:00
MAKE_STD_ZVAL ( argv [ 0 ] ) ;
MAKE_STD_ZVAL ( argv [ 1 ] ) ;
MAKE_STD_ZVAL ( argv [ 2 ] ) ;
ZVAL_RESOURCE ( argv [ 0 ] , ch - > id ) ;
zend_list_addref ( ch - > id ) ;
ZVAL_STRING ( argv [ 1 ] , prompt , 1 ) ;
ZVAL_LONG ( argv [ 2 ] , buflen ) ;
2003-03-17 15:06:11 +00:00
error = call_user_function ( EG ( function_table ) , NULL , func , retval , 2 , argv TSRMLS_CC ) ;
2001-04-30 14:36:19 +00:00
if ( error = = FAILURE ) {
2003-03-17 15:06:11 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not call the CURLOPT_PASSWDFUNCTION " ) ;
2004-03-12 17:37:04 +00:00
} else if ( Z_TYPE_P ( retval ) = = IS_STRING ) {
if ( Z_STRLEN_P ( retval ) > buflen ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Returned password is too long for libcurl to handle " ) ;
2003-03-17 15:06:11 +00:00
} else {
2004-03-12 17:37:04 +00:00
strlcpy ( buf , Z_STRVAL_P ( retval ) , Z_STRLEN_P ( retval ) ) ;
2001-06-25 15:14:20 +00:00
}
2004-03-12 17:37:04 +00:00
} else {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " User handler '%s' did not return a string. " , Z_STRVAL_P ( func ) ) ;
2001-04-30 14:36:19 +00:00
}
2001-06-25 15:14:20 +00:00
2001-04-30 14:36:19 +00:00
zval_ptr_dtor ( & argv [ 0 ] ) ;
zval_ptr_dtor ( & argv [ 1 ] ) ;
zval_ptr_dtor ( & argv [ 2 ] ) ;
zval_ptr_dtor ( & retval ) ;
2001-06-25 15:14:20 +00:00
return ret ;
2001-04-30 14:36:19 +00:00
}
2001-06-05 13:12:10 +00:00
/* }}} */
2004-03-22 18:42:03 +00:00
# endif
2001-04-30 14:36:19 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ curl_free_string
*/
2001-04-30 14:36:19 +00:00
static void curl_free_string ( void * * string )
{
2000-11-23 16:31:58 +00:00
efree ( * string ) ;
2001-06-05 13:12:10 +00:00
}
/* }}} */
2000-08-15 16:50:14 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ curl_free_post
*/
2001-04-30 14:36:19 +00:00
static void curl_free_post ( void * * post )
{
curl_formfree ( ( struct HttpPost * ) * post ) ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
2001-04-30 14:36:19 +00:00
2001-06-05 13:12:10 +00:00
/* {{{ curl_free_slist
*/
2001-04-30 14:36:19 +00:00
static void curl_free_slist ( void * * slist )
{
curl_slist_free_all ( ( struct curl_slist * ) * slist ) ;
}
2001-06-05 13:12:10 +00:00
/* }}} */
2001-04-30 14:36:19 +00:00
2002-11-13 22:25:33 +00:00
/* {{{ proto array curl_version([int version])
2002-11-08 17:58:43 +00:00
Return cURL version information . */
2000-10-20 04:57:14 +00:00
PHP_FUNCTION ( curl_version )
2000-07-25 22:15:26 +00:00
{
2002-11-13 22:25:33 +00:00
curl_version_info_data * d ;
long uversion = CURLVERSION_NOW ;
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " |l " , & uversion ) = = FAILURE ) {
return ;
}
d = curl_version_info ( uversion ) ;
if ( d = = NULL ) {
RETURN_FALSE ;
2001-08-13 07:55:39 +00:00
}
2001-08-13 06:43:47 +00:00
2002-11-13 22:25:33 +00:00
array_init ( return_value ) ;
CAAL ( " version_number " , d - > version_num ) ;
CAAL ( " age " , d - > age ) ;
CAAL ( " features " , d - > features ) ;
CAAL ( " ssl_version_number " , d - > ssl_version_num ) ;
CAAS ( " version " , d - > version ) ;
CAAS ( " host " , d - > host ) ;
CAAS ( " ssl_version " , d - > ssl_version ) ;
CAAS ( " libz_version " , d - > libz_version ) ;
/* Add an array of protocols */
{
char * * p = ( char * * ) d - > protocols ;
zval * protocol_list = NULL ;
MAKE_STD_ZVAL ( protocol_list ) ;
array_init ( protocol_list ) ;
while ( * p ! = NULL ) {
add_next_index_string ( protocol_list , * p + + , 1 ) ;
}
CAAZ ( " protocols " , protocol_list ) ;
}
2000-07-25 22:15:26 +00:00
}
/* }}} */
2001-06-05 13:12:10 +00:00
/* {{{ alloc_curl_handle
*/
2001-05-14 21:02:31 +00:00
static void alloc_curl_handle ( php_curl * * ch )
2001-05-06 22:24:25 +00:00
{
2003-03-17 15:06:11 +00:00
* ch = emalloc ( sizeof ( php_curl ) ) ;
( * ch ) - > handlers = ecalloc ( 1 , sizeof ( php_curl_handlers ) ) ;
( * ch ) - > handlers - > write = ecalloc ( 1 , sizeof ( php_curl_write ) ) ;
2001-06-25 15:14:20 +00:00
( * ch ) - > handlers - > write_header = ecalloc ( 1 , sizeof ( php_curl_write ) ) ;
2003-03-17 15:06:11 +00:00
( * ch ) - > handlers - > read = ecalloc ( 1 , sizeof ( php_curl_read ) ) ;
2005-06-02 21:04:12 +00:00
( * ch ) - > in_callback = 0 ;
2006-01-24 20:11:14 +00:00
( * ch ) - > header . str_len = 0 ;
2005-06-02 21:04:12 +00:00
2001-07-02 12:08:21 +00:00
memset ( & ( * ch ) - > err , 0 , sizeof ( ( * ch ) - > err ) ) ;
2003-03-17 15:06:11 +00:00
zend_llist_init ( & ( * ch ) - > to_free . str , sizeof ( char * ) , ( void ( * ) ( void * ) ) curl_free_string , 0 ) ;
zend_llist_init ( & ( * ch ) - > to_free . slist , sizeof ( struct curl_slist ) , ( void ( * ) ( void * ) ) curl_free_slist , 0 ) ;
zend_llist_init ( & ( * ch ) - > to_free . post , sizeof ( struct HttpPost ) , ( void ( * ) ( void * ) ) curl_free_post , 0 ) ;
2001-05-06 22:24:25 +00:00
}
2001-06-05 13:12:10 +00:00
/* }}} */
2001-05-06 22:24:25 +00:00
2002-03-23 01:43:38 +00:00
/* {{{ proto resource curl_init([string url])
2000-07-16 19:37:33 +00:00
Initialize a CURL session */
2000-08-13 19:32:09 +00:00
PHP_FUNCTION ( curl_init )
2000-07-16 19:37:33 +00:00
{
2001-04-30 14:36:19 +00:00
zval * * url ;
php_curl * ch ;
2004-03-12 18:41:19 +00:00
CURL * cp ;
2001-04-30 14:36:19 +00:00
int argc = ZEND_NUM_ARGS ( ) ;
2003-03-17 15:06:11 +00:00
if ( argc < 0 | | argc > 1 | | zend_get_parameters_ex ( argc , & url ) = = FAILURE ) {
2000-07-16 19:37:33 +00:00
WRONG_PARAM_COUNT ;
}
2000-11-22 15:46:13 +00:00
2005-03-14 09:02:23 +00:00
if ( argc > 0 ) {
convert_to_string_ex ( url ) ;
PHP_CURL_CHECK_OPEN_BASEDIR ( Z_STRVAL_PP ( url ) , Z_STRLEN_PP ( url ) ) ;
}
2004-03-12 18:41:19 +00:00
cp = curl_easy_init ( ) ;
if ( ! cp ) {
2003-03-17 15:06:11 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not initialize a new cURL handle " ) ;
2000-07-16 19:37:33 +00:00
RETURN_FALSE ;
}
2004-03-12 18:41:19 +00:00
alloc_curl_handle ( & ch ) ;
TSRMLS_SET_CTX ( ch - > thread_ctx ) ;
ch - > cp = cp ;
2003-04-27 22:15:19 +00:00
2001-05-04 04:20:38 +00:00
ch - > handlers - > write - > method = PHP_CURL_STDOUT ;
2001-09-26 22:24:44 +00:00
ch - > handlers - > write - > type = PHP_CURL_ASCII ;
2001-05-04 04:20:38 +00:00
ch - > handlers - > read - > method = PHP_CURL_DIRECT ;
2001-07-18 10:47:54 +00:00
ch - > handlers - > write_header - > method = PHP_CURL_IGNORE ;
2001-04-30 14:36:19 +00:00
2003-05-09 01:10:18 +00:00
ch - > uses = 0 ;
2001-04-30 14:36:19 +00:00
curl_easy_setopt ( ch - > cp , CURLOPT_NOPROGRESS , 1 ) ;
curl_easy_setopt ( ch - > cp , CURLOPT_VERBOSE , 0 ) ;
curl_easy_setopt ( ch - > cp , CURLOPT_ERRORBUFFER , ch - > err . str ) ;
curl_easy_setopt ( ch - > cp , CURLOPT_WRITEFUNCTION , curl_write ) ;
2001-05-04 04:20:38 +00:00
curl_easy_setopt ( ch - > cp , CURLOPT_FILE , ( void * ) ch ) ;
2001-04-30 14:36:19 +00:00
curl_easy_setopt ( ch - > cp , CURLOPT_READFUNCTION , curl_read ) ;
2001-05-04 04:20:38 +00:00
curl_easy_setopt ( ch - > cp , CURLOPT_INFILE , ( void * ) ch ) ;
2001-06-25 15:14:20 +00:00
curl_easy_setopt ( ch - > cp , CURLOPT_HEADERFUNCTION , curl_write_header ) ;
curl_easy_setopt ( ch - > cp , CURLOPT_WRITEHEADER , ( void * ) ch ) ;
2002-07-31 22:10:58 +00:00
curl_easy_setopt ( ch - > cp , CURLOPT_DNS_USE_GLOBAL_CACHE , 1 ) ;
curl_easy_setopt ( ch - > cp , CURLOPT_DNS_CACHE_TIMEOUT , 120 ) ;
2004-11-01 04:55:01 +00:00
curl_easy_setopt ( ch - > cp , CURLOPT_MAXREDIRS , 20 ) ; /* prevent infinite redirects */
2003-06-19 22:12:21 +00:00
# if defined(ZTS)
curl_easy_setopt ( ch - > cp , CURLOPT_NOSIGNAL , 1 ) ;
# endif
2002-07-31 22:10:58 +00:00
2000-09-30 03:09:54 +00:00
if ( argc > 0 ) {
2001-04-30 14:36:19 +00:00
char * urlcopy ;
2000-09-30 03:09:54 +00:00
2001-04-30 14:36:19 +00:00
urlcopy = estrndup ( Z_STRVAL_PP ( url ) , Z_STRLEN_PP ( url ) ) ;
curl_easy_setopt ( ch - > cp , CURLOPT_URL , urlcopy ) ;
zend_llist_add_element ( & ch - > to_free . str , & urlcopy ) ;
2000-07-16 19:37:33 +00:00
}
2000-09-30 03:09:54 +00:00
2001-04-30 14:36:19 +00:00
ZEND_REGISTER_RESOURCE ( return_value , ch , le_curl ) ;
ch - > id = Z_LVAL_P ( return_value ) ;
2000-07-16 19:37:33 +00:00
}
/* }}} */
2004-03-12 18:37:55 +00:00
/* {{{ proto resource curl_copy_handle(resource ch)
Copy a cURL handle along with all of it ' s preferences */
PHP_FUNCTION ( curl_copy_handle )
{
2004-03-12 20:04:31 +00:00
zval * * zid ;
CURL * cp ;
php_curl * ch ;
php_curl * dupch ;
2004-03-12 18:37:55 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & zid ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
ZEND_FETCH_RESOURCE ( ch , php_curl * , zid , - 1 , le_curl_name , le_curl ) ;
cp = curl_easy_duphandle ( ch - > cp ) ;
if ( ! cp ) {
2005-04-21 21:11:23 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Cannot duplicate cURL handle " ) ;
2004-03-12 18:37:55 +00:00
RETURN_FALSE ;
}
alloc_curl_handle ( & dupch ) ;
TSRMLS_SET_CTX ( ch - > thread_ctx ) ;
dupch - > cp = cp ;
dupch - > handlers - > write - > method = ch - > handlers - > write - > method ;
dupch - > handlers - > write - > type = ch - > handlers - > write - > type ;
dupch - > handlers - > read - > method = ch - > handlers - > read - > method ;
dupch - > handlers - > write_header - > method = ch - > handlers - > write_header - > method ;
ZEND_REGISTER_RESOURCE ( return_value , dupch , le_curl ) ;
dupch - > id = Z_LVAL_P ( return_value ) ;
}
/* }}} */
2006-01-24 20:11:14 +00:00
static int _php_curl_setopt ( php_curl * ch , long option , zval * * zvalue , zval * return_value TSRMLS_DC )
2000-07-16 19:37:33 +00:00
{
2002-07-26 22:57:14 +00:00
CURLcode error = CURLE_OK ;
2001-04-30 14:36:19 +00:00
switch ( option ) {
2002-07-31 22:10:58 +00:00
case CURLOPT_INFILESIZE :
case CURLOPT_VERBOSE :
case CURLOPT_HEADER :
case CURLOPT_NOPROGRESS :
case CURLOPT_NOBODY :
case CURLOPT_FAILONERROR :
case CURLOPT_UPLOAD :
case CURLOPT_POST :
case CURLOPT_FTPLISTONLY :
case CURLOPT_FTPAPPEND :
case CURLOPT_NETRC :
case CURLOPT_FOLLOWLOCATION :
case CURLOPT_PUT :
2004-03-22 18:42:03 +00:00
# if CURLOPT_MUTE != 0
case CURLOPT_MUTE :
# endif
2002-07-31 22:10:58 +00:00
case CURLOPT_TIMEOUT :
2002-10-02 16:44:48 +00:00
case CURLOPT_FTP_USE_EPSV :
2002-07-31 22:10:58 +00:00
case CURLOPT_LOW_SPEED_LIMIT :
case CURLOPT_SSLVERSION :
case CURLOPT_LOW_SPEED_TIME :
case CURLOPT_RESUME_FROM :
case CURLOPT_TIMEVALUE :
case CURLOPT_TIMECONDITION :
case CURLOPT_TRANSFERTEXT :
case CURLOPT_HTTPPROXYTUNNEL :
case CURLOPT_FILETIME :
case CURLOPT_MAXREDIRS :
case CURLOPT_MAXCONNECTS :
case CURLOPT_CLOSEPOLICY :
case CURLOPT_FRESH_CONNECT :
case CURLOPT_FORBID_REUSE :
case CURLOPT_CONNECTTIMEOUT :
case CURLOPT_SSL_VERIFYHOST :
case CURLOPT_SSL_VERIFYPEER :
case CURLOPT_DNS_USE_GLOBAL_CACHE :
2002-11-13 22:25:33 +00:00
case CURLOPT_NOSIGNAL :
case CURLOPT_PROXYTYPE :
case CURLOPT_BUFFERSIZE :
2002-11-09 13:52:00 +00:00
case CURLOPT_HTTPGET :
case CURLOPT_HTTP_VERSION :
case CURLOPT_CRLF :
2003-06-19 22:12:21 +00:00
case CURLOPT_DNS_CACHE_TIMEOUT :
case CURLOPT_PROXYPORT :
case CURLOPT_FTP_USE_EPRT :
2004-01-26 04:59:59 +00:00
# if LIBCURL_VERSION_NUM > 0x070a05 /* CURLOPT_HTTPAUTH is available since curl 7.10.6 */
2003-06-19 22:12:21 +00:00
case CURLOPT_HTTPAUTH :
2004-08-18 21:27:24 +00:00
# endif
# if LIBCURL_VERSION_NUM > 0x070a06 /* CURLOPT_PROXYAUTH is available since curl 7.10.7 */
case CURLOPT_PROXYAUTH :
2003-06-19 22:12:21 +00:00
# endif
2004-11-14 20:00:16 +00:00
# ifdef CURLOPT_FTPSSLAUTH
case CURLOPT_FTPSSLAUTH :
2004-11-18 16:35:04 +00:00
# endif
2003-06-19 22:12:21 +00:00
case CURLOPT_UNRESTRICTED_AUTH :
2003-06-18 21:02:02 +00:00
case CURLOPT_PORT :
2005-07-16 18:33:09 +00:00
case CURLOPT_AUTOREFERER :
case CURLOPT_COOKIESESSION :
2002-07-31 22:10:58 +00:00
convert_to_long_ex ( zvalue ) ;
error = curl_easy_setopt ( ch - > cp , option , Z_LVAL_PP ( zvalue ) ) ;
break ;
case CURLOPT_URL :
case CURLOPT_PROXY :
case CURLOPT_USERPWD :
case CURLOPT_PROXYUSERPWD :
case CURLOPT_RANGE :
case CURLOPT_CUSTOMREQUEST :
case CURLOPT_USERAGENT :
case CURLOPT_FTPPORT :
case CURLOPT_COOKIE :
case CURLOPT_REFERER :
case CURLOPT_INTERFACE :
case CURLOPT_KRB4LEVEL :
case CURLOPT_EGDSOCKET :
case CURLOPT_CAINFO :
2002-11-09 13:52:00 +00:00
case CURLOPT_CAPATH :
case CURLOPT_SSL_CIPHER_LIST :
case CURLOPT_SSLKEY :
case CURLOPT_SSLKEYTYPE :
case CURLOPT_SSLKEYPASSWD :
case CURLOPT_SSLENGINE :
2003-02-02 20:56:51 +00:00
case CURLOPT_SSLENGINE_DEFAULT :
2003-06-19 22:12:21 +00:00
case CURLOPT_SSLCERTTYPE :
2003-02-02 20:56:51 +00:00
case CURLOPT_ENCODING : {
2002-07-31 22:10:58 +00:00
char * copystr = NULL ;
2000-07-16 19:37:33 +00:00
2002-07-31 22:10:58 +00:00
convert_to_string_ex ( zvalue ) ;
2001-04-30 14:36:19 +00:00
2005-03-14 09:02:23 +00:00
if ( option = = CURLOPT_URL ) {
PHP_CURL_CHECK_OPEN_BASEDIR ( Z_STRVAL_PP ( zvalue ) , Z_STRLEN_PP ( zvalue ) ) ;
}
copystr = estrndup ( Z_STRVAL_PP ( zvalue ) , Z_STRLEN_PP ( zvalue ) ) ;
2002-07-31 22:10:58 +00:00
error = curl_easy_setopt ( ch - > cp , option , copystr ) ;
zend_llist_add_element ( & ch - > to_free . str , & copystr ) ;
2002-07-03 12:02:17 +00:00
2002-07-31 22:10:58 +00:00
break ;
2001-11-20 11:29:54 +00:00
}
2001-06-25 15:14:20 +00:00
case CURLOPT_FILE :
2002-07-31 22:10:58 +00:00
case CURLOPT_INFILE :
2001-06-25 15:14:20 +00:00
case CURLOPT_WRITEHEADER :
2002-07-31 22:10:58 +00:00
case CURLOPT_STDERR : {
FILE * fp = NULL ;
int type ;
void * what ;
what = zend_fetch_resource ( zvalue TSRMLS_CC , - 1 , " File-Handle " , & type , 1 , php_file_le_stream ( ) ) ;
ZEND_VERIFY_RESOURCE ( what ) ;
2001-04-30 14:36:19 +00:00
2003-03-17 15:06:11 +00:00
if ( FAILURE = = php_stream_cast ( ( php_stream * ) what , PHP_STREAM_AS_STDIO , ( void * ) & fp , REPORT_ERRORS ) ) {
2006-07-04 20:12:38 +00:00
RETVAL_FALSE ;
return 1 ;
2002-07-31 22:10:58 +00:00
}
2001-04-30 14:36:19 +00:00
2002-07-31 22:10:58 +00:00
if ( ! fp ) {
2006-07-04 20:12:38 +00:00
RETVAL_FALSE ;
return 1 ;
2002-07-31 22:10:58 +00:00
}
error = CURLE_OK ;
switch ( option ) {
case CURLOPT_FILE :
ch - > handlers - > write - > fp = fp ;
ch - > handlers - > write - > method = PHP_CURL_FILE ;
break ;
case CURLOPT_WRITEHEADER :
ch - > handlers - > write_header - > fp = fp ;
ch - > handlers - > write_header - > method = PHP_CURL_FILE ;
break ;
case CURLOPT_INFILE :
zend_list_addref ( Z_LVAL_PP ( zvalue ) ) ;
ch - > handlers - > read - > fp = fp ;
ch - > handlers - > read - > fd = Z_LVAL_PP ( zvalue ) ;
break ;
default :
error = curl_easy_setopt ( ch - > cp , option , fp ) ;
break ;
}
2002-07-26 22:57:14 +00:00
2002-07-31 22:10:58 +00:00
break ;
2002-07-26 22:57:14 +00:00
}
2002-07-31 22:10:58 +00:00
case CURLOPT_RETURNTRANSFER :
convert_to_long_ex ( zvalue ) ;
if ( Z_LVAL_PP ( zvalue ) ) {
ch - > handlers - > write - > method = PHP_CURL_RETURN ;
2004-03-09 17:11:22 +00:00
} else {
ch - > handlers - > write - > method = PHP_CURL_STDOUT ;
2000-09-30 03:09:54 +00:00
}
2002-07-31 22:10:58 +00:00
break ;
case CURLOPT_BINARYTRANSFER :
convert_to_long_ex ( zvalue ) ;
2001-02-16 14:31:37 +00:00
2002-07-31 22:10:58 +00:00
if ( Z_LVAL_PP ( zvalue ) ) {
ch - > handlers - > write - > type = PHP_CURL_BINARY ;
2006-04-13 11:26:10 +00:00
} else {
ch - > handlers - > write - > type = PHP_CURL_ASCII ;
2002-07-31 22:10:58 +00:00
}
break ;
case CURLOPT_WRITEFUNCTION :
2003-05-21 23:15:28 +00:00
if ( ch - > handlers - > write - > func_name ) {
zval_ptr_dtor ( & ch - > handlers - > write - > func_name ) ;
2003-08-05 10:29:03 +00:00
ch - > handlers - > write - > fci_cache = empty_fcall_info_cache ;
2002-11-08 17:58:43 +00:00
}
2002-07-31 22:10:58 +00:00
zval_add_ref ( zvalue ) ;
2003-05-21 23:15:28 +00:00
ch - > handlers - > write - > func_name = * zvalue ;
2002-07-31 22:10:58 +00:00
ch - > handlers - > write - > method = PHP_CURL_USER ;
break ;
case CURLOPT_READFUNCTION :
2003-05-21 23:15:28 +00:00
if ( ch - > handlers - > read - > func_name ) {
zval_ptr_dtor ( & ch - > handlers - > read - > func_name ) ;
2003-08-05 10:29:03 +00:00
ch - > handlers - > write - > fci_cache = empty_fcall_info_cache ;
2002-11-08 17:58:43 +00:00
}
2002-07-31 22:10:58 +00:00
zval_add_ref ( zvalue ) ;
2003-05-21 23:15:28 +00:00
ch - > handlers - > read - > func_name = * zvalue ;
2002-07-31 22:10:58 +00:00
ch - > handlers - > read - > method = PHP_CURL_USER ;
break ;
case CURLOPT_HEADERFUNCTION :
2003-05-21 23:15:28 +00:00
if ( ch - > handlers - > write_header - > func_name ) {
zval_ptr_dtor ( & ch - > handlers - > write_header - > func_name ) ;
2003-08-05 10:29:03 +00:00
ch - > handlers - > write - > fci_cache = empty_fcall_info_cache ;
2002-11-08 17:58:43 +00:00
}
2002-07-31 22:10:58 +00:00
zval_add_ref ( zvalue ) ;
2003-05-21 23:15:28 +00:00
ch - > handlers - > write_header - > func_name = * zvalue ;
2002-07-31 22:10:58 +00:00
ch - > handlers - > write_header - > method = PHP_CURL_USER ;
break ;
2004-03-22 18:42:03 +00:00
# if CURLOPT_PASSWDFUNCTION != 0
2002-07-31 22:10:58 +00:00
case CURLOPT_PASSWDFUNCTION :
2002-11-08 17:58:43 +00:00
if ( ch - > handlers - > passwd ) {
zval_ptr_dtor ( & ch - > handlers - > passwd ) ;
}
2002-07-31 22:10:58 +00:00
zval_add_ref ( zvalue ) ;
ch - > handlers - > passwd = * zvalue ;
error = curl_easy_setopt ( ch - > cp , CURLOPT_PASSWDFUNCTION , curl_passwd ) ;
error = curl_easy_setopt ( ch - > cp , CURLOPT_PASSWDDATA , ( void * ) ch ) ;
break ;
2004-03-22 18:42:03 +00:00
# endif
2002-07-31 22:10:58 +00:00
case CURLOPT_POSTFIELDS :
if ( Z_TYPE_PP ( zvalue ) = = IS_ARRAY | | Z_TYPE_PP ( zvalue ) = = IS_OBJECT ) {
zval * * current ;
HashTable * postfields ;
struct HttpPost * first = NULL ;
struct HttpPost * last = NULL ;
char * postval ;
char * string_key = NULL ;
ulong num_key ;
uint string_key_len ;
postfields = HASH_OF ( * zvalue ) ;
if ( ! postfields ) {
2003-01-18 21:31:11 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Couldn't get HashTable in CURLOPT_POSTFIELDS " ) ;
2006-07-04 20:12:38 +00:00
RETVAL_FALSE ;
return 1 ;
2002-07-31 22:10:58 +00:00
}
2000-09-30 03:09:54 +00:00
2002-07-31 22:10:58 +00:00
for ( zend_hash_internal_pointer_reset ( postfields ) ;
2003-03-17 15:06:11 +00:00
zend_hash_get_current_data ( postfields , ( void * * ) & current ) = = SUCCESS ;
zend_hash_move_forward ( postfields )
) {
2002-07-31 22:10:58 +00:00
SEPARATE_ZVAL ( current ) ;
convert_to_string_ex ( current ) ;
2000-12-22 12:57:09 +00:00
2003-03-17 15:06:11 +00:00
zend_hash_get_current_key_ex ( postfields , & string_key , & string_key_len , & num_key , 0 , NULL ) ;
2001-12-03 09:19:14 +00:00
2002-07-31 22:10:58 +00:00
postval = Z_STRVAL_PP ( current ) ;
2005-01-05 21:33:56 +00:00
/* The arguments after _NAMELENGTH and _CONTENTSLENGTH
* must be explicitly cast to long in curl_formadd
* use since curl needs a long not an int . */
2002-07-31 22:10:58 +00:00
if ( * postval = = ' @ ' ) {
2005-10-05 14:35:30 +00:00
+ + postval ;
/* safe_mode / open_basedir check */
if ( php_check_open_basedir ( postval TSRMLS_CC ) | | ( PG ( safe_mode ) & & ! php_checkuid ( postval , " rb+ " , CHECKUID_CHECK_MODE_PARAM ) ) ) {
2006-07-04 20:12:38 +00:00
RETVAL_FALSE ;
return 1 ;
2005-10-05 14:35:30 +00:00
}
2002-07-31 22:10:58 +00:00
error = curl_formadd ( & first , & last ,
CURLFORM_COPYNAME , string_key ,
2005-01-05 21:33:56 +00:00
CURLFORM_NAMELENGTH , ( long ) string_key_len - 1 ,
2005-10-05 14:35:30 +00:00
CURLFORM_FILE , postval ,
2002-07-31 22:10:58 +00:00
CURLFORM_END ) ;
2003-03-17 15:06:11 +00:00
} else {
2002-07-31 22:10:58 +00:00
error = curl_formadd ( & first , & last ,
CURLFORM_COPYNAME , string_key ,
2005-01-05 21:33:56 +00:00
CURLFORM_NAMELENGTH , ( long ) string_key_len - 1 ,
2004-07-01 06:50:46 +00:00
CURLFORM_COPYCONTENTS , postval ,
2005-01-05 21:33:56 +00:00
CURLFORM_CONTENTSLENGTH , ( long ) Z_STRLEN_PP ( current ) ,
2002-07-31 22:10:58 +00:00
CURLFORM_END ) ;
}
2001-12-03 09:19:14 +00:00
}
2002-07-31 22:10:58 +00:00
SAVE_CURL_ERROR ( ch , error ) ;
if ( error ! = CURLE_OK ) {
2006-07-04 20:12:38 +00:00
RETVAL_FALSE
return 1 ;
2001-12-03 09:19:14 +00:00
}
2001-04-30 14:36:19 +00:00
2002-07-31 22:10:58 +00:00
zend_llist_add_element ( & ch - > to_free . post , & first ) ;
error = curl_easy_setopt ( ch - > cp , CURLOPT_HTTPPOST , first ) ;
2003-03-17 15:06:11 +00:00
} else {
2002-07-31 22:10:58 +00:00
char * post = NULL ;
2001-04-30 14:36:19 +00:00
2002-07-31 22:10:58 +00:00
convert_to_string_ex ( zvalue ) ;
post = estrndup ( Z_STRVAL_PP ( zvalue ) , Z_STRLEN_PP ( zvalue ) ) ;
zend_llist_add_element ( & ch - > to_free . str , & post ) ;
2001-04-30 14:36:19 +00:00
2002-07-31 22:10:58 +00:00
error = curl_easy_setopt ( ch - > cp , CURLOPT_POSTFIELDS , post ) ;
error = curl_easy_setopt ( ch - > cp , CURLOPT_POSTFIELDSIZE , Z_STRLEN_PP ( zvalue ) ) ;
}
break ;
case CURLOPT_HTTPHEADER :
case CURLOPT_QUOTE :
2003-06-19 22:12:21 +00:00
case CURLOPT_HTTP200ALIASES :
2002-07-31 22:10:58 +00:00
case CURLOPT_POSTQUOTE : {
zval * * current ;
HashTable * ph ;
struct curl_slist * slist = NULL ;
ph = HASH_OF ( * zvalue ) ;
if ( ! ph ) {
2003-06-19 22:12:21 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " You must pass either an object or an array with the CURLOPT_HTTPHEADER, CURLOPT_QUOTE, CURLOPT_HTTP200ALIASES and CURLOPT_POSTQUOTE arguments " ) ;
2006-07-04 20:12:38 +00:00
RETVAL_FALSE ;
return 1 ;
2002-07-31 22:10:58 +00:00
}
2001-04-30 14:36:19 +00:00
2002-07-31 22:10:58 +00:00
for ( zend_hash_internal_pointer_reset ( ph ) ;
zend_hash_get_current_data ( ph , ( void * * ) & current ) = = SUCCESS ;
2003-03-17 15:06:11 +00:00
zend_hash_move_forward ( ph )
) {
2002-07-31 22:10:58 +00:00
char * indiv = NULL ;
2001-04-30 14:36:19 +00:00
2002-07-31 22:10:58 +00:00
SEPARATE_ZVAL ( current ) ;
convert_to_string_ex ( current ) ;
2001-04-30 14:36:19 +00:00
2002-07-31 22:10:58 +00:00
indiv = estrndup ( Z_STRVAL_PP ( current ) , Z_STRLEN_PP ( current ) + 1 ) ;
slist = curl_slist_append ( slist , indiv ) ;
2003-03-17 15:06:11 +00:00
if ( ! slist ) {
2002-07-31 22:10:58 +00:00
efree ( indiv ) ;
2003-03-17 15:06:11 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not build curl_slist " ) ;
2006-07-04 20:12:38 +00:00
RETVAL_FALSE ;
return 1 ;
2002-07-31 22:10:58 +00:00
}
zend_llist_add_element ( & ch - > to_free . str , & indiv ) ;
2000-10-20 04:57:14 +00:00
}
2002-07-31 22:10:58 +00:00
zend_llist_add_element ( & ch - > to_free . slist , & slist ) ;
2001-04-30 14:36:19 +00:00
2002-07-31 22:10:58 +00:00
error = curl_easy_setopt ( ch - > cp , option , slist ) ;
2001-04-30 14:36:19 +00:00
2003-06-19 22:12:21 +00:00
break ;
}
/* the following options deal with files, therefor safe_mode & open_basedir checks
* are required .
*/
case CURLOPT_COOKIEJAR :
case CURLOPT_SSLCERT :
case CURLOPT_RANDOM_FILE :
case CURLOPT_COOKIEFILE : {
char * copystr = NULL ;
convert_to_string_ex ( zvalue ) ;
if ( php_check_open_basedir ( Z_STRVAL_PP ( zvalue ) TSRMLS_CC ) | | ( PG ( safe_mode ) & & ! php_checkuid ( Z_STRVAL_PP ( zvalue ) , " rb+ " , CHECKUID_CHECK_MODE_PARAM ) ) ) {
2006-07-04 20:12:38 +00:00
RETVAL_FALSE ;
return 1 ;
2003-06-19 22:12:21 +00:00
}
copystr = estrndup ( Z_STRVAL_PP ( zvalue ) , Z_STRLEN_PP ( zvalue ) ) ;
error = curl_easy_setopt ( ch - > cp , option , copystr ) ;
zend_llist_add_element ( & ch - > to_free . str , & copystr ) ;
2002-07-31 22:10:58 +00:00
break ;
}
2006-01-24 20:11:14 +00:00
case CURLINFO_HEADER_OUT :
convert_to_long_ex ( zvalue ) ;
if ( Z_LVAL_PP ( zvalue ) = = 1 ) {
curl_easy_setopt ( ch - > cp , CURLOPT_DEBUGFUNCTION , curl_debug ) ;
curl_easy_setopt ( ch - > cp , CURLOPT_DEBUGDATA , ( void * ) ch ) ;
curl_easy_setopt ( ch - > cp , CURLOPT_VERBOSE , 1 ) ;
} else {
curl_easy_setopt ( ch - > cp , CURLOPT_DEBUGFUNCTION , NULL ) ;
curl_easy_setopt ( ch - > cp , CURLOPT_DEBUGDATA , NULL ) ;
curl_easy_setopt ( ch - > cp , CURLOPT_VERBOSE , 0 ) ;
}
break ;
2000-09-30 03:09:54 +00:00
}
2002-04-03 23:59:36 +00:00
SAVE_CURL_ERROR ( ch , error ) ;
2001-04-30 14:36:19 +00:00
if ( error ! = CURLE_OK ) {
2006-01-24 20:11:14 +00:00
return 1 ;
2000-09-30 03:09:54 +00:00
} else {
2006-01-24 20:11:14 +00:00
return 0 ;
}
}
/* {{{ proto bool curl_setopt(resource ch, int option, mixed value)
Set an option for a CURL transfer */
PHP_FUNCTION ( curl_setopt )
{
zval * * zid , * * zoption , * * zvalue ;
php_curl * ch ;
if ( ZEND_NUM_ARGS ( ) ! = 3 | | zend_get_parameters_ex ( 3 , & zid , & zoption , & zvalue ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
ZEND_FETCH_RESOURCE ( ch , php_curl * , zid , - 1 , le_curl_name , le_curl ) ;
convert_to_long_ex ( zoption ) ;
if ( ! _php_curl_setopt ( ch , Z_LVAL_PP ( zoption ) , zvalue , return_value TSRMLS_CC ) ) {
2000-09-30 03:09:54 +00:00
RETURN_TRUE ;
2006-01-24 20:11:14 +00:00
} else {
RETURN_FALSE ;
2000-09-30 03:09:54 +00:00
}
2000-07-16 19:37:33 +00:00
}
/* }}} */
2006-01-24 20:11:14 +00:00
/* {{{ proto bool curl_setopt_array(resource ch, array options)
Set an array of option for a CURL transfer */
PHP_FUNCTION ( curl_setopt_array )
{
zval * zid , * arr , * * entry ;
php_curl * ch ;
long option ;
HashPosition pos ;
char * string_key ;
int str_key_len ;
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " za " , & zid , & arr ) = = FAILURE ) {
RETURN_FALSE ;
}
ZEND_FETCH_RESOURCE ( ch , php_curl * , & zid , - 1 , le_curl_name , le_curl ) ;
zend_hash_internal_pointer_reset_ex ( Z_ARRVAL_P ( arr ) , & pos ) ;
while ( zend_hash_get_current_data_ex ( Z_ARRVAL_P ( arr ) , ( void * * ) & entry , & pos ) = = SUCCESS ) {
if ( zend_hash_get_current_key_ex ( Z_ARRVAL_P ( arr ) , & string_key , & str_key_len , & option , 0 , & pos ) = = HASH_KEY_IS_STRING ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Array keys must be CURLOPT constants or equivalent interger values. " ) ;
RETURN_FALSE ;
}
if ( _php_curl_setopt ( ch , option , entry , return_value TSRMLS_CC ) ) {
RETURN_FALSE ;
}
zend_hash_move_forward_ex ( Z_ARRVAL_P ( arr ) , & pos ) ;
}
RETURN_TRUE ;
}
/* }}} */
2002-11-13 22:25:33 +00:00
/* {{{ _php_curl_cleanup_handle(ch)
2002-11-08 17:58:43 +00:00
Cleanup an execution phase */
2003-03-17 15:06:11 +00:00
void _php_curl_cleanup_handle ( php_curl * ch )
2002-11-08 17:58:43 +00:00
{
2005-07-18 13:47:33 +00:00
if ( ch - > handlers - > write - > buf . len > 0 ) {
2006-04-13 11:26:10 +00:00
smart_str_free ( & ch - > handlers - > write - > buf ) ;
2002-11-08 17:58:43 +00:00
}
2006-01-24 20:11:14 +00:00
if ( ch - > header . str_len ) {
efree ( ch - > header . str ) ;
ch - > header . str_len = 0 ;
}
2002-11-08 17:58:43 +00:00
memset ( ch - > err . str , 0 , CURL_ERROR_SIZE + 1 ) ;
ch - > err . no = 0 ;
}
/* }}} */
2002-03-18 18:00:24 +00:00
/* {{{ proto bool curl_exec(resource ch)
2000-07-16 19:37:33 +00:00
Perform a CURL session */
2000-08-27 22:53:33 +00:00
PHP_FUNCTION ( curl_exec )
2000-07-16 19:37:33 +00:00
{
2001-04-30 14:36:19 +00:00
zval * * zid ;
php_curl * ch ;
CURLcode error ;
2003-03-17 15:06:11 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & zid ) = = FAILURE ) {
2000-07-16 19:37:33 +00:00
WRONG_PARAM_COUNT ;
}
2003-03-17 15:06:11 +00:00
2001-04-30 14:36:19 +00:00
ZEND_FETCH_RESOURCE ( ch , php_curl * , zid , - 1 , le_curl_name , le_curl ) ;
2000-08-27 22:53:33 +00:00
2002-11-13 22:25:33 +00:00
_php_curl_cleanup_handle ( ch ) ;
2002-11-08 17:58:43 +00:00
2001-04-30 14:36:19 +00:00
error = curl_easy_perform ( ch - > cp ) ;
2002-04-03 23:59:36 +00:00
SAVE_CURL_ERROR ( ch , error ) ;
2004-02-23 19:50:07 +00:00
/* CURLE_PARTIAL_FILE is returned by HEAD requests */
if ( error ! = CURLE_OK & & error ! = CURLE_PARTIAL_FILE ) {
2002-11-08 17:58:43 +00:00
if ( ch - > handlers - > write - > buf . len > 0 ) {
2001-07-10 20:09:56 +00:00
smart_str_free ( & ch - > handlers - > write - > buf ) ;
2002-11-08 17:58:43 +00:00
}
2001-04-30 14:36:19 +00:00
RETURN_FALSE ;
2000-08-17 02:14:41 +00:00
}
2000-09-30 03:09:54 +00:00
2002-11-08 17:58:43 +00:00
ch - > uses + + ;
2001-12-24 13:58:03 +00:00
if ( ch - > handlers - > write - > method = = PHP_CURL_RETURN & & ch - > handlers - > write - > buf . len > 0 ) {
2005-06-26 17:31:07 +00:00
- - ch - > uses ;
2006-04-13 11:26:10 +00:00
smart_str_0 ( & ch - > handlers - > write - > buf ) ;
RETURN_STRINGL ( ch - > handlers - > write - > buf . c , ch - > handlers - > write - > buf . len , 1 ) ;
2000-08-27 22:53:33 +00:00
}
2005-06-26 17:31:07 +00:00
- - ch - > uses ;
2001-04-30 14:36:19 +00:00
RETURN_TRUE ;
2000-07-16 19:37:33 +00:00
}
/* }}} */
2006-06-11 01:42:17 +00:00
/* {{{ proto mixed curl_getinfo(resource ch [, int option])
2000-10-20 04:57:14 +00:00
Get information regarding a specific transfer */
PHP_FUNCTION ( curl_getinfo )
{
2001-04-30 14:36:19 +00:00
zval * * zid ,
* * zoption ;
php_curl * ch ;
2003-03-17 15:06:11 +00:00
int option , argc = ZEND_NUM_ARGS ( ) ;
2001-04-30 14:36:19 +00:00
2003-03-17 15:06:11 +00:00
if ( argc < 1 | | argc > 2 | | zend_get_parameters_ex ( argc , & zid , & zoption ) = = FAILURE ) {
2000-10-20 04:57:14 +00:00
WRONG_PARAM_COUNT ;
}
2003-03-17 15:06:11 +00:00
2001-04-30 14:36:19 +00:00
ZEND_FETCH_RESOURCE ( ch , php_curl * , zid , - 1 , le_curl_name , le_curl ) ;
2000-10-20 04:57:14 +00:00
if ( argc < 2 ) {
2002-11-08 17:58:43 +00:00
char * s_code ;
2001-04-30 14:36:19 +00:00
long l_code ;
double d_code ;
2000-10-20 04:57:14 +00:00
array_init ( return_value ) ;
2003-02-28 07:34:45 +00:00
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_EFFECTIVE_URL , & s_code ) = = CURLE_OK ) {
CAAS ( " url " , s_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_CONTENT_TYPE , & s_code ) = = CURLE_OK ) {
if ( s_code ! = NULL ) {
CAAS ( " content_type " , s_code ) ;
}
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_HTTP_CODE , & l_code ) = = CURLE_OK ) {
CAAL ( " http_code " , l_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_HEADER_SIZE , & l_code ) = = CURLE_OK ) {
CAAL ( " header_size " , l_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_REQUEST_SIZE , & l_code ) = = CURLE_OK ) {
CAAL ( " request_size " , l_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_FILETIME , & l_code ) = = CURLE_OK ) {
CAAL ( " filetime " , l_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_SSL_VERIFYRESULT , & l_code ) = = CURLE_OK ) {
CAAL ( " ssl_verify_result " , l_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_REDIRECT_COUNT , & l_code ) = = CURLE_OK ) {
CAAL ( " redirect_count " , l_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_TOTAL_TIME , & d_code ) = = CURLE_OK ) {
CAAD ( " total_time " , d_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_NAMELOOKUP_TIME , & d_code ) = = CURLE_OK ) {
CAAD ( " namelookup_time " , d_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_CONNECT_TIME , & d_code ) = = CURLE_OK ) {
CAAD ( " connect_time " , d_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_PRETRANSFER_TIME , & d_code ) = = CURLE_OK ) {
CAAD ( " pretransfer_time " , d_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_SIZE_UPLOAD , & d_code ) = = CURLE_OK ) {
CAAD ( " size_upload " , d_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_SIZE_DOWNLOAD , & d_code ) = = CURLE_OK ) {
CAAD ( " size_download " , d_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_SPEED_DOWNLOAD , & d_code ) = = CURLE_OK ) {
CAAD ( " speed_download " , d_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_SPEED_UPLOAD , & d_code ) = = CURLE_OK ) {
CAAD ( " speed_upload " , d_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_CONTENT_LENGTH_DOWNLOAD , & d_code ) = = CURLE_OK ) {
CAAD ( " download_content_length " , d_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_CONTENT_LENGTH_UPLOAD , & d_code ) = = CURLE_OK ) {
CAAD ( " upload_content_length " , d_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_STARTTRANSFER_TIME , & d_code ) = = CURLE_OK ) {
CAAD ( " starttransfer_time " , d_code ) ;
}
if ( curl_easy_getinfo ( ch - > cp , CURLINFO_REDIRECT_TIME , & d_code ) = = CURLE_OK ) {
CAAD ( " redirect_time " , d_code ) ;
}
2006-01-24 20:11:14 +00:00
if ( ch - > header . str_len > 0 ) {
CAAS ( " request_header " , ch - > header . str ) ;
}
2000-10-20 04:57:14 +00:00
} else {
2001-04-30 14:36:19 +00:00
option = Z_LVAL_PP ( zoption ) ;
switch ( option ) {
2003-03-17 15:06:11 +00:00
case CURLINFO_EFFECTIVE_URL :
case CURLINFO_CONTENT_TYPE : {
2004-10-18 22:41:24 +00:00
char * s_code = NULL ;
2001-04-30 14:36:19 +00:00
2004-10-18 22:41:24 +00:00
if ( curl_easy_getinfo ( ch - > cp , option , & s_code ) = = CURLE_OK & & s_code ) {
RETURN_STRING ( s_code , 1 ) ;
} else {
RETURN_FALSE ;
}
2003-03-17 15:06:11 +00:00
break ;
}
case CURLINFO_HTTP_CODE :
case CURLINFO_HEADER_SIZE :
case CURLINFO_REQUEST_SIZE :
case CURLINFO_FILETIME :
case CURLINFO_SSL_VERIFYRESULT :
case CURLINFO_REDIRECT_COUNT : {
2004-10-18 22:41:24 +00:00
long code = 0 ;
2003-03-17 15:06:11 +00:00
2004-10-18 22:41:24 +00:00
if ( curl_easy_getinfo ( ch - > cp , option , & code ) = = CURLE_OK ) {
RETURN_LONG ( code ) ;
} else {
RETURN_FALSE ;
}
2003-03-17 15:06:11 +00:00
break ;
}
case CURLINFO_TOTAL_TIME :
case CURLINFO_NAMELOOKUP_TIME :
case CURLINFO_CONNECT_TIME :
case CURLINFO_PRETRANSFER_TIME :
case CURLINFO_SIZE_UPLOAD :
case CURLINFO_SIZE_DOWNLOAD :
case CURLINFO_SPEED_DOWNLOAD :
case CURLINFO_SPEED_UPLOAD :
case CURLINFO_CONTENT_LENGTH_DOWNLOAD :
case CURLINFO_CONTENT_LENGTH_UPLOAD :
case CURLINFO_STARTTRANSFER_TIME :
case CURLINFO_REDIRECT_TIME : {
2004-10-18 22:41:24 +00:00
double code = 0.0 ;
2003-03-17 15:06:11 +00:00
2004-10-18 22:41:24 +00:00
if ( curl_easy_getinfo ( ch - > cp , option , & code ) = = CURLE_OK ) {
RETURN_DOUBLE ( code ) ;
} else {
RETURN_FALSE ;
}
2003-03-17 15:06:11 +00:00
break ;
}
2006-01-24 20:11:14 +00:00
case CURLINFO_HEADER_OUT :
if ( ch - > header . str_len > 0 ) {
RETURN_STRINGL ( ch - > header . str , ch - > header . str_len , 1 ) ;
} else {
RETURN_FALSE ;
}
2000-10-20 04:57:14 +00:00
}
2003-03-17 15:06:11 +00:00
}
2000-10-20 04:57:14 +00:00
}
/* }}} */
2002-03-18 18:00:24 +00:00
/* {{{ proto string curl_error(resource ch)
2000-09-30 03:09:54 +00:00
Return a string contain the last error for the current session */
PHP_FUNCTION ( curl_error )
2000-07-16 19:37:33 +00:00
{
2001-04-30 14:36:19 +00:00
zval * * zid ;
php_curl * ch ;
2000-07-16 19:37:33 +00:00
2003-03-17 15:06:11 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & zid ) = = FAILURE ) {
2000-07-16 19:37:33 +00:00
WRONG_PARAM_COUNT ;
}
2003-03-17 15:06:11 +00:00
2001-04-30 14:36:19 +00:00
ZEND_FETCH_RESOURCE ( ch , php_curl * , zid , - 1 , le_curl_name , le_curl ) ;
2001-03-03 01:06:55 +00:00
2001-07-02 12:08:21 +00:00
ch - > err . str [ CURL_ERROR_SIZE ] = 0 ;
2001-09-10 11:06:15 +00:00
RETURN_STRING ( ch - > err . str , 1 ) ;
2000-07-16 19:37:33 +00:00
}
/* }}} */
2002-03-18 18:00:24 +00:00
/* {{{ proto int curl_errno(resource ch)
2000-09-30 03:09:54 +00:00
Return an integer containing the last error number */
PHP_FUNCTION ( curl_errno )
{
2001-04-30 14:36:19 +00:00
zval * * zid ;
php_curl * ch ;
2003-03-17 15:06:11 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & zid ) = = FAILURE ) {
2000-09-30 03:09:54 +00:00
WRONG_PARAM_COUNT ;
}
2003-03-17 15:06:11 +00:00
2001-04-30 14:36:19 +00:00
ZEND_FETCH_RESOURCE ( ch , php_curl * , zid , - 1 , le_curl_name , le_curl ) ;
RETURN_LONG ( ch - > err . no ) ;
2000-09-30 03:09:54 +00:00
}
/* }}} */
2000-08-13 19:32:09 +00:00
2002-03-18 18:00:24 +00:00
/* {{{ proto void curl_close(resource ch)
2000-09-30 03:09:54 +00:00
Close a CURL session */
2000-10-20 04:57:14 +00:00
PHP_FUNCTION ( curl_close )
2000-08-13 19:32:09 +00:00
{
2001-04-30 14:36:19 +00:00
zval * * zid ;
php_curl * ch ;
2003-03-17 15:06:11 +00:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & zid ) = = FAILURE ) {
2000-09-30 03:09:54 +00:00
WRONG_PARAM_COUNT ;
2000-08-13 19:32:09 +00:00
}
2003-03-17 15:06:11 +00:00
2001-04-30 14:36:19 +00:00
ZEND_FETCH_RESOURCE ( ch , php_curl * , zid , - 1 , le_curl_name , le_curl ) ;
2005-06-02 21:04:12 +00:00
if ( ch - > in_callback ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Attempt to close CURL handle from a callback " ) ;
return ;
}
2004-03-11 00:11:18 +00:00
if ( ch - > uses ) {
ch - > uses - - ;
} else {
zend_list_delete ( Z_LVAL_PP ( zid ) ) ;
}
2000-08-13 19:32:09 +00:00
}
2000-09-30 03:09:54 +00:00
/* }}} */
2000-08-13 19:32:09 +00:00
2000-09-30 03:09:54 +00:00
/* {{{ _php_curl_close()
List destructor for curl handles */
2001-07-31 05:44:11 +00:00
static void _php_curl_close ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
2000-08-15 16:50:14 +00:00
{
2001-04-30 14:36:19 +00:00
php_curl * ch = ( php_curl * ) rsrc - > ptr ;
2002-11-13 22:25:33 +00:00
# if PHP_CURL_DEBUG
fprintf ( stderr , " DTOR CALLED, ch = %x \n " , ch ) ;
# endif
2001-04-30 14:36:19 +00:00
curl_easy_cleanup ( ch - > cp ) ;
zend_llist_clean ( & ch - > to_free . str ) ;
zend_llist_clean ( & ch - > to_free . slist ) ;
zend_llist_clean ( & ch - > to_free . post ) ;
2006-04-13 11:26:10 +00:00
if ( ch - > handlers - > write - > buf . len > 0 ) {
smart_str_free ( & ch - > handlers - > write - > buf ) ;
}
2003-05-21 23:15:28 +00:00
if ( ch - > handlers - > write - > func_name ) {
zval_ptr_dtor ( & ch - > handlers - > write - > func_name ) ;
2003-03-17 15:06:11 +00:00
}
2003-05-21 23:15:28 +00:00
if ( ch - > handlers - > read - > func_name ) {
zval_ptr_dtor ( & ch - > handlers - > read - > func_name ) ;
2003-03-17 15:06:11 +00:00
}
2003-05-21 23:15:28 +00:00
if ( ch - > handlers - > write_header - > func_name ) {
zval_ptr_dtor ( & ch - > handlers - > write_header - > func_name ) ;
2003-03-17 15:06:11 +00:00
}
if ( ch - > handlers - > passwd ) {
2002-11-08 17:58:43 +00:00
zval_ptr_dtor ( & ch - > handlers - > passwd ) ;
2003-03-17 15:06:11 +00:00
}
2006-01-24 20:11:14 +00:00
if ( ch - > header . str_len > 0 ) {
efree ( ch - > header . str ) ;
}
2006-04-13 11:26:10 +00:00
2001-05-04 04:20:38 +00:00
efree ( ch - > handlers - > write ) ;
2001-06-25 15:14:20 +00:00
efree ( ch - > handlers - > write_header ) ;
2001-05-04 04:20:38 +00:00
efree ( ch - > handlers - > read ) ;
2001-04-30 14:36:19 +00:00
efree ( ch - > handlers ) ;
efree ( ch ) ;
}
2000-09-30 03:09:54 +00:00
/* }}} */
2000-08-15 16:50:14 +00:00
2005-10-25 14:32:33 +00:00
# endif /* HAVE_CURL */
2001-06-05 13:12:10 +00:00
/*
* Local variables :
* tab - width : 4
* c - basic - offset : 4
* End :
2002-10-21 22:35:59 +00:00
* vim600 : fdm = marker
* vim : noet sw = 4 ts = 4
2001-06-05 13:12:10 +00:00
*/