📄 curl.c
字号:
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); 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);#ifdef CURLE_SHARE_IN_USE REGISTER_CURL_CONSTANT(CURLE_SHARE_IN_USE);#endif#ifdef CURLE_SSL_CERTPROBLEM REGISTER_CURL_CONSTANT(CURLE_SSL_CERTPROBLEM);#endif#ifdef CURLE_SSL_CIPHER REGISTER_CURL_CONSTANT(CURLE_SSL_CIPHER);#endif#ifdef CURLE_SSL_CACERT REGISTER_CURL_CONSTANT(CURLE_SSL_CACERT);#endif#ifdef CURLE_BAD_CONTENT_ENCODING REGISTER_CURL_CONSTANT(CURLE_BAD_CONTENT_ENCODING);#endif #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 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); #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); }#endif#ifdef PHP_CURL_NEED_GNUTLS_TSL gcry_control(GCRYCTL_SET_THREAD_CBS, &php_curl_gnutls_tsl);#endif if (curl_global_init(CURL_GLOBAL_SSL) != CURLE_OK) { return FAILURE; }#ifdef PHP_CURL_URL_WRAPPERS 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);#endif return SUCCESS;}/* }}} *//* {{{ PHP_MSHUTDOWN_FUNCTION */PHP_MSHUTDOWN_FUNCTION(curl){#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#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);#endif curl_global_cleanup();#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; }#endif return SUCCESS;}/* }}} */#define PHP_CURL_STDOUT 0#define PHP_CURL_FILE 1#define PHP_CURL_USER 2#define PHP_CURL_DIRECT 3#define PHP_CURL_RETURN 4#define PHP_CURL_ASCII 5#define PHP_CURL_BINARY 6#define PHP_CURL_IGNORE 7/* {{{ curl_write */static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx){ php_curl *ch = (php_curl *) ctx; php_curl_write *t = ch->handlers->write; size_t length = size * nmemb; TSRMLS_FETCH(); switch (t->method) { case PHP_CURL_STDOUT: PHPWRITE(data, length); break; case PHP_CURL_FILE: return fwrite(data, size, nmemb, t->fp); case PHP_CURL_RETURN: if (length > 0) { smart_str_appendl(&t->buf, data, (int) length); } break; case PHP_CURL_USER: { zval *argv[2]; zval *retval; int error; MAKE_STD_ZVAL(argv[0]); MAKE_STD_ZVAL(argv[1]); MAKE_STD_ZVAL(retval); ZVAL_RESOURCE(argv[0], ch->id); zend_list_addref(ch->id); ZVAL_STRINGL(argv[1], data, length, 1); ch->in_callback = 1; error = call_user_function(EG(function_table), NULL, t->func, retval, 2, argv TSRMLS_CC); ch->in_callback = 0; if (error == FAILURE) { php_error(E_WARNING, "%s(): Couldn't call the CURLOPT_WRITEFUNCTION", get_active_function_name(TSRMLS_C)); length = -1; } else { if (Z_TYPE_P(retval) != IS_LONG) { convert_to_long_ex(&retval); } length = Z_LVAL_P(retval); } zval_ptr_dtor(&argv[0]); zval_ptr_dtor(&argv[1]); zval_ptr_dtor(&retval); break; } } return length;}/* }}} *//* {{{ curl_read */static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx){ php_curl *ch = (php_curl *) ctx; php_curl_read *t = ch->handlers->read; int length = -1; switch (t->method) { case PHP_CURL_DIRECT: if (t->fp) { length = fread(data, size, nmemb, t->fp); } break; case PHP_CURL_USER: { zval *argv[3]; zval *retval; int error; TSRMLS_FETCH(); MAKE_STD_ZVAL(argv[0]); MAKE_STD_ZVAL(argv[1]); MAKE_STD_ZVAL(argv[2]); MAKE_STD_ZVAL(retval); ZVAL_RESOURCE(argv[0], ch->id); zend_list_addref(ch->id); ZVAL_RESOURCE(argv[1], t->fd); zend_list_addref(t->fd); ZVAL_LONG(argv[2], (int) size * nmemb); ch->in_callback = 1; error = call_user_function(EG(function_table), NULL, t->func, retval, 3, argv TSRMLS_CC); ch->in_callback = 0; if (error == FAILURE) { php_error(E_WARNING, "%s(): Cannot call the CURLOPT_READFUNCTION", get_active_function_name(TSRMLS_C)); } else if (Z_TYPE_P(retval) == IS_STRING) { length = MIN(size * nmemb, Z_STRLEN_P(retval)); memcpy(data, Z_STRVAL_P(retval), length); } zval_ptr_dtor(&argv[0]); zval_ptr_dtor(&argv[1]); zval_ptr_dtor(&argv[2]); zval_ptr_dtor(&retval); break; } } return length;}/* }}} *//* {{{ curl_write_header */static size_t curl_write_header(char *data, size_t size, size_t nmemb, void *ctx){ php_curl *ch = (php_curl *) ctx; php_curl_write *t = ch->handlers->write_header; size_t length = size * nmemb; TSRMLS_FETCH(); switch (t->method) { case PHP_CURL_STDOUT: /* Handle special case write when we're returning the entire transfer */ if (ch->handlers->write->method == PHP_CURL_RETURN && length > 0) { smart_str_appendl(&ch->handlers->write->buf, data, (int) length); } else { PHPWRITE(data, length); } break; case PHP_CURL_FILE: return fwrite(data, size, nmemb, t->fp); case PHP_CURL_USER: { zval *argv[2]; zval *retval; int error; TSRMLS_FETCH(); MAKE_STD_ZVAL(argv[0]); MAKE_STD_ZVAL(argv[1]); MAKE_STD_ZVAL(retval); ZVAL_RESOURCE(argv[0], ch->id); zend_list_addref(ch->id); ZVAL_STRINGL(argv[1], data, length, 1); ch->in_callback = 1; error = call_user_function(EG(function_table), NULL, t->func, retval, 2, argv TSRMLS_CC); ch->in_callback = 0; if (error == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not call the CURLOPT_HEADERFUNCTION"); length = -1; } else { if (Z_TYPE_P(retval) != IS_LONG) { convert_to_long_ex(&retval); } length = Z_LVAL_P(retval); zval_ptr_dtor(&retval); } zval_ptr_dtor(&argv[0]); zval_ptr_dtor(&argv[1]); break; } case PHP_CURL_IGNORE: return length; default: return -1; } return length;}/* }}} */#if CURLOPT_PASSWDFUNCTION != 0/* {{{ curl_passwd */static size_t curl_passwd(void *ctx, char *prompt, char *buf, int buflen){ php_curl *ch = (php_curl *) ctx; zval *func = ch->handlers->passwd; zval *argv[3]; zval *retval = NULL; int error; int ret = -1; TSRMLS_FETCH(); 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); ch->in_callback = 1; error = call_user_function(EG(function_table), NULL, func, retval, 2, argv TSRMLS_CC); ch->in_callback = 0; if (error == FAILURE) { php_error(E_WARNING, "%s(): Couldn't call the CURLOPT_PASSWDFUNCTION", get_active_function_name(TSRMLS_C)); } else if (Z_TYPE_P(retval) == IS_STRING) { if (Z_STRLEN_P(retval) > buflen) { php_error(E_WARNING, "%s(): Returned password is too long for libcurl to handle", get_active_function_name(TSRMLS_C)); } else { strlcpy(buf, Z_STRVAL_P(retval), Z_STRLEN_P(retval)); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "User handler '%s' did not return a string.", Z_STRVAL_P(func)); } zval_ptr_dtor(&argv[0]); zval_ptr_dtor(&argv[1]); zval_ptr_dtor(&argv[2]); zval_ptr_dtor(&retval); return ret;}/* }}} */#endif/* {{{ curl_free_string */static void curl_free_string(void **string){ efree(*string);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -