2000-07-17 03:37:33 +08:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2004-01-08 16:18:22 +08:00
| PHP Version 5 |
2000-07-17 03:37:33 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2004-01-08 16:18:22 +08:00
| Copyright ( c ) 1997 - 2004 The PHP Group |
2000-07-17 03:37:33 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2003-06-11 04:04:29 +08:00
| This source file is subject to version 3.0 of the PHP license , |
2000-07-17 03:37:33 +08:00
| that is bundled with this package in the file LICENSE , and is |
2003-06-11 04:04:29 +08:00
| available through the world - wide - web at the following url : |
| http : //www.php.net/license/3_0.txt. |
2000-07-17 03:37:33 +08: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-16 00:20:13 +08:00
| Author : Sterling Hughes < sterling @ php . net > |
2000-07-17 03:37:33 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
/* $Id$ */
2003-02-25 15:19:44 +08:00
# define ZEND_INCLUDE_FULL_WINDOWS_HEADERS
2001-05-24 18:07:29 +08:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
2000-07-17 03:37:33 +08:00
# include "php.h"
# if HAVE_CURL
# include <stdio.h>
2000-09-30 11:09:54 +08:00
# include <string.h>
2000-08-16 00:50:14 +08:00
# ifdef PHP_WIN32
2003-02-16 11:48:49 +08:00
# include <winsock2.h>
2000-08-20 16:28:00 +08:00
# include <sys/types.h>
2000-08-16 00:50:14 +08:00
# endif
2000-09-30 11:09:54 +08:00
2000-07-17 03:37:33 +08:00
# include <curl/curl.h>
# include <curl/easy.h>
2000-09-30 11:09:54 +08:00
2001-08-03 03:28:33 +08:00
# define SMART_STR_PREALLOC 4096
# include "ext/standard/php_smart_str.h"
2000-07-17 03:37:33 +08:00
# include "ext/standard/info.h"
2000-11-23 23:57:24 +08:00
# include "ext/standard/file.h"
2000-07-17 03:37:33 +08:00
# include "php_curl.h"
2001-07-31 13:44:11 +08:00
static void _php_curl_close ( zend_rsrc_list_entry * rsrc TSRMLS_DC ) ;
2001-04-30 22:36:19 +08:00
# define SAVE_CURL_ERROR(__handle, __err) (__handle)->err.no = (int) __err;
2000-09-30 11:09:54 +08:00
2002-11-09 01:58:43 +08: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);
2001-06-05 21:12:10 +08:00
/* {{{ curl_functions[]
*/
2000-07-17 03:37:33 +08:00
function_entry curl_functions [ ] = {
2002-11-14 06:25:33 +08:00
PHP_FE ( curl_init , NULL )
2004-03-13 02:37:55 +08:00
PHP_FE ( curl_copy_handle , NULL )
2002-11-14 06:25:33 +08:00
PHP_FE ( curl_version , NULL )
PHP_FE ( curl_setopt , NULL )
PHP_FE ( curl_exec , NULL )
PHP_FE ( curl_getinfo , NULL )
PHP_FE ( curl_error , NULL )
PHP_FE ( curl_errno , NULL )
PHP_FE ( curl_close , NULL )
PHP_FE ( curl_multi_init , NULL )
PHP_FE ( curl_multi_add_handle , NULL )
PHP_FE ( curl_multi_remove_handle , NULL )
PHP_FE ( curl_multi_select , NULL )
2003-08-04 01:44:39 +08:00
PHP_FE ( curl_multi_exec , second_arg_force_ref )
2002-11-14 06:25:33 +08:00
PHP_FE ( curl_multi_getcontent , NULL )
PHP_FE ( curl_multi_info_read , NULL )
PHP_FE ( curl_multi_close , NULL )
2000-07-17 03:37:33 +08:00
{ NULL , NULL , NULL }
} ;
2001-06-05 21:12:10 +08:00
/* }}} */
2000-07-17 03:37:33 +08:00
2001-06-05 21:12:10 +08:00
/* {{{ curl_module_entry
*/
2000-07-17 03:37:33 +08:00
zend_module_entry curl_module_entry = {
2001-10-12 07:33:59 +08:00
STANDARD_MODULE_HEADER ,
2000-07-17 03:37:33 +08:00
" curl " ,
curl_functions ,
PHP_MINIT ( curl ) ,
2001-09-22 08:38:59 +08:00
PHP_MSHUTDOWN ( curl ) ,
2000-08-17 10:14:41 +08:00
NULL ,
2000-07-17 03:37:33 +08:00
NULL ,
PHP_MINFO ( curl ) ,
2001-12-10 21:22:48 +08:00
NO_VERSION_YET ,
2000-07-17 03:37:33 +08:00
STANDARD_MODULE_PROPERTIES
} ;
2001-06-05 21:12:10 +08:00
/* }}} */
2000-07-17 03:37:33 +08:00
# ifdef COMPILE_DL_CURL
ZEND_GET_MODULE ( curl )
2003-08-31 20:41:53 +08:00
# ifdef PHP_WIN32
# include "zend_arg_defs.c"
# endif
2000-07-17 03:37:33 +08:00
# endif
2001-06-05 21:12:10 +08:00
/* {{{ PHP_MINFO_FUNCTION
*/
2000-07-17 03:37:33 +08:00
PHP_MINFO_FUNCTION ( curl )
{
2000-08-14 03:32:09 +08:00
php_info_print_table_start ( ) ;
2001-03-21 05:30:42 +08:00
php_info_print_table_row ( 2 , " CURL support " , " enabled " ) ;
2000-08-14 03:32:09 +08:00
php_info_print_table_row ( 2 , " CURL Information " , curl_version ( ) ) ;
php_info_print_table_end ( ) ;
2000-07-17 03:37:33 +08:00
}
2001-06-05 21:12:10 +08:00
/* }}} */
2000-07-17 03:37:33 +08:00
2001-09-22 08:38:59 +08:00
# define REGISTER_CURL_CONSTANT(__c) REGISTER_LONG_CONSTANT(#__c, __c, CONST_CS | CONST_PERSISTENT)
2001-04-30 22:36:19 +08:00
2001-06-05 21:12:10 +08:00
/* {{{ PHP_MINIT_FUNCTION
*/
2000-07-17 03:37:33 +08:00
PHP_MINIT_FUNCTION ( curl )
{
2000-10-26 01:44:02 +08:00
le_curl = zend_register_list_destructors_ex ( _php_curl_close , NULL , " curl " , module_number ) ;
2002-11-14 06:25:33 +08:00
le_curl_multi_handle = zend_register_list_destructors_ex ( _php_curl_multi_close , NULL , " curl " , module_number ) ;
2000-08-16 00:50:14 +08:00
/* Constants for curl_setopt() */
2002-08-01 06:10:58 +08:00
REGISTER_CURL_CONSTANT ( CURLOPT_DNS_USE_GLOBAL_CACHE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_DNS_CACHE_TIMEOUT ) ;
2001-09-22 08:38:59 +08:00
REGISTER_CURL_CONSTANT ( CURLOPT_PORT ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_FILE ) ;
2004-03-13 00:12:47 +08:00
REGISTER_CURL_CONSTANT ( CURLOPT_READDATA ) ;
2001-09-22 08:38:59 +08: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 ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_MUTE ) ;
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-03 00:44:48 +08:00
REGISTER_CURL_CONSTANT ( CURLOPT_FTP_USE_EPSV ) ;
2001-09-22 08:38:59 +08: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 ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_SSLCERT ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_SSLCERTPASSWD ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_WRITEHEADER ) ;
2001-11-13 09:01:47 +08:00
REGISTER_CURL_CONSTANT ( CURLOPT_SSL_VERIFYHOST ) ;
2001-09-22 08:38:59 +08: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 21:52:00 +08:00
REGISTER_CURL_CONSTANT ( CURLOPT_CAPATH ) ;
2001-09-22 08:38:59 +08:00
REGISTER_CURL_CONSTANT ( CURLOPT_COOKIEJAR ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_SSL_CIPHER_LIST ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_BINARYTRANSFER ) ;
2002-11-14 06:25:33 +08:00
REGISTER_CURL_CONSTANT ( CURLOPT_NOSIGNAL ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_PROXYTYPE ) ;
REGISTER_CURL_CONSTANT ( CURLOPT_BUFFERSIZE ) ;
2002-11-09 21:52:00 +08: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-20 06:12:21 +08:00
REGISTER_CURL_CONSTANT ( CURLOPT_SSLCERTTYPE ) ;
2002-11-09 21:52:00 +08:00
REGISTER_CURL_CONSTANT ( CURLOPT_CRLF ) ;
2003-02-03 04:56:51 +08:00
REGISTER_CURL_CONSTANT ( CURLOPT_ENCODING ) ;
2003-06-20 06:12:21 +08: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-01-26 12:59:59 +08:00
# if LIBCURL_VERSION_NUM > 0x070a05 /* CURLOPT_HTTPAUTH is available since curl 7.10.6 */
2003-06-20 06:12:21 +08:00
REGISTER_CURL_CONSTANT ( CURLOPT_HTTPAUTH ) ;
/* http authentication options */
2004-01-26 12:59:59 +08: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-20 06:12:21 +08:00
# endif
2001-05-15 05:02:31 +08:00
2001-04-30 22:36:19 +08:00
/* Constants effecting the way CURLOPT_CLOSEPOLICY works */
2001-09-22 08:38:59 +08: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 12:57:14 +08:00
/* Info constants */
2001-09-22 08:38:59 +08: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-25 02:45:08 +08:00
REGISTER_CURL_CONSTANT ( CURLINFO_SSL_VERIFYRESULT ) ;
2001-09-22 08:38:59 +08:00
REGISTER_CURL_CONSTANT ( CURLINFO_CONTENT_LENGTH_DOWNLOAD ) ;
REGISTER_CURL_CONSTANT ( CURLINFO_CONTENT_LENGTH_UPLOAD ) ;
2002-11-09 01:58:43 +08: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 ) ;
2002-11-14 06:25:33 +08: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-16 00:50:14 +08:00
/* Error Constants */
2001-09-22 08:38:59 +08: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 ) ;
2001-11-13 19:47:52 +08:00
2002-11-14 06:25:33 +08:00
REGISTER_CURL_CONSTANT ( CURLPROXY_HTTP ) ;
REGISTER_CURL_CONSTANT ( CURLPROXY_SOCKS5 ) ;
2002-11-09 21:52:00 +08: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-14 06:25:33 +08: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 ) ;
2002-11-09 21:52:00 +08:00
2002-01-27 14:11:50 +08:00
if ( curl_global_init ( CURL_GLOBAL_SSL ) ! = CURLE_OK ) {
2001-09-22 08:38:59 +08:00
return FAILURE ;
}
2002-08-12 23:56:13 +08:00
# ifdef PHP_CURL_URL_WRAPPERS
2002-11-14 19:41:24 +08: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 23:56:13 +08: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 19:41:24 +08:00
# endif
2002-08-12 23:56:13 +08:00
# endif
2001-09-22 08:38:59 +08:00
return SUCCESS ;
}
/* }}} */
/* {{{ PHP_MSHUTDOWN_FUNCTION
*/
PHP_MSHUTDOWN_FUNCTION ( curl )
{
2002-08-12 23:56:13 +08: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 ) ;
# endif
2001-09-22 08:38:59 +08:00
curl_global_cleanup ( ) ;
2001-04-30 22:36:19 +08:00
2000-10-23 01:29:33 +08:00
return SUCCESS ;
2000-08-16 00:50:14 +08:00
}
2001-06-05 21:12:10 +08:00
/* }}} */
2000-08-16 00:50:14 +08:00
2001-06-05 21:12:10 +08:00
/* {{{ curl_write
*/
2001-10-19 03:24:51 +08:00
static size_t curl_write ( char * data , size_t size , size_t nmemb , void * ctx )
2001-04-30 22:36:19 +08:00
{
php_curl * ch = ( php_curl * ) ctx ;
2001-05-04 12:20:38 +08:00
php_curl_write * t = ch - > handlers - > write ;
2001-04-30 22:36:19 +08:00
size_t length = size * nmemb ;
2003-04-28 06:15:19 +08:00
TSRMLS_FETCH_FROM_CTX ( ch - > thread_ctx ) ;
2001-04-30 22:36:19 +08:00
2002-11-14 06:25:33 +08:00
# if PHP_CURL_DEBUG
fprintf ( stderr , " curl_write() called \n " ) ;
2003-03-17 23:06:11 +08:00
fprintf ( stderr , " data = %s, size = %d, nmemb = %d, ctx = %x \n " , data , size , nmemb , ctx ) ;
2002-11-14 06:25:33 +08:00
# endif
2001-04-30 22:36:19 +08:00
switch ( t - > method ) {
2003-03-17 23:06:11 +08:00
case PHP_CURL_STDOUT :
2003-05-17 22:12:36 +08:00
PHPWRITE ( data , length ) ;
2003-03-17 23:06:11 +08: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-22 07:15:28 +08:00
zval * * argv [ 2 ] ;
zval * retval_ptr = NULL ;
zval * handle = NULL ;
zval * zdata = NULL ;
2003-03-17 23:06:11 +08:00
int error ;
2003-08-05 18:29:03 +08:00
zend_fcall_info fci ;
2001-04-30 22:36:19 +08:00
2003-05-22 07:15:28 +08:00
MAKE_STD_ZVAL ( handle ) ;
ZVAL_RESOURCE ( handle , ch - > id ) ;
2003-03-17 23:06:11 +08:00
zend_list_addref ( ch - > id ) ;
2003-05-22 07:15:28 +08:00
argv [ 0 ] = & handle ;
MAKE_STD_ZVAL ( zdata ) ;
ZVAL_STRINGL ( zdata , data , length , 1 ) ;
argv [ 1 ] = & zdata ;
2003-03-17 23:06:11 +08:00
2003-08-05 18:29:03 +08: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 ;
error = zend_call_function ( & fci , & t - > fci_cache TSRMLS_CC ) ;
2003-03-17 23:06:11 +08:00
if ( error = = FAILURE ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not call the CURLOPT_WRITEFUNCTION " ) ;
length = - 1 ;
} else {
2004-03-13 01:31:10 +08:00
if ( Z_TYPE_P ( retval_ptr ) ! = IS_LONG ) {
convert_to_long_ex ( & retval_ptr ) ;
}
2003-05-22 07:15:28 +08:00
length = Z_LVAL_P ( retval_ptr ) ;
2003-03-17 23:06:11 +08:00
}
2003-05-22 07:15:28 +08:00
zval_ptr_dtor ( argv [ 0 ] ) ;
zval_ptr_dtor ( argv [ 1 ] ) ;
zval_ptr_dtor ( & retval_ptr ) ;
2003-03-17 23:06:11 +08:00
break ;
}
2001-04-30 22:36:19 +08:00
}
return length ;
}
2001-06-05 21:12:10 +08:00
/* }}} */
2001-04-30 22:36:19 +08:00
2001-06-05 21:12:10 +08:00
/* {{{ curl_read
*/
2001-05-04 12:20:38 +08:00
static size_t curl_read ( char * data , size_t size , size_t nmemb , void * ctx )
2001-04-30 22:36:19 +08:00
{
php_curl * ch = ( php_curl * ) ctx ;
2001-05-04 12:20:38 +08:00
php_curl_read * t = ch - > handlers - > read ;
2001-04-30 22:36:19 +08:00
int length = - 1 ;
switch ( t - > method ) {
2003-03-17 23:06:11 +08:00
case PHP_CURL_DIRECT :
if ( t - > fp ) {
length = fread ( data , size , nmemb , t - > fp ) ;
}
break ;
case PHP_CURL_USER : {
2003-05-22 07:27:12 +08:00
zval * * argv [ 3 ] ;
zval * handle = NULL ;
zval * zfd = NULL ;
zval * zlength = NULL ;
zval * retval_ptr ;
2003-03-17 23:06:11 +08:00
int error ;
2003-08-05 18:29:03 +08:00
zend_fcall_info fci ;
2003-04-28 06:15:19 +08:00
TSRMLS_FETCH_FROM_CTX ( ch - > thread_ctx ) ;
2001-04-30 22:36:19 +08:00
2003-05-22 07:27:12 +08:00
MAKE_STD_ZVAL ( handle ) ;
MAKE_STD_ZVAL ( zfd ) ;
MAKE_STD_ZVAL ( zlength ) ;
2003-03-17 23:06:11 +08:00
2003-05-22 07:27:12 +08:00
ZVAL_RESOURCE ( handle , ch - > id ) ;
2003-03-17 23:06:11 +08:00
zend_list_addref ( ch - > id ) ;
2003-05-22 07:27:12 +08:00
ZVAL_RESOURCE ( zfd , t - > fd ) ;
2003-03-17 23:06:11 +08:00
zend_list_addref ( t - > fd ) ;
2003-05-22 07:27:12 +08:00
ZVAL_LONG ( zlength , ( int ) size * nmemb ) ;
2003-03-17 23:06:11 +08:00
2003-05-22 07:27:12 +08:00
argv [ 0 ] = & handle ;
argv [ 1 ] = & zfd ;
argv [ 2 ] = & zlength ;
2003-08-05 18:29:03 +08: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 ;
error = zend_call_function ( & fci , & t - > fci_cache TSRMLS_CC ) ;
2003-03-17 23:06:11 +08:00
if ( error = = FAILURE ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Cannot call the CURLOPT_READFUNCTION " ) ;
} else {
2004-03-13 00:36:30 +08:00
if ( Z_TYPE_P ( retval_ptr ) = = IS_STRING ) {
2004-03-13 01:31:10 +08:00
length = MIN ( size * nmemb , Z_STRLEN_P ( retval_ptr ) ) ;
memcpy ( data , Z_STRVAL_P ( retval_ptr ) , length ) ;
2004-03-13 00:08:11 +08:00
}
2003-03-17 23:06:11 +08:00
}
2003-05-22 07:27:12 +08:00
zval_ptr_dtor ( argv [ 0 ] ) ;
zval_ptr_dtor ( argv [ 1 ] ) ;
zval_ptr_dtor ( argv [ 2 ] ) ;
zval_ptr_dtor ( & retval_ptr ) ;
2003-03-17 23:06:11 +08:00
break ;
}
2001-04-30 22:36:19 +08:00
}
return length ;
}
2001-06-05 21:12:10 +08:00
/* }}} */
2001-04-30 22:36:19 +08:00
2001-06-25 23:14:20 +08:00
/* {{{ curl_write_header
2001-06-05 21:12:10 +08:00
*/
2001-10-19 03:24:51 +08:00
static size_t curl_write_header ( char * data , size_t size , size_t nmemb , void * ctx )
2001-04-30 22:36:19 +08:00
{
2001-06-25 23:14:20 +08:00
php_curl * ch = ( php_curl * ) ctx ;
php_curl_write * t = ch - > handlers - > write_header ;
2002-03-24 18:40:21 +08:00
size_t length = size * nmemb ;
2003-04-28 06:15:19 +08:00
TSRMLS_FETCH_FROM_CTX ( ch - > thread_ctx ) ;
2001-06-25 23:14:20 +08:00
switch ( t - > method ) {
2002-07-03 20:02:17 +08:00
case PHP_CURL_STDOUT :
/* Handle special case write when we're returning the entire transfer
*/
2003-03-17 23:06:11 +08:00
if ( ch - > handlers - > write - > method = = PHP_CURL_RETURN ) {
2002-07-03 20:02:17 +08:00
smart_str_appendl ( & ch - > handlers - > write - > buf , data , ( int ) length ) ;
2003-03-17 23:06:11 +08:00
} else {
2003-05-17 22:12:36 +08:00
PHPWRITE ( data , length ) ;
2003-03-17 23:06:11 +08:00
}
2002-07-03 20:02:17 +08:00
break ;
case PHP_CURL_FILE :
return fwrite ( data , size , nmemb , t - > fp ) ;
case PHP_CURL_USER : {
2003-05-22 07:27:12 +08:00
zval * * argv [ 2 ] ;
zval * handle = NULL ;
zval * zdata = NULL ;
zval * retval_ptr ;
2002-07-03 20:02:17 +08:00
int error ;
2003-08-05 18:29:03 +08:00
zend_fcall_info fci ;
2002-07-03 20:02:17 +08:00
2003-05-22 07:27:12 +08:00
MAKE_STD_ZVAL ( handle ) ;
MAKE_STD_ZVAL ( zdata ) ;
2002-07-03 20:02:17 +08:00
2003-05-22 07:27:12 +08:00
ZVAL_RESOURCE ( handle , ch - > id ) ;
2002-07-03 20:02:17 +08:00
zend_list_addref ( ch - > id ) ;
2003-05-22 07:27:12 +08:00
ZVAL_STRINGL ( zdata , data , length , 1 ) ;
2002-07-03 20:02:17 +08:00
2003-05-22 07:27:12 +08:00
argv [ 0 ] = & handle ;
argv [ 1 ] = & zdata ;
2003-08-05 18:29:03 +08: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 ;
2003-08-06 07:50:59 +08:00
error = zend_call_function ( & fci , & t - > fci_cache TSRMLS_CC ) ;
2002-07-03 20:02:17 +08:00
if ( error = = FAILURE ) {
2003-03-17 23:06:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not call the CURLOPT_HEADERFUNCTION " ) ;
2002-07-03 20:02:17 +08:00
length = - 1 ;
2003-03-17 23:06:11 +08:00
} else {
2004-03-13 01:31:10 +08:00
if ( Z_TYPE_P ( retval_ptr ) ! = IS_LONG ) {
convert_to_long_ex ( & retval_ptr ) ;
}
2003-05-22 07:27:12 +08:00
length = Z_LVAL_P ( retval_ptr ) ;
2002-07-03 20:02:17 +08:00
}
2003-05-22 07:27:12 +08:00
zval_ptr_dtor ( argv [ 0 ] ) ;
zval_ptr_dtor ( argv [ 1 ] ) ;
zval_ptr_dtor ( & retval_ptr ) ;
2002-07-03 20:02:17 +08:00
break ;
2001-06-25 23:14:20 +08:00
}
2004-03-13 01:31:10 +08:00
2002-07-03 20:02:17 +08:00
case PHP_CURL_IGNORE :
return length ;
2004-03-13 01:31:10 +08:00
default :
return - 1 ;
2001-04-30 22:36:19 +08:00
}
2003-03-17 23:06:11 +08:00
2001-04-30 22:36:19 +08:00
return length ;
}
2001-06-05 21:12:10 +08:00
/* }}} */
2001-04-30 22:36:19 +08:00
2001-06-25 23:14:20 +08:00
/* {{{ curl_passwd
2001-06-05 21:12:10 +08:00
*/
2001-06-25 23:14:20 +08:00
static size_t curl_passwd ( void * ctx , char * prompt , char * buf , int buflen )
2001-04-30 22:36:19 +08:00
{
php_curl * ch = ( php_curl * ) ctx ;
zval * func = ch - > handlers - > passwd ;
zval * argv [ 3 ] ;
2001-10-19 01:46:57 +08:00
zval * retval = NULL ;
2001-04-30 22:36:19 +08:00
int error ;
2004-03-13 01:31:10 +08:00
int ret = - 1 ;
2003-04-28 06:15:19 +08:00
TSRMLS_FETCH_FROM_CTX ( ch - > thread_ctx ) ;
2001-04-30 22:36:19 +08: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 23:06:11 +08:00
error = call_user_function ( EG ( function_table ) , NULL , func , retval , 2 , argv TSRMLS_CC ) ;
2001-04-30 22:36:19 +08:00
if ( error = = FAILURE ) {
2003-03-17 23:06:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not call the CURLOPT_PASSWDFUNCTION " ) ;
2004-03-13 01:37:04 +08: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 23:06:11 +08:00
} else {
2004-03-13 01:37:04 +08:00
strlcpy ( buf , Z_STRVAL_P ( retval ) , Z_STRLEN_P ( retval ) ) ;
2001-06-25 23:14:20 +08:00
}
2004-03-13 01:37:04 +08: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 22:36:19 +08:00
}
2001-06-25 23:14:20 +08:00
2001-04-30 22:36:19 +08:00
zval_ptr_dtor ( & argv [ 0 ] ) ;
zval_ptr_dtor ( & argv [ 1 ] ) ;
zval_ptr_dtor ( & argv [ 2 ] ) ;
zval_ptr_dtor ( & retval ) ;
2001-06-25 23:14:20 +08:00
return ret ;
2001-04-30 22:36:19 +08:00
}
2001-06-05 21:12:10 +08:00
/* }}} */
2001-04-30 22:36:19 +08:00
2001-06-05 21:12:10 +08:00
/* {{{ curl_free_string
*/
2001-04-30 22:36:19 +08:00
static void curl_free_string ( void * * string )
{
2000-11-24 00:31:58 +08:00
efree ( * string ) ;
2001-06-05 21:12:10 +08:00
}
/* }}} */
2000-08-16 00:50:14 +08:00
2001-06-05 21:12:10 +08:00
/* {{{ curl_free_post
*/
2001-04-30 22:36:19 +08:00
static void curl_free_post ( void * * post )
{
curl_formfree ( ( struct HttpPost * ) * post ) ;
}
2001-06-05 21:12:10 +08:00
/* }}} */
2001-04-30 22:36:19 +08:00
2001-06-05 21:12:10 +08:00
/* {{{ curl_free_slist
*/
2001-04-30 22:36:19 +08:00
static void curl_free_slist ( void * * slist )
{
curl_slist_free_all ( ( struct curl_slist * ) * slist ) ;
}
2001-06-05 21:12:10 +08:00
/* }}} */
2001-04-30 22:36:19 +08:00
2002-11-14 06:25:33 +08:00
/* {{{ proto array curl_version([int version])
2002-11-09 01:58:43 +08:00
Return cURL version information . */
2000-10-20 12:57:14 +08:00
PHP_FUNCTION ( curl_version )
2000-07-26 06:15:26 +08:00
{
2002-11-14 06:25:33 +08: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 15:55:39 +08:00
}
2001-08-13 14:43:47 +08:00
2002-11-14 06:25:33 +08: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-26 06:15:26 +08:00
}
/* }}} */
2001-06-05 21:12:10 +08:00
/* {{{ alloc_curl_handle
*/
2001-05-15 05:02:31 +08:00
static void alloc_curl_handle ( php_curl * * ch )
2001-05-07 06:24:25 +08:00
{
2003-03-17 23:06:11 +08: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 23:14:20 +08:00
( * ch ) - > handlers - > write_header = ecalloc ( 1 , sizeof ( php_curl_write ) ) ;
2003-03-17 23:06:11 +08:00
( * ch ) - > handlers - > read = ecalloc ( 1 , sizeof ( php_curl_read ) ) ;
2001-07-02 20:08:21 +08:00
memset ( & ( * ch ) - > err , 0 , sizeof ( ( * ch ) - > err ) ) ;
2003-03-17 23:06:11 +08: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-07 06:24:25 +08:00
}
2001-06-05 21:12:10 +08:00
/* }}} */
2001-05-07 06:24:25 +08:00
2002-03-23 09:43:38 +08:00
/* {{{ proto resource curl_init([string url])
2000-07-17 03:37:33 +08:00
Initialize a CURL session */
2000-08-14 03:32:09 +08:00
PHP_FUNCTION ( curl_init )
2000-07-17 03:37:33 +08:00
{
2001-04-30 22:36:19 +08:00
zval * * url ;
php_curl * ch ;
2004-03-13 02:41:19 +08:00
CURL * cp ;
2001-04-30 22:36:19 +08:00
int argc = ZEND_NUM_ARGS ( ) ;
2003-03-17 23:06:11 +08:00
if ( argc < 0 | | argc > 1 | | zend_get_parameters_ex ( argc , & url ) = = FAILURE ) {
2000-07-17 03:37:33 +08:00
WRONG_PARAM_COUNT ;
}
2000-11-22 23:46:13 +08:00
2004-03-13 02:41:19 +08:00
cp = curl_easy_init ( ) ;
if ( ! cp ) {
2003-03-17 23:06:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not initialize a new cURL handle " ) ;
2000-07-17 03:37:33 +08:00
RETURN_FALSE ;
}
2004-03-13 02:41:19 +08:00
alloc_curl_handle ( & ch ) ;
TSRMLS_SET_CTX ( ch - > thread_ctx ) ;
ch - > cp = cp ;
2003-04-28 06:15:19 +08:00
2001-05-04 12:20:38 +08:00
ch - > handlers - > write - > method = PHP_CURL_STDOUT ;
2001-09-27 06:24:44 +08:00
ch - > handlers - > write - > type = PHP_CURL_ASCII ;
2001-05-04 12:20:38 +08:00
ch - > handlers - > read - > method = PHP_CURL_DIRECT ;
2001-07-18 18:47:54 +08:00
ch - > handlers - > write_header - > method = PHP_CURL_IGNORE ;
2001-04-30 22:36:19 +08:00
2003-05-09 09:10:18 +08:00
ch - > uses = 0 ;
2001-04-30 22:36:19 +08: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 12:20:38 +08:00
curl_easy_setopt ( ch - > cp , CURLOPT_FILE , ( void * ) ch ) ;
2001-04-30 22:36:19 +08:00
curl_easy_setopt ( ch - > cp , CURLOPT_READFUNCTION , curl_read ) ;
2001-05-04 12:20:38 +08:00
curl_easy_setopt ( ch - > cp , CURLOPT_INFILE , ( void * ) ch ) ;
2001-06-25 23:14:20 +08:00
curl_easy_setopt ( ch - > cp , CURLOPT_HEADERFUNCTION , curl_write_header ) ;
curl_easy_setopt ( ch - > cp , CURLOPT_WRITEHEADER , ( void * ) ch ) ;
2002-08-01 06:10:58 +08:00
curl_easy_setopt ( ch - > cp , CURLOPT_DNS_USE_GLOBAL_CACHE , 1 ) ;
curl_easy_setopt ( ch - > cp , CURLOPT_DNS_CACHE_TIMEOUT , 120 ) ;
2003-06-20 06:12:21 +08:00
# if defined(ZTS)
curl_easy_setopt ( ch - > cp , CURLOPT_NOSIGNAL , 1 ) ;
# endif
2002-08-01 06:10:58 +08:00
2000-09-30 11:09:54 +08:00
if ( argc > 0 ) {
2001-04-30 22:36:19 +08:00
char * urlcopy ;
2000-09-30 11:09:54 +08:00
convert_to_string_ex ( url ) ;
2001-04-30 22:36:19 +08: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-17 03:37:33 +08:00
}
2000-09-30 11:09:54 +08:00
2001-04-30 22:36:19 +08:00
ZEND_REGISTER_RESOURCE ( return_value , ch , le_curl ) ;
ch - > id = Z_LVAL_P ( return_value ) ;
2000-07-17 03:37:33 +08:00
}
/* }}} */
2004-03-13 02:37:55 +08:00
/* {{{ proto resource curl_copy_handle(resource ch)
Copy a cURL handle along with all of it ' s preferences */
PHP_FUNCTION ( curl_copy_handle )
{
zval * zid ;
CURL * cp ;
php_curl * ch ;
php_curl * dupch ;
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 ) {
php_error ( E_WARNING , " Cannot duplicate cURL handle " ) ;
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 ) ;
}
/* }}} */
2002-03-19 02:00:24 +08:00
/* {{{ proto bool curl_setopt(resource ch, string option, mixed value)
2000-07-17 03:37:33 +08:00
Set an option for a CURL transfer */
2000-08-14 03:32:09 +08:00
PHP_FUNCTION ( curl_setopt )
2000-07-17 03:37:33 +08:00
{
2003-03-17 23:06:11 +08:00
zval * * zid , * * zoption , * * zvalue ;
2001-04-30 22:36:19 +08:00
php_curl * ch ;
2002-07-27 06:57:14 +08:00
CURLcode error = CURLE_OK ;
2001-04-30 22:36:19 +08:00
int option ;
2002-07-27 06:57:14 +08:00
2003-03-17 23:06:11 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 3 | | zend_get_parameters_ex ( 3 , & zid , & zoption , & zvalue ) = = FAILURE ) {
2000-07-17 03:37:33 +08:00
WRONG_PARAM_COUNT ;
}
2003-03-17 23:06:11 +08:00
2001-04-30 22:36:19 +08:00
ZEND_FETCH_RESOURCE ( ch , php_curl * , zid , - 1 , le_curl_name , le_curl ) ;
2003-03-17 23:06:11 +08:00
2001-04-30 22:36:19 +08:00
convert_to_long_ex ( zoption ) ;
2000-09-30 11:09:54 +08:00
2001-04-30 22:36:19 +08:00
option = Z_LVAL_PP ( zoption ) ;
switch ( option ) {
2002-08-01 06:10:58 +08: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 :
case CURLOPT_MUTE :
case CURLOPT_TIMEOUT :
2002-10-03 00:44:48 +08:00
case CURLOPT_FTP_USE_EPSV :
2002-08-01 06:10:58 +08: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-14 06:25:33 +08:00
case CURLOPT_NOSIGNAL :
case CURLOPT_PROXYTYPE :
case CURLOPT_BUFFERSIZE :
2002-11-09 21:52:00 +08:00
case CURLOPT_HTTPGET :
case CURLOPT_HTTP_VERSION :
case CURLOPT_CRLF :
2003-06-20 06:12:21 +08:00
case CURLOPT_DNS_CACHE_TIMEOUT :
case CURLOPT_PROXYPORT :
case CURLOPT_FTP_USE_EPRT :
2004-01-26 12:59:59 +08:00
# if LIBCURL_VERSION_NUM > 0x070a05 /* CURLOPT_HTTPAUTH is available since curl 7.10.6 */
2003-06-20 06:12:21 +08:00
case CURLOPT_HTTPAUTH :
# endif
case CURLOPT_UNRESTRICTED_AUTH :
2003-06-19 05:02:02 +08:00
case CURLOPT_PORT :
2002-08-01 06:10:58 +08: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 21:52:00 +08:00
case CURLOPT_CAPATH :
case CURLOPT_SSL_CIPHER_LIST :
case CURLOPT_SSLKEY :
case CURLOPT_SSLKEYTYPE :
case CURLOPT_SSLKEYPASSWD :
case CURLOPT_SSLENGINE :
2003-02-03 04:56:51 +08:00
case CURLOPT_SSLENGINE_DEFAULT :
2003-06-20 06:12:21 +08:00
case CURLOPT_SSLCERTTYPE :
2003-02-03 04:56:51 +08:00
case CURLOPT_ENCODING : {
2002-08-01 06:10:58 +08:00
char * copystr = NULL ;
2000-07-17 03:37:33 +08:00
2002-08-01 06:10:58 +08:00
convert_to_string_ex ( zvalue ) ;
copystr = estrndup ( Z_STRVAL_PP ( zvalue ) , Z_STRLEN_PP ( zvalue ) ) ;
2001-04-30 22:36:19 +08:00
2002-08-01 06:10:58 +08:00
error = curl_easy_setopt ( ch - > cp , option , copystr ) ;
zend_llist_add_element ( & ch - > to_free . str , & copystr ) ;
2002-07-03 20:02:17 +08:00
2002-08-01 06:10:58 +08:00
break ;
2001-11-20 19:29:54 +08:00
}
2001-06-25 23:14:20 +08:00
case CURLOPT_FILE :
2002-08-01 06:10:58 +08:00
case CURLOPT_INFILE :
2001-06-25 23:14:20 +08:00
case CURLOPT_WRITEHEADER :
2002-08-01 06:10:58 +08: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 22:36:19 +08:00
2003-03-17 23:06:11 +08:00
if ( FAILURE = = php_stream_cast ( ( php_stream * ) what , PHP_STREAM_AS_STDIO , ( void * ) & fp , REPORT_ERRORS ) ) {
2002-08-01 06:10:58 +08:00
RETURN_FALSE ;
}
2001-04-30 22:36:19 +08:00
2002-08-01 06:10:58 +08:00
if ( ! fp ) {
RETURN_FALSE ;
}
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-27 06:57:14 +08:00
2002-08-01 06:10:58 +08:00
break ;
2002-07-27 06:57:14 +08:00
}
2002-08-01 06:10:58 +08:00
case CURLOPT_RETURNTRANSFER :
convert_to_long_ex ( zvalue ) ;
if ( Z_LVAL_PP ( zvalue ) ) {
ch - > handlers - > write - > method = PHP_CURL_RETURN ;
2004-03-10 01:11:22 +08:00
} else {
ch - > handlers - > write - > method = PHP_CURL_STDOUT ;
2000-09-30 11:09:54 +08:00
}
2002-08-01 06:10:58 +08:00
break ;
case CURLOPT_BINARYTRANSFER :
convert_to_long_ex ( zvalue ) ;
2001-02-16 22:31:37 +08:00
2002-08-01 06:10:58 +08:00
if ( Z_LVAL_PP ( zvalue ) ) {
ch - > handlers - > write - > type = PHP_CURL_BINARY ;
}
break ;
case CURLOPT_WRITEFUNCTION :
2003-05-22 07:15:28 +08:00
if ( ch - > handlers - > write - > func_name ) {
zval_ptr_dtor ( & ch - > handlers - > write - > func_name ) ;
2003-08-05 18:29:03 +08:00
ch - > handlers - > write - > fci_cache = empty_fcall_info_cache ;
2002-11-09 01:58:43 +08:00
}
2002-08-01 06:10:58 +08:00
zval_add_ref ( zvalue ) ;
2003-05-22 07:15:28 +08:00
ch - > handlers - > write - > func_name = * zvalue ;
2002-08-01 06:10:58 +08:00
ch - > handlers - > write - > method = PHP_CURL_USER ;
break ;
case CURLOPT_READFUNCTION :
2003-05-22 07:15:28 +08:00
if ( ch - > handlers - > read - > func_name ) {
zval_ptr_dtor ( & ch - > handlers - > read - > func_name ) ;
2003-08-05 18:29:03 +08:00
ch - > handlers - > write - > fci_cache = empty_fcall_info_cache ;
2002-11-09 01:58:43 +08:00
}
2002-08-01 06:10:58 +08:00
zval_add_ref ( zvalue ) ;
2003-05-22 07:15:28 +08:00
ch - > handlers - > read - > func_name = * zvalue ;
2002-08-01 06:10:58 +08:00
ch - > handlers - > read - > method = PHP_CURL_USER ;
break ;
case CURLOPT_HEADERFUNCTION :
2003-05-22 07:15:28 +08:00
if ( ch - > handlers - > write_header - > func_name ) {
zval_ptr_dtor ( & ch - > handlers - > write_header - > func_name ) ;
2003-08-05 18:29:03 +08:00
ch - > handlers - > write - > fci_cache = empty_fcall_info_cache ;
2002-11-09 01:58:43 +08:00
}
2002-08-01 06:10:58 +08:00
zval_add_ref ( zvalue ) ;
2003-05-22 07:15:28 +08:00
ch - > handlers - > write_header - > func_name = * zvalue ;
2002-08-01 06:10:58 +08:00
ch - > handlers - > write_header - > method = PHP_CURL_USER ;
break ;
case CURLOPT_PASSWDFUNCTION :
2002-11-09 01:58:43 +08:00
if ( ch - > handlers - > passwd ) {
zval_ptr_dtor ( & ch - > handlers - > passwd ) ;
}
2002-08-01 06:10:58 +08: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 ;
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-19 05:31:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Couldn't get HashTable in CURLOPT_POSTFIELDS " ) ;
2002-08-01 06:10:58 +08:00
RETURN_FALSE ;
}
2000-09-30 11:09:54 +08:00
2002-08-01 06:10:58 +08:00
for ( zend_hash_internal_pointer_reset ( postfields ) ;
2003-03-17 23:06:11 +08:00
zend_hash_get_current_data ( postfields , ( void * * ) & current ) = = SUCCESS ;
zend_hash_move_forward ( postfields )
) {
2002-08-01 06:10:58 +08:00
SEPARATE_ZVAL ( current ) ;
convert_to_string_ex ( current ) ;
2000-12-22 20:57:09 +08:00
2003-03-17 23:06:11 +08:00
zend_hash_get_current_key_ex ( postfields , & string_key , & string_key_len , & num_key , 0 , NULL ) ;
2001-12-03 17:19:14 +08:00
2002-08-01 06:10:58 +08:00
postval = Z_STRVAL_PP ( current ) ;
if ( * postval = = ' @ ' ) {
error = curl_formadd ( & first , & last ,
CURLFORM_COPYNAME , string_key ,
CURLFORM_NAMELENGTH , string_key_len - 1 ,
CURLFORM_FILE , + + postval ,
CURLFORM_END ) ;
2003-03-17 23:06:11 +08:00
} else {
2002-08-01 06:10:58 +08:00
error = curl_formadd ( & first , & last ,
CURLFORM_COPYNAME , string_key ,
CURLFORM_NAMELENGTH , string_key_len - 1 ,
2004-01-26 08:16:16 +08:00
( ZVAL_REFCOUNT ( * zvalue ) > 1 ? CURLFORM_PTRCONTENTS : CURLFORM_COPYCONTENTS ) , postval ,
2002-08-01 06:10:58 +08:00
CURLFORM_CONTENTSLENGTH , Z_STRLEN_PP ( current ) ,
CURLFORM_END ) ;
}
2001-12-03 17:19:14 +08:00
}
2002-08-01 06:10:58 +08:00
SAVE_CURL_ERROR ( ch , error ) ;
if ( error ! = CURLE_OK ) {
RETURN_FALSE ;
2001-12-03 17:19:14 +08:00
}
2001-04-30 22:36:19 +08:00
2002-08-01 06:10:58 +08:00
zend_llist_add_element ( & ch - > to_free . post , & first ) ;
error = curl_easy_setopt ( ch - > cp , CURLOPT_HTTPPOST , first ) ;
2003-03-17 23:06:11 +08:00
} else {
2002-08-01 06:10:58 +08:00
char * post = NULL ;
2001-04-30 22:36:19 +08:00
2002-08-01 06:10:58 +08: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 22:36:19 +08:00
2002-08-01 06:10:58 +08: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-20 06:12:21 +08:00
case CURLOPT_HTTP200ALIASES :
2002-08-01 06:10:58 +08:00
case CURLOPT_POSTQUOTE : {
zval * * current ;
HashTable * ph ;
struct curl_slist * slist = NULL ;
ph = HASH_OF ( * zvalue ) ;
if ( ! ph ) {
2003-06-20 06:12:21 +08: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 " ) ;
2002-08-01 06:10:58 +08:00
RETURN_FALSE ;
}
2001-04-30 22:36:19 +08:00
2002-08-01 06:10:58 +08:00
for ( zend_hash_internal_pointer_reset ( ph ) ;
zend_hash_get_current_data ( ph , ( void * * ) & current ) = = SUCCESS ;
2003-03-17 23:06:11 +08:00
zend_hash_move_forward ( ph )
) {
2002-08-01 06:10:58 +08:00
char * indiv = NULL ;
2001-04-30 22:36:19 +08:00
2002-08-01 06:10:58 +08:00
SEPARATE_ZVAL ( current ) ;
convert_to_string_ex ( current ) ;
2001-04-30 22:36:19 +08:00
2002-08-01 06:10:58 +08:00
indiv = estrndup ( Z_STRVAL_PP ( current ) , Z_STRLEN_PP ( current ) + 1 ) ;
slist = curl_slist_append ( slist , indiv ) ;
2003-03-17 23:06:11 +08:00
if ( ! slist ) {
2002-08-01 06:10:58 +08:00
efree ( indiv ) ;
2003-03-17 23:06:11 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not build curl_slist " ) ;
2002-08-01 06:10:58 +08:00
RETURN_FALSE ;
}
zend_llist_add_element ( & ch - > to_free . str , & indiv ) ;
2000-10-20 12:57:14 +08:00
}
2002-08-01 06:10:58 +08:00
zend_llist_add_element ( & ch - > to_free . slist , & slist ) ;
2001-04-30 22:36:19 +08:00
2002-08-01 06:10:58 +08:00
error = curl_easy_setopt ( ch - > cp , option , slist ) ;
2001-04-30 22:36:19 +08:00
2003-06-20 06:12:21 +08: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 ) ) ) {
RETURN_FALSE ;
}
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-08-01 06:10:58 +08:00
break ;
}
2000-09-30 11:09:54 +08:00
}
2002-04-04 07:59:36 +08:00
SAVE_CURL_ERROR ( ch , error ) ;
2001-04-30 22:36:19 +08:00
if ( error ! = CURLE_OK ) {
2000-09-30 11:09:54 +08:00
RETURN_FALSE ;
} else {
RETURN_TRUE ;
}
2000-07-17 03:37:33 +08:00
}
/* }}} */
2002-11-14 06:25:33 +08:00
/* {{{ _php_curl_cleanup_handle(ch)
2002-11-09 01:58:43 +08:00
Cleanup an execution phase */
2003-03-17 23:06:11 +08:00
void _php_curl_cleanup_handle ( php_curl * ch )
2002-11-09 01:58:43 +08:00
{
if ( ch - > uses < 1 ) {
return ;
}
if ( ch - > handlers - > write - > buf . len ) {
memset ( & ch - > handlers - > write - > buf , 0 , sizeof ( smart_str ) ) ;
}
memset ( ch - > err . str , 0 , CURL_ERROR_SIZE + 1 ) ;
ch - > err . no = 0 ;
}
/* }}} */
2002-03-19 02:00:24 +08:00
/* {{{ proto bool curl_exec(resource ch)
2000-07-17 03:37:33 +08:00
Perform a CURL session */
2000-08-28 06:53:33 +08:00
PHP_FUNCTION ( curl_exec )
2000-07-17 03:37:33 +08:00
{
2001-04-30 22:36:19 +08:00
zval * * zid ;
php_curl * ch ;
CURLcode error ;
2003-03-17 23:06:11 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & zid ) = = FAILURE ) {
2000-07-17 03:37:33 +08:00
WRONG_PARAM_COUNT ;
}
2003-03-17 23:06:11 +08:00
2001-04-30 22:36:19 +08:00
ZEND_FETCH_RESOURCE ( ch , php_curl * , zid , - 1 , le_curl_name , le_curl ) ;
2000-08-28 06:53:33 +08:00
2002-11-14 06:25:33 +08:00
_php_curl_cleanup_handle ( ch ) ;
2002-11-09 01:58:43 +08:00
2001-04-30 22:36:19 +08:00
error = curl_easy_perform ( ch - > cp ) ;
2002-04-04 07:59:36 +08:00
SAVE_CURL_ERROR ( ch , error ) ;
2004-02-24 03:50:07 +08:00
/* CURLE_PARTIAL_FILE is returned by HEAD requests */
if ( error ! = CURLE_OK & & error ! = CURLE_PARTIAL_FILE ) {
2002-11-09 01:58:43 +08:00
if ( ch - > handlers - > write - > buf . len > 0 ) {
2001-07-11 04:09:56 +08:00
smart_str_free ( & ch - > handlers - > write - > buf ) ;
2002-11-09 01:58:43 +08:00
}
2001-04-30 22:36:19 +08:00
RETURN_FALSE ;
2000-08-17 10:14:41 +08:00
}
2000-09-30 11:09:54 +08:00
2002-11-09 01:58:43 +08:00
ch - > uses + + ;
2001-12-24 21:58:03 +08:00
if ( ch - > handlers - > write - > method = = PHP_CURL_RETURN & & ch - > handlers - > write - > buf . len > 0 ) {
2003-03-17 23:06:11 +08:00
if ( ch - > handlers - > write - > type ! = PHP_CURL_BINARY ) {
2001-05-15 05:02:31 +08:00
smart_str_0 ( & ch - > handlers - > write - > buf ) ;
2003-03-17 23:06:11 +08:00
}
2002-11-14 06:25:33 +08:00
RETURN_STRINGL ( ch - > handlers - > write - > buf . c , ch - > handlers - > write - > buf . len , 0 ) ;
2000-08-28 06:53:33 +08:00
}
2001-04-30 22:36:19 +08:00
RETURN_TRUE ;
2000-07-17 03:37:33 +08:00
}
/* }}} */
2003-06-12 20:32:22 +08:00
/* {{{ proto mixed curl_getinfo(resource ch, int opt)
2000-10-20 12:57:14 +08:00
Get information regarding a specific transfer */
PHP_FUNCTION ( curl_getinfo )
{
2001-04-30 22:36:19 +08:00
zval * * zid ,
* * zoption ;
php_curl * ch ;
2003-03-17 23:06:11 +08:00
int option , argc = ZEND_NUM_ARGS ( ) ;
2001-04-30 22:36:19 +08:00
2003-03-17 23:06:11 +08:00
if ( argc < 1 | | argc > 2 | | zend_get_parameters_ex ( argc , & zid , & zoption ) = = FAILURE ) {
2000-10-20 12:57:14 +08:00
WRONG_PARAM_COUNT ;
}
2003-03-17 23:06:11 +08:00
2001-04-30 22:36:19 +08:00
ZEND_FETCH_RESOURCE ( ch , php_curl * , zid , - 1 , le_curl_name , le_curl ) ;
2000-10-20 12:57:14 +08:00
if ( argc < 2 ) {
2002-11-09 01:58:43 +08:00
char * s_code ;
2001-04-30 22:36:19 +08:00
long l_code ;
double d_code ;
2000-10-20 12:57:14 +08:00
array_init ( return_value ) ;
2003-02-28 15:34:45 +08: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 ) ;
}
2000-10-20 12:57:14 +08:00
} else {
2001-04-30 22:36:19 +08:00
option = Z_LVAL_PP ( zoption ) ;
switch ( option ) {
2003-03-17 23:06:11 +08:00
case CURLINFO_EFFECTIVE_URL :
case CURLINFO_CONTENT_TYPE : {
char * s_code ;
2001-04-30 22:36:19 +08:00
2003-03-17 23:06:11 +08:00
curl_easy_getinfo ( ch - > cp , option , & s_code ) ;
RETURN_STRING ( s_code , 1 ) ;
break ;
}
case CURLINFO_HTTP_CODE :
case CURLINFO_HEADER_SIZE :
case CURLINFO_REQUEST_SIZE :
case CURLINFO_FILETIME :
case CURLINFO_SSL_VERIFYRESULT :
case CURLINFO_REDIRECT_COUNT : {
long code ;
curl_easy_getinfo ( ch - > cp , option , & code ) ;
RETURN_LONG ( code ) ;
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 : {
double code ;
curl_easy_getinfo ( ch - > cp , option , & code ) ;
RETURN_DOUBLE ( code ) ;
break ;
}
2000-10-20 12:57:14 +08:00
}
2003-03-17 23:06:11 +08:00
}
2000-10-20 12:57:14 +08:00
}
/* }}} */
2002-03-19 02:00:24 +08:00
/* {{{ proto string curl_error(resource ch)
2000-09-30 11:09:54 +08:00
Return a string contain the last error for the current session */
PHP_FUNCTION ( curl_error )
2000-07-17 03:37:33 +08:00
{
2001-04-30 22:36:19 +08:00
zval * * zid ;
php_curl * ch ;
2000-07-17 03:37:33 +08:00
2003-03-17 23:06:11 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & zid ) = = FAILURE ) {
2000-07-17 03:37:33 +08:00
WRONG_PARAM_COUNT ;
}
2003-03-17 23:06:11 +08:00
2001-04-30 22:36:19 +08:00
ZEND_FETCH_RESOURCE ( ch , php_curl * , zid , - 1 , le_curl_name , le_curl ) ;
2001-03-03 09:06:55 +08:00
2001-07-02 20:08:21 +08:00
ch - > err . str [ CURL_ERROR_SIZE ] = 0 ;
2001-09-10 19:06:15 +08:00
RETURN_STRING ( ch - > err . str , 1 ) ;
2000-07-17 03:37:33 +08:00
}
/* }}} */
2002-03-19 02:00:24 +08:00
/* {{{ proto int curl_errno(resource ch)
2000-09-30 11:09:54 +08:00
Return an integer containing the last error number */
PHP_FUNCTION ( curl_errno )
{
2001-04-30 22:36:19 +08:00
zval * * zid ;
php_curl * ch ;
2003-03-17 23:06:11 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & zid ) = = FAILURE ) {
2000-09-30 11:09:54 +08:00
WRONG_PARAM_COUNT ;
}
2003-03-17 23:06:11 +08:00
2001-04-30 22:36:19 +08:00
ZEND_FETCH_RESOURCE ( ch , php_curl * , zid , - 1 , le_curl_name , le_curl ) ;
RETURN_LONG ( ch - > err . no ) ;
2000-09-30 11:09:54 +08:00
}
/* }}} */
2000-08-14 03:32:09 +08:00
2002-03-19 02:00:24 +08:00
/* {{{ proto void curl_close(resource ch)
2000-09-30 11:09:54 +08:00
Close a CURL session */
2000-10-20 12:57:14 +08:00
PHP_FUNCTION ( curl_close )
2000-08-14 03:32:09 +08:00
{
2001-04-30 22:36:19 +08:00
zval * * zid ;
php_curl * ch ;
2003-03-17 23:06:11 +08:00
if ( ZEND_NUM_ARGS ( ) ! = 1 | | zend_get_parameters_ex ( 1 , & zid ) = = FAILURE ) {
2000-09-30 11:09:54 +08:00
WRONG_PARAM_COUNT ;
2000-08-14 03:32:09 +08:00
}
2003-03-17 23:06:11 +08:00
2001-04-30 22:36:19 +08:00
ZEND_FETCH_RESOURCE ( ch , php_curl * , zid , - 1 , le_curl_name , le_curl ) ;
2004-03-11 08:11:18 +08:00
if ( ch - > uses ) {
ch - > uses - - ;
} else {
zend_list_delete ( Z_LVAL_PP ( zid ) ) ;
}
2000-08-14 03:32:09 +08:00
}
2000-09-30 11:09:54 +08:00
/* }}} */
2000-08-14 03:32:09 +08:00
2000-09-30 11:09:54 +08:00
/* {{{ _php_curl_close()
List destructor for curl handles */
2001-07-31 13:44:11 +08:00
static void _php_curl_close ( zend_rsrc_list_entry * rsrc TSRMLS_DC )
2000-08-16 00:50:14 +08:00
{
2001-04-30 22:36:19 +08:00
php_curl * ch = ( php_curl * ) rsrc - > ptr ;
2002-11-14 06:25:33 +08:00
# if PHP_CURL_DEBUG
fprintf ( stderr , " DTOR CALLED, ch = %x \n " , ch ) ;
# endif
2001-04-30 22:36:19 +08: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 ) ;
2003-05-22 07:15:28 +08:00
if ( ch - > handlers - > write - > func_name ) {
zval_ptr_dtor ( & ch - > handlers - > write - > func_name ) ;
2003-03-17 23:06:11 +08:00
}
2003-05-22 07:15:28 +08:00
if ( ch - > handlers - > read - > func_name ) {
zval_ptr_dtor ( & ch - > handlers - > read - > func_name ) ;
2003-03-17 23:06:11 +08:00
}
2003-05-22 07:15:28 +08:00
if ( ch - > handlers - > write_header - > func_name ) {
zval_ptr_dtor ( & ch - > handlers - > write_header - > func_name ) ;
2003-03-17 23:06:11 +08:00
}
if ( ch - > handlers - > passwd ) {
2002-11-09 01:58:43 +08:00
zval_ptr_dtor ( & ch - > handlers - > passwd ) ;
2003-03-17 23:06:11 +08:00
}
2001-05-04 12:20:38 +08:00
efree ( ch - > handlers - > write ) ;
2001-06-25 23:14:20 +08:00
efree ( ch - > handlers - > write_header ) ;
2001-05-04 12:20:38 +08:00
efree ( ch - > handlers - > read ) ;
2001-04-30 22:36:19 +08:00
efree ( ch - > handlers ) ;
efree ( ch ) ;
}
2000-09-30 11:09:54 +08:00
/* }}} */
2000-08-16 00:50:14 +08:00
2000-07-26 06:15:26 +08:00
# endif
2001-06-05 21:12:10 +08:00
/*
* Local variables :
* tab - width : 4
* c - basic - offset : 4
* End :
2002-10-22 06:35:59 +08:00
* vim600 : fdm = marker
* vim : noet sw = 4 ts = 4
2001-06-05 21:12:10 +08:00
*/