Commit:    64595a5d1a51417ae518e124c61e1a9840d221a8
Author:    Pierrick Charron <pierr...@php.net>         Sun, 23 Dec 2012 
14:59:41 -0500
Parents:   ded889e865825b41e9484a47bfbcbd4b6ed15d50
Branches:  PHP-5.5 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=64595a5d1a51417ae518e124c61e1a9840d221a8

Log:
Add curl_multi_setopt and clean curl_share_setopt

curl_multi_setopt is now available and supports CURLMOPT_PIPELINING
and CURLMOPT_MAXCONNECTS

Changed paths:
  M  ext/curl/interface.c
  M  ext/curl/multi.c
  M  ext/curl/php_curl.h
  M  ext/curl/share.c
  A  ext/curl/tests/curl_multi_setopt_basic001.phpt
  A  ext/curl/tests/curl_share_setopt_basic001.phpt


Diff:
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index 8b61764..a0a4ec5 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 eedcb6a..48655ba 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 02eb24e..d00b431 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 d7cec23..70e2f56 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 0000000..af74a0f
--- /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 0000000..88e9286
--- /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)


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to