@@ -1535,12 +1535,46 @@ static bool php_curl_set_callable_handler(zend_fcall_info_cache *const handler_f
1535
1535
return true;
1536
1536
}
1537
1537
1538
+
1539
+ #define HANDLE_CURL_OPTION_CALLABLE_PHP_CURL_USER (curl_ptr , constant_no_function , handler_type ) \
1540
+ case constant_no_function##FUNCTION: { \
1541
+ bool result = php_curl_set_callable_handler(&curl_ptr->handlers.handler_type->fcc, zvalue, is_array_config, #constant_no_function "FUNCTION"); \
1542
+ if (!result) { \
1543
+ return FAILURE; \
1544
+ } \
1545
+ curl_ptr->handlers.handler_type->method = PHP_CURL_USER; \
1546
+ break; \
1547
+ }
1548
+
1549
+ #define HANDLE_CURL_OPTION_CALLABLE (curl_ptr , constant_no_function , handler_fcc , c_callback ) \
1550
+ case constant_no_function##FUNCTION: { \
1551
+ bool result = php_curl_set_callable_handler(&curl_ptr->handler_fcc, zvalue, is_array_config, #constant_no_function "FUNCTION"); \
1552
+ if (!result) { \
1553
+ return FAILURE; \
1554
+ } \
1555
+ curl_easy_setopt(curl_ptr->cp, constant_no_function##FUNCTION, (c_callback)); \
1556
+ curl_easy_setopt(curl_ptr->cp, constant_no_function##DATA, curl_ptr); \
1557
+ break; \
1558
+ }
1559
+
1538
1560
static zend_result _php_curl_setopt (php_curl * ch , zend_long option , zval * zvalue , bool is_array_config ) /* {{{ */
1539
1561
{
1540
1562
CURLcode error = CURLE_OK ;
1541
1563
zend_long lval ;
1542
1564
1543
1565
switch (option ) {
1566
+ /* Callable options */
1567
+ HANDLE_CURL_OPTION_CALLABLE_PHP_CURL_USER (ch , CURLOPT_WRITE , write );
1568
+ HANDLE_CURL_OPTION_CALLABLE_PHP_CURL_USER (ch , CURLOPT_HEADER , write_header );
1569
+ HANDLE_CURL_OPTION_CALLABLE_PHP_CURL_USER (ch , CURLOPT_READ , read );
1570
+
1571
+ HANDLE_CURL_OPTION_CALLABLE (ch , CURLOPT_PROGRESS , handlers .progress , curl_progress );
1572
+ HANDLE_CURL_OPTION_CALLABLE (ch , CURLOPT_XFERINFO , handlers .xferinfo , curl_xferinfo );
1573
+ HANDLE_CURL_OPTION_CALLABLE (ch , CURLOPT_FNMATCH_ , handlers .fnmatch , curl_fnmatch );
1574
+ #if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
1575
+ HANDLE_CURL_OPTION_CALLABLE (ch , CURLOPT_SSH_HOSTKEY , handlers .sshhostkey , curl_ssh_hostkeyfunction );
1576
+ #endif
1577
+
1544
1578
/* Long options */
1545
1579
case CURLOPT_SSL_VERIFYHOST :
1546
1580
lval = zval_get_long (zvalue );
@@ -2070,88 +2104,6 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
2070
2104
}
2071
2105
break ;
2072
2106
2073
- case CURLOPT_WRITEFUNCTION : {
2074
- /* Check value is actually a callable and set it */
2075
- const char option_name [] = "CURLOPT_WRITEFUNCTION" ;
2076
- bool result = php_curl_set_callable_handler (& ch -> handlers .write -> fcc , zvalue , is_array_config , option_name );
2077
- if (!result ) {
2078
- return FAILURE ;
2079
- }
2080
- ch -> handlers .write -> method = PHP_CURL_USER ;
2081
- break ;
2082
- }
2083
-
2084
- case CURLOPT_HEADERFUNCTION : {
2085
- /* Check value is actually a callable and set it */
2086
- const char option_name [] = "CURLOPT_HEADERFUNCTION" ;
2087
- bool result = php_curl_set_callable_handler (& ch -> handlers .write_header -> fcc , zvalue , is_array_config , option_name );
2088
- if (!result ) {
2089
- return FAILURE ;
2090
- }
2091
- ch -> handlers .write_header -> method = PHP_CURL_USER ;
2092
- break ;
2093
- }
2094
-
2095
- case CURLOPT_READFUNCTION :
2096
- /* Check value is actually a callable and set it */
2097
- const char option_name [] = "CURLOPT_READFUNCTION" ;
2098
- bool result = php_curl_set_callable_handler (& ch -> handlers .read -> fcc , zvalue , is_array_config , option_name );
2099
- if (!result ) {
2100
- return FAILURE ;
2101
- }
2102
- ch -> handlers .read -> method = PHP_CURL_USER ;
2103
- break ;
2104
-
2105
- case CURLOPT_PROGRESSFUNCTION : {
2106
- /* Check value is actually a callable and set it */
2107
- const char option_name [] = "CURLOPT_PROGRESSFUNCTION" ;
2108
- bool result = php_curl_set_callable_handler (& ch -> handlers .progress , zvalue , is_array_config , option_name );
2109
- if (!result ) {
2110
- return FAILURE ;
2111
- }
2112
- curl_easy_setopt (ch -> cp , CURLOPT_PROGRESSFUNCTION , curl_progress );
2113
- curl_easy_setopt (ch -> cp , CURLOPT_PROGRESSDATA , ch );
2114
- break ;
2115
- }
2116
-
2117
- case CURLOPT_XFERINFOFUNCTION : {
2118
- /* Check value is actually a callable and set it */
2119
- const char option_name [] = "CURLOPT_XFERINFOFUNCTION" ;
2120
- bool result = php_curl_set_callable_handler (& ch -> handlers .xferinfo , zvalue , is_array_config , option_name );
2121
- if (!result ) {
2122
- return FAILURE ;
2123
- }
2124
- curl_easy_setopt (ch -> cp , CURLOPT_XFERINFOFUNCTION , curl_xferinfo );
2125
- curl_easy_setopt (ch -> cp , CURLOPT_XFERINFODATA , ch );
2126
- break ;
2127
- }
2128
-
2129
- case CURLOPT_FNMATCH_FUNCTION : {
2130
- /* Check value is actually a callable and set it */
2131
- const char option_name [] = "CURLOPT_FNMATCH_FUNCTION" ;
2132
- bool result = php_curl_set_callable_handler (& ch -> handlers .fnmatch , zvalue , is_array_config , option_name );
2133
- if (!result ) {
2134
- return FAILURE ;
2135
- }
2136
- curl_easy_setopt (ch -> cp , CURLOPT_FNMATCH_FUNCTION , curl_fnmatch );
2137
- curl_easy_setopt (ch -> cp , CURLOPT_FNMATCH_DATA , ch );
2138
- break ;
2139
- }
2140
-
2141
- #if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
2142
- case CURLOPT_SSH_HOSTKEYFUNCTION : {
2143
- /* Check value is actually a callable and set it */
2144
- const char option_name [] = "CURLOPT_SSH_HOSTKEYFUNCTION" ;
2145
- bool result = php_curl_set_callable_handler (& ch -> handlers .sshhostkey , zvalue , is_array_config , option_name );
2146
- if (!result ) {
2147
- return FAILURE ;
2148
- }
2149
- curl_easy_setopt (ch -> cp , CURLOPT_SSH_HOSTKEYFUNCTION , curl_ssh_hostkeyfunction );
2150
- curl_easy_setopt (ch -> cp , CURLOPT_SSH_HOSTKEYDATA , ch );
2151
- break ;
2152
- }
2153
- #endif
2154
-
2155
2107
case CURLOPT_RETURNTRANSFER :
2156
2108
if (zend_is_true (zvalue )) {
2157
2109
ch -> handlers .write -> method = PHP_CURL_RETURN ;
0 commit comments