⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 curl.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
/*   +----------------------------------------------------------------------+   | PHP Version 4                                                        |   +----------------------------------------------------------------------+   | Copyright (c) 1997-2007 The PHP Group                                |   +----------------------------------------------------------------------+   | This source file is subject to version 3.01 of the PHP license,      |   | that is bundled with this package in the file LICENSE, and is        |   | available through the world-wide-web at the following url:           |   | http://www.php.net/license/3_01.txt                                  |   | 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.               |   +----------------------------------------------------------------------+   | Author: Sterling Hughes <sterling@php.net>                           |   +----------------------------------------------------------------------+*//* $Id: curl.c,v 1.124.2.30.2.19 2007/03/15 23:19:21 tony2001 Exp $ */#ifdef HAVE_CONFIG_H#include "config.h"#endif#ifdef PHP_WIN32#include <winsock2.h>#endif#include "php.h"#if HAVE_CURL#include <stdio.h>#include <string.h>#ifdef PHP_WIN32#include <sys/types.h>#endif#include <curl/curl.h>#include <curl/easy.h>/* As of curl 7.11.1 this is no longer defined inside curl.h */#ifndef HttpPost#define HttpPost curl_httppost#endif/* {{{ cruft for thread safe SSL crypto locks */#if defined(ZTS) && defined(HAVE_CURL_SSL)# 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 */#endif /* ZTS && HAVE_CURL_SSL *//* }}} */#define SMART_STR_PREALLOC 4096#include "ext/standard/php_smart_str.h"#include "ext/standard/php_string.h"#include "ext/standard/info.h"#include "ext/standard/file.h"#include "ext/standard/url.h"#include "php_curl.h"static int  le_curl;#define le_curl_name "cURL handle"#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();}#endif/* }}} */#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/* }}} */static void _php_curl_close(zend_rsrc_list_entry *rsrc TSRMLS_DC);#define SAVE_CURL_ERROR(__handle, __err) (__handle)->err.no = (int) __err;#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);#define PHP_CURL_CHECK_OPEN_BASEDIR(str, len)													\	if (((PG(open_basedir) && *PG(open_basedir)) || PG(safe_mode)) &&                                                \	    strncasecmp(str, "file:", sizeof("file:") - 1) == 0)								\	{ 																							\		php_url *tmp_url; 																		\															\		if (!(tmp_url = php_url_parse_ex(str, len))) {											\			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid url '%s'", str);				\			RETURN_FALSE; 																		\		} 																						\															\		if (php_memnstr(str, tmp_url->path, strlen(tmp_url->path), str + len)) {				\			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Url '%s' contains unencoded control characters.", str);	\			RETURN_FALSE;											\		}													\																								\		if (tmp_url->query || tmp_url->fragment || php_check_open_basedir(tmp_url->path TSRMLS_CC) || 									\			(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); 																	\	}/* {{{ curl_functions[] */function_entry curl_functions[] = {	PHP_FE(curl_init,     NULL)	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)	{NULL, NULL, NULL}};/* }}} *//* {{{ curl_module_entry */zend_module_entry curl_module_entry = {	STANDARD_MODULE_HEADER,	"curl",	curl_functions,	PHP_MINIT(curl),	PHP_MSHUTDOWN(curl),	NULL,	NULL,	PHP_MINFO(curl),	NO_VERSION_YET,	STANDARD_MODULE_PROPERTIES};/* }}} */#ifdef COMPILE_DL_CURLZEND_GET_MODULE (curl)#endif/* {{{ PHP_MINFO_FUNCTION */PHP_MINFO_FUNCTION(curl){	php_info_print_table_start();	php_info_print_table_row(2, "CURL support",    "enabled");	php_info_print_table_row(2, "CURL Information", curl_version());	php_info_print_table_end();}/* }}} */#define REGISTER_CURL_CONSTANT(__c) REGISTER_LONG_CONSTANT(#__c, __c, CONST_CS | CONST_PERSISTENT)/* {{{ PHP_MINIT_FUNCTION */PHP_MINIT_FUNCTION(curl){	le_curl = zend_register_list_destructors_ex(_php_curl_close, NULL, "curl", module_number);		/* Constants for curl_setopt() */	REGISTER_CURL_CONSTANT(CURLOPT_DNS_USE_GLOBAL_CACHE);	REGISTER_CURL_CONSTANT(CURLOPT_DNS_CACHE_TIMEOUT);	REGISTER_CURL_CONSTANT(CURLOPT_PORT);	REGISTER_CURL_CONSTANT(CURLOPT_FILE);	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);#if CURLOPT_FTPASCII != 0	REGISTER_CURL_CONSTANT(CURLOPT_FTPASCII);#endif	REGISTER_CURL_CONSTANT(CURLOPT_PUT);#if CURLOPT_MUTE != 0	REGISTER_CURL_CONSTANT(CURLOPT_MUTE);#endif	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);	REGISTER_CURL_CONSTANT(CURLOPT_FTP_USE_EPSV);	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);	REGISTER_CURL_CONSTANT(CURLOPT_SSL_VERIFYHOST);	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);#if CURLOPT_PASSWDFUNCTION != 0 	REGISTER_CURL_CONSTANT(CURLOPT_PASSWDFUNCTION);#endif	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);	REGISTER_CURL_CONSTANT(CURLOPT_CAPATH);	REGISTER_CURL_CONSTANT(CURLOPT_COOKIEJAR);	REGISTER_CURL_CONSTANT(CURLOPT_SSL_CIPHER_LIST);	REGISTER_CURL_CONSTANT(CURLOPT_BINARYTRANSFER);	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);	REGISTER_CURL_CONSTANT(CURLOPT_CRLF);	REGISTER_CURL_CONSTANT(CURL_TIMECOND_IFMODSINCE); 	REGISTER_CURL_CONSTANT(CURL_TIMECOND_IFUNMODSINCE); 	REGISTER_CURL_CONSTANT(CURL_TIMECOND_LASTMOD);#if LIBCURL_VERSION_NUM >= 0x070a00	REGISTER_CURL_CONSTANT(CURLOPT_ENCODING);#endif		#if LIBCURL_VERSION_NUM > 0x070a05 /* CURLOPT_HTTPAUTH is available since curl 7.10.6 */ 	REGISTER_CURL_CONSTANT(CURLOPT_HTTPAUTH); 	/* http authentication options */ 	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);#endif#if LIBCURL_VERSION_NUM > 0x070a06 /* CURLOPT_PROXYAUTH is available since curl 7.10.7 */	REGISTER_CURL_CONSTANT(CURLOPT_PROXYAUTH);#endif	/* Constants effecting the way CURLOPT_CLOSEPOLICY works */	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);	/* Info constants */	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);	REGISTER_CURL_CONSTANT(CURLINFO_SSL_VERIFYRESULT);	REGISTER_CURL_CONSTANT(CURLINFO_CONTENT_LENGTH_DOWNLOAD);	REGISTER_CURL_CONSTANT(CURLINFO_CONTENT_LENGTH_UPLOAD);	REGISTER_CURL_CONSTANT(CURLINFO_STARTTRANSFER_TIME);	REGISTER_CURL_CONSTANT(CURLINFO_CONTENT_TYPE);	REGISTER_CURL_CONSTANT(CURLINFO_REDIRECT_TIME);	REGISTER_CURL_CONSTANT(CURLINFO_REDIRECT_COUNT);	/* Error Constants */	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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -