]> granicus.if.org Git - php/commitdiff
Add curl_multi_setopt and clean curl_share_setopt
authorPierrick Charron <pierrick@php.net>
Sun, 23 Dec 2012 19:59:41 +0000 (14:59 -0500)
committerPierrick Charron <pierrick@php.net>
Sun, 23 Dec 2012 19:59:41 +0000 (14:59 -0500)
curl_multi_setopt is now available and supports CURLMOPT_PIPELINING
and CURLMOPT_MAXCONNECTS

ext/curl/interface.c
ext/curl/multi.c
ext/curl/php_curl.h
ext/curl/share.c
ext/curl/tests/curl_multi_setopt_basic001.phpt [new file with mode: 0644]
ext/curl/tests/curl_share_setopt_basic001.phpt [new file with mode: 0644]

index 8b617646612ed3689152e9354bf2da895a01df8e..a0a4ec5b5f6efdab0f94e1b3f0ac3681f37c9641 100644 (file)
@@ -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);
index eedcb6abc3a4cfb9b361c062be204135a6e21fce..48655ba6e411f199103a75c3d91fc50a7af68cd2 100644 (file)
@@ -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
 
 /*
index 02eb24eb0e298ab73d3c97d0813be60e6c2afa26..d00b431faf1d00ee557749717db6ce292762d2f4 100644 (file)
@@ -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);
index d7cec23ddbb50bec8df4df94f0e362d3b054bae0..70e2f56e6f7f143ce839ab2bd9124c48dc62aaa0 100644 (file)
@@ -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 (file)
index 0000000..af74a0f
--- /dev/null
@@ -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 (file)
index 0000000..88e9286
--- /dev/null
@@ -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)