Skip to content

Commit a951d49

Browse files
committed
ext/curl: Create macros to codegen the handling of callable options
1 parent 12c19a0 commit a951d49

File tree

1 file changed

+34
-82
lines changed

1 file changed

+34
-82
lines changed

ext/curl/interface.c

Lines changed: 34 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1535,12 +1535,46 @@ static bool php_curl_set_callable_handler(zend_fcall_info_cache *const handler_f
15351535
return true;
15361536
}
15371537

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+
15381560
static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool is_array_config) /* {{{ */
15391561
{
15401562
CURLcode error = CURLE_OK;
15411563
zend_long lval;
15421564

15431565
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+
15441578
/* Long options */
15451579
case CURLOPT_SSL_VERIFYHOST:
15461580
lval = zval_get_long(zvalue);
@@ -2070,88 +2104,6 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
20702104
}
20712105
break;
20722106

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-
21552107
case CURLOPT_RETURNTRANSFER:
21562108
if (zend_is_true(zvalue)) {
21572109
ch->handlers.write->method = PHP_CURL_RETURN;

0 commit comments

Comments
 (0)