From a6bbd63f4788437976146e71e8af51aa652e2881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Fri, 11 Oct 2024 09:07:14 +0200 Subject: [PATCH] curl: Add `curl_multi_get_handles()` see https://curl.se/libcurl/c/curl_multi_get_handles.html --- NEWS | 3 + UPGRADING | 5 ++ ext/curl/curl.stub.php | 2 + ext/curl/curl_arginfo.h | 8 ++- ext/curl/multi.c | 23 +++++++ ext/curl/tests/curl_multi_get_handles.phpt | 71 ++++++++++++++++++++++ 6 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 ext/curl/tests/curl_multi_get_handles.phpt diff --git a/NEWS b/NEWS index 24c1b6a15ec69..67fbaa53d517c 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.5.0alpha1 +- Curl: + . Added curl_multi_get_handles(). (timwolla) + - DOM: . Added Dom\Element::$outerHTML. (nielsdos) diff --git a/UPGRADING b/UPGRADING index 685dfec30c4ab..9b7696b45bc25 100644 --- a/UPGRADING +++ b/UPGRADING @@ -73,6 +73,11 @@ PHP 8.5 UPGRADE NOTES 6. New Functions ======================================== +- Curl: + . curl_multi_get_handles() allows retrieving all CurlHandles current + attached to a CurlMultiHandle. This includes both handles added using + curl_multi_add_handle() and handles accepted by CURLMOPT_PUSHFUNCTION. + - PGSQL: . pg_close_stmt offers an alternative way to close a prepared statement from the DEALLOCATE sql command in that we can reuse diff --git a/ext/curl/curl.stub.php b/ext/curl/curl.stub.php index 49aa7d9646200..8a20231da562b 100644 --- a/ext/curl/curl.stub.php +++ b/ext/curl/curl.stub.php @@ -3702,6 +3702,8 @@ function curl_upkeep(CurlHandle $handle): bool {} function curl_multi_add_handle(CurlMultiHandle $multi_handle, CurlHandle $handle): int {} +function curl_multi_get_handles(CurlMultiHandle $multi_handle): array {} + function curl_multi_close(CurlMultiHandle $multi_handle): void {} function curl_multi_errno(CurlMultiHandle $multi_handle): int {} diff --git a/ext/curl/curl_arginfo.h b/ext/curl/curl_arginfo.h index 7b56622b0a615..664cda7d32a97 100644 --- a/ext/curl/curl_arginfo.h +++ b/ext/curl/curl_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 6a6a7461b475bb10cef3048ee2c11ab0dd32f328 */ + * Stub hash: e2800e5ecc33f092576c7afcdb98d89825809669 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_close, 0, 1, IS_VOID, 0) ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0) @@ -60,6 +60,10 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_add_handle, 0, 2, IS_ ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_get_handles, 0, 1, IS_ARRAY, 0) + ZEND_ARG_OBJ_INFO(0, multi_handle, CurlMultiHandle, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_close, 0, 1, IS_VOID, 0) ZEND_ARG_OBJ_INFO(0, multi_handle, CurlMultiHandle, 0) ZEND_END_ARG_INFO() @@ -153,6 +157,7 @@ ZEND_FUNCTION(curl_init); ZEND_FUNCTION(curl_upkeep); #endif ZEND_FUNCTION(curl_multi_add_handle); +ZEND_FUNCTION(curl_multi_get_handles); ZEND_FUNCTION(curl_multi_close); ZEND_FUNCTION(curl_multi_errno); ZEND_FUNCTION(curl_multi_exec); @@ -190,6 +195,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(curl_upkeep, arginfo_curl_upkeep) #endif ZEND_FE(curl_multi_add_handle, arginfo_curl_multi_add_handle) + ZEND_FE(curl_multi_get_handles, arginfo_curl_multi_get_handles) ZEND_FE(curl_multi_close, arginfo_curl_multi_close) ZEND_FE(curl_multi_errno, arginfo_curl_multi_errno) ZEND_FE(curl_multi_exec, arginfo_curl_multi_exec) diff --git a/ext/curl/multi.c b/ext/curl/multi.c index bb601f575dbba..6456cf6f813e4 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -174,6 +174,29 @@ PHP_FUNCTION(curl_multi_remove_handle) } /* }}} */ +PHP_FUNCTION(curl_multi_get_handles) +{ + zval *z_mh; + php_curlm *mh; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_OBJECT_OF_CLASS(z_mh, curl_multi_ce) + ZEND_PARSE_PARAMETERS_END(); + + mh = Z_CURL_MULTI_P(z_mh); + + array_init(return_value); + zend_llist_position pos; + zval *pz_ch; + + for (pz_ch = (zval *)zend_llist_get_first_ex(&mh->easyh, &pos); pz_ch; + pz_ch = (zval *)zend_llist_get_next_ex(&mh->easyh, &pos)) { + + Z_TRY_ADDREF_P(pz_ch); + add_next_index_zval(return_value, pz_ch); + } +} + /* {{{ Get all the sockets associated with the cURL extension, which can then be "selected" */ PHP_FUNCTION(curl_multi_select) { diff --git a/ext/curl/tests/curl_multi_get_handles.phpt b/ext/curl/tests/curl_multi_get_handles.phpt new file mode 100644 index 0000000000000..41413ac098489 --- /dev/null +++ b/ext/curl/tests/curl_multi_get_handles.phpt @@ -0,0 +1,71 @@ +--TEST-- +array curl_multi_get_handles ( CurlMultiHandle $mh ); +--EXTENSIONS-- +curl +--FILE-- + +--EXPECTF-- +Initializing %scurl_testdata1.txt. +1 handles are attached +Initializing %scurl_testdata2.txt. +2 handles are attached +Request to %scurl_testdata%d.txt finished. +2 handles are attached +1 handles are attached +Success. +Request to %scurl_testdata%d.txt finished. +1 handles are attached +0 handles are attached +Success. +0 handles are attached