summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierrick Charron <pierrick@php.net>2012-12-23 14:59:41 -0500
committerPierrick Charron <pierrick@php.net>2012-12-23 14:59:41 -0500
commit64595a5d1a51417ae518e124c61e1a9840d221a8 (patch)
tree75a3933c4276026f4101047bccdc530f79e4d8c5
parentded889e865825b41e9484a47bfbcbd4b6ed15d50 (diff)
downloadphp-git-64595a5d1a51417ae518e124c61e1a9840d221a8.tar.gz
Add curl_multi_setopt and clean curl_share_setopt
curl_multi_setopt is now available and supports CURLMOPT_PIPELINING and CURLMOPT_MAXCONNECTS
-rw-r--r--ext/curl/interface.c14
-rw-r--r--ext/curl/multi.c54
-rw-r--r--ext/curl/php_curl.h2
-rw-r--r--ext/curl/share.c12
-rw-r--r--ext/curl/tests/curl_multi_setopt_basic001.phpt23
-rw-r--r--ext/curl/tests/curl_share_setopt_basic001.phpt21
6 files changed, 120 insertions, 6 deletions
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--
+<?php
+
+$mh = curl_multi_init();
+var_dump(curl_multi_setopt($mh, CURLMOPT_PIPELINING, 0));
+var_dump(curl_multi_setopt($mh, -1, 0));
+
+?>
+--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--
+<?php
+
+$sh = curl_share_init();
+var_dump(curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE));
+var_dump(curl_share_setopt($sh, CURLSHOPT_UNSHARE, CURL_LOCK_DATA_DNS));
+var_dump(curl_share_setopt($sh, -1, 0));
+
+?>
+--EXPECTF--
+bool(true)
+bool(true)
+
+Warning: curl_share_setopt(): Invalid curl share configuration option in %s on line %d
+bool(false)