From 64595a5d1a51417ae518e124c61e1a9840d221a8 Mon Sep 17 00:00:00 2001 From: Pierrick Charron Date: Sun, 23 Dec 2012 14:59:41 -0500 Subject: [PATCH] Add curl_multi_setopt and clean curl_share_setopt curl_multi_setopt is now available and supports CURLMOPT_PIPELINING and CURLMOPT_MAXCONNECTS --- ext/curl/interface.c | 14 +++++ ext/curl/multi.c | 54 +++++++++++++++++++ ext/curl/php_curl.h | 2 + ext/curl/share.c | 12 ++--- .../tests/curl_multi_setopt_basic001.phpt | 23 ++++++++ .../tests/curl_share_setopt_basic001.phpt | 21 ++++++++ 6 files changed, 120 insertions(+), 6 deletions(-) create mode 100644 ext/curl/tests/curl_multi_setopt_basic001.phpt create mode 100644 ext/curl/tests/curl_share_setopt_basic001.phpt diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 8b61764661..a0a4ec5b5f 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -330,6 +330,12 @@ ZEND_BEGIN_ARG_INFO(arginfo_curl_unescape, 0) ZEND_ARG_INFO(0, ch) ZEND_ARG_INFO(0, str) ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO(arginfo_curl_multi_setopt, 0) + ZEND_ARG_INFO(0, sh) + ZEND_ARG_INFO(0, option) + ZEND_ARG_INFO(0, value) +ZEND_END_ARG_INFO() #endif ZEND_BEGIN_ARG_INFO(arginfo_curl_multi_init, 0) @@ -410,6 +416,9 @@ const zend_function_entry curl_functions[] = { 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) +#if LIBCURL_VERSION_NUM >= 0x070f04 /* 7.15.4 */ + PHP_FE(curl_multi_setopt, arginfo_curl_multi_setopt) +#endif PHP_FE(curl_share_init, arginfo_curl_share_init) PHP_FE(curl_share_close, arginfo_curl_share_close) PHP_FE(curl_share_setopt, arginfo_curl_share_setopt) @@ -928,6 +937,7 @@ PHP_MINIT_FUNCTION(curl) #if LIBCURL_VERSION_NUM >= 0x071000 /* Available since 7.16.0 */ REGISTER_CURL_CONSTANT(CURLOPT_SSL_SESSIONID_CACHE); + REGISTER_CURL_CONSTANT(CURLMOPT_PIPELINING); #endif #if LIBCURL_VERSION_NUM >= 0x071001 /* Available since 7.16.1 */ @@ -948,6 +958,10 @@ PHP_MINIT_FUNCTION(curl) REGISTER_CURL_CONSTANT(CURLOPT_TIMEOUT_MS); #endif +#if LIBCURL_VERSION_NUM >= 0x071003 /* Available since 7.16.3 */ + REGISTER_CURL_CONSTANT(CURLMOPT_MAXCONNECTS); +#endif + #if LIBCURL_VERSION_NUM >= 0x071004 /* Available since 7.16.4 */ REGISTER_CURL_CONSTANT(CURLOPT_KRBLEVEL); REGISTER_CURL_CONSTANT(CURLOPT_NEW_DIRECTORY_PERMS); diff --git a/ext/curl/multi.c b/ext/curl/multi.c index eedcb6abc3..48655ba6e4 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -359,6 +359,60 @@ void _php_curl_multi_close(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */ } /* }}} */ +#if LIBCURL_VERSION_NUM >= 0x070f04 /* 7.15.4 */ +static int _php_curl_multi_setopt(php_curlm *mh, long option, zval **zvalue, zval *return_value TSRMLS_DC) /* {{{ */ +{ + CURLMcode error = CURLM_OK; + + switch (option) { +#if LIBCURL_VERSION_NUM >= 0x071000 /* 7.16.0 */ + case CURLMOPT_PIPELINING: +#endif +#if LIBCURL_VERSION_NUM >= 0x071003 /* 7.16.3 */ + case CURLMOPT_MAXCONNECTS: +#endif + convert_to_long_ex(zvalue); + error = curl_multi_setopt(mh->multi, option, Z_LVAL_PP(zvalue)); + break; + + default: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid curl multi configuration option"); + error = CURLM_UNKNOWN_OPTION; + break; + } + + if (error != CURLM_OK) { + return 1; + } else { + return 0; + } +} +/* }}} */ + + +/* {{{ proto int curl_multi_setopt(resource mh, int option, mixed value) + Set an option for the curl multi handle */ +PHP_FUNCTION(curl_multi_setopt) +{ + zval *z_mh, **zvalue; + long options; + php_curlm *mh; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlZ", &z_mh, &options, &zvalue) == FAILURE) { + return; + } + + ZEND_FETCH_RESOURCE(mh, php_curlm *, &z_mh, -1, le_curl_multi_handle_name, le_curl_multi_handle); + + if (!_php_curl_multi_setopt(mh, options, zvalue, return_value TSRMLS_CC)) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ +#endif + #endif /* diff --git a/ext/curl/php_curl.h b/ext/curl/php_curl.h index 02eb24eb0e..d00b431faf 100644 --- a/ext/curl/php_curl.h +++ b/ext/curl/php_curl.h @@ -91,6 +91,8 @@ PHP_FUNCTION(curl_reset); #if LIBCURL_VERSION_NUM >= 0x070f04 /* 7.15.4 */ PHP_FUNCTION(curl_escape); PHP_FUNCTION(curl_unescape); + +PHP_FUNCTION(curl_multi_setopt); #endif void _php_curl_multi_close(zend_rsrc_list_entry * TSRMLS_DC); diff --git a/ext/curl/share.c b/ext/curl/share.c index d7cec23ddb..70e2f56e6f 100644 --- a/ext/curl/share.c +++ b/ext/curl/share.c @@ -76,9 +76,14 @@ static int _php_curl_share_setopt(php_curlsh *sh, long option, zval **zvalue, zv convert_to_long_ex(zvalue); error = curl_share_setopt(sh->share, option, Z_LVAL_PP(zvalue)); break; + + default: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid curl share configuration option"); + error = CURLSHE_BAD_OPTION; + break; } - if (error != CURLE_OK) { + if (error != CURLSHE_OK) { return 1; } else { return 0; @@ -100,11 +105,6 @@ PHP_FUNCTION(curl_share_setopt) ZEND_FETCH_RESOURCE(sh, php_curlsh *, &zid, -1, le_curl_share_handle_name, le_curl_share_handle); - if (options <= 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid curl share configuration option"); - RETURN_FALSE; - } - if (!_php_curl_share_setopt(sh, options, zvalue, return_value TSRMLS_CC)) { RETURN_TRUE; } else { diff --git a/ext/curl/tests/curl_multi_setopt_basic001.phpt b/ext/curl/tests/curl_multi_setopt_basic001.phpt new file mode 100644 index 0000000000..af74a0f400 --- /dev/null +++ b/ext/curl/tests/curl_multi_setopt_basic001.phpt @@ -0,0 +1,23 @@ +--TEST-- +curl_multi_setopt basic test +--SKIPIF-- +if (!extension_loaded("curl")) { + exit("skip curl extension not loaded"); +} +$curl_version = curl_version(); +if ($curl_version['version_number'] < 0x071000) { + exit("skip: test works only with curl >= 7.16.0"); +} +--FILE-- + +--EXPECTF-- +bool(true) + +Warning: curl_multi_setopt(): Invalid curl multi configuration option in %s on line %d +bool(false) diff --git a/ext/curl/tests/curl_share_setopt_basic001.phpt b/ext/curl/tests/curl_share_setopt_basic001.phpt new file mode 100644 index 0000000000..88e92860b0 --- /dev/null +++ b/ext/curl/tests/curl_share_setopt_basic001.phpt @@ -0,0 +1,21 @@ +--TEST-- +curl_share_setopt basic test +--SKIPIF-- +if (!extension_loaded("curl")) { + exit("skip curl extension not loaded"); +} +--FILE-- + +--EXPECTF-- +bool(true) +bool(true) + +Warning: curl_share_setopt(): Invalid curl share configuration option in %s on line %d +bool(false) -- 2.40.0