From 72f393139390db0a5ff59e96bc0bd4bbacd88de6 Mon Sep 17 00:00:00 2001 From: nono303 Date: Tue, 18 Feb 2025 11:15:32 +0100 Subject: [PATCH 01/21] Update duplicated `const feats[]` with `CURL_VERSION_CURLDEBUG`, `CURL_VERSION_THREADSAFE` --- ext/curl/interface.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 311b2f7cc8a59..166c6f206be23 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -290,6 +290,7 @@ PHP_MINFO_FUNCTION(curl) {"AsynchDNS", CURL_VERSION_ASYNCHDNS}, {"CharConv", CURL_VERSION_CONV}, {"Debug", CURL_VERSION_DEBUG}, + {"MemoryDebug", CURL_VERSION_CURLDEBUG}, {"GSS-Negotiate", CURL_VERSION_GSSNEGOTIATE}, {"IDN", CURL_VERSION_IDN}, {"IPv6", CURL_VERSION_IPV6}, @@ -326,6 +327,9 @@ PHP_MINFO_FUNCTION(curl) #if LIBCURL_VERSION_NUM >= 0x074c00 /* Available since 7.76.0 */ {"GSASL", CURL_VERSION_GSASL}, #endif + #if LIBCURL_VERSION_NUM >= 0x075600 /* Available since 7.86.0 */ + {"ThreadSafe", CURL_VERSION_THREADSAFE}, + #endif {NULL, 0} }; @@ -1047,6 +1051,7 @@ PHP_FUNCTION(curl_version) {"AsynchDNS", CURL_VERSION_ASYNCHDNS}, {"CharConv", CURL_VERSION_CONV}, {"Debug", CURL_VERSION_DEBUG}, + {"MemoryDebug", CURL_VERSION_CURLDEBUG}, {"GSS-Negotiate", CURL_VERSION_GSSNEGOTIATE}, {"IDN", CURL_VERSION_IDN}, {"IPv6", CURL_VERSION_IPV6}, @@ -1083,6 +1088,9 @@ PHP_FUNCTION(curl_version) #if LIBCURL_VERSION_NUM >= 0x074c00 /* Available since 7.76.0 */ {"GSASL", CURL_VERSION_GSASL}, #endif + #if LIBCURL_VERSION_NUM >= 0x075600 /* Available since 7.86.0 */ + {"ThreadSafe", CURL_VERSION_THREADSAFE}, + #endif }; for(i = 0; i < sizeof(feats) / sizeof(feats[0]); i++) { From 4a41c4b3d43c1e376f826a0fe6ad804fd4d18984 Mon Sep 17 00:00:00 2001 From: nono303 Date: Tue, 18 Feb 2025 11:20:38 +0100 Subject: [PATCH 02/21] Use `feature_names` if available instead of `const feats[]` and display features as list (like for protocols) --- ext/curl/interface.c | 151 ++++++++++++++++++++++++------------------- 1 file changed, 85 insertions(+), 66 deletions(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 166c6f206be23..0f39784cd5b4a 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -276,67 +276,78 @@ PHP_MINFO_FUNCTION(curl) snprintf(str, sizeof(str), "%d", d->age); php_info_print_table_row(2, "Age", str); - /* To update on each new cURL release using src/main.c in cURL sources */ - /* make sure to sync this list with curl_version as well */ - if (d->features) { - struct feat { - const char *name; - int bitmask; - }; - - unsigned int i; - - static const struct feat feats[] = { - {"AsynchDNS", CURL_VERSION_ASYNCHDNS}, - {"CharConv", CURL_VERSION_CONV}, - {"Debug", CURL_VERSION_DEBUG}, - {"MemoryDebug", CURL_VERSION_CURLDEBUG}, - {"GSS-Negotiate", CURL_VERSION_GSSNEGOTIATE}, - {"IDN", CURL_VERSION_IDN}, - {"IPv6", CURL_VERSION_IPV6}, - {"krb4", CURL_VERSION_KERBEROS4}, - {"Largefile", CURL_VERSION_LARGEFILE}, - {"libz", CURL_VERSION_LIBZ}, - {"NTLM", CURL_VERSION_NTLM}, - {"NTLMWB", CURL_VERSION_NTLM_WB}, - {"SPNEGO", CURL_VERSION_SPNEGO}, - {"SSL", CURL_VERSION_SSL}, - {"SSPI", CURL_VERSION_SSPI}, - {"TLS-SRP", CURL_VERSION_TLSAUTH_SRP}, - {"HTTP2", CURL_VERSION_HTTP2}, - {"GSSAPI", CURL_VERSION_GSSAPI}, - {"KERBEROS5", CURL_VERSION_KERBEROS5}, - {"UNIX_SOCKETS", CURL_VERSION_UNIX_SOCKETS}, - {"PSL", CURL_VERSION_PSL}, - {"HTTPS_PROXY", CURL_VERSION_HTTPS_PROXY}, - {"MULTI_SSL", CURL_VERSION_MULTI_SSL}, - {"BROTLI", CURL_VERSION_BROTLI}, -#if LIBCURL_VERSION_NUM >= 0x074001 /* Available since 7.64.1 */ - {"ALTSVC", CURL_VERSION_ALTSVC}, -#endif -#if LIBCURL_VERSION_NUM >= 0x074200 /* Available since 7.66.0 */ - {"HTTP3", CURL_VERSION_HTTP3}, -#endif -#if LIBCURL_VERSION_NUM >= 0x074800 /* Available since 7.72.0 */ - {"UNICODE", CURL_VERSION_UNICODE}, - {"ZSTD", CURL_VERSION_ZSTD}, -#endif -#if LIBCURL_VERSION_NUM >= 0x074a00 /* Available since 7.74.0 */ - {"HSTS", CURL_VERSION_HSTS}, -#endif -#if LIBCURL_VERSION_NUM >= 0x074c00 /* Available since 7.76.0 */ - {"GSASL", CURL_VERSION_GSASL}, -#endif - #if LIBCURL_VERSION_NUM >= 0x075600 /* Available since 7.86.0 */ - {"ThreadSafe", CURL_VERSION_THREADSAFE}, - #endif - {NULL, 0} - }; - - php_info_print_table_row(1, "Features"); - for(i=0; ifeatures & feats[i].bitmask ? "Yes" : "No"); + // Features + if (d->age >= CURLVERSION_ELEVENTH && d->feature_names) { + n = 0; + p = (char **) d->feature_names; + while (*p != NULL) { + n += snprintf(str + n, sizeof(str) - n, "%s%s", *p, *(p + 1) != NULL ? ", " : ""); + p++; + } + php_info_print_table_row(2, "Features", str); + } else { + /* To update on each new cURL release using src/main.c in cURL sources */ + /* make sure to sync this list with curl_version as well */ + if (d->features) { + struct feat { + const char *name; + int bitmask; + }; + + unsigned int i; + + static const struct feat feats[] = { + {"AsynchDNS", CURL_VERSION_ASYNCHDNS}, + {"CharConv", CURL_VERSION_CONV}, + {"Debug", CURL_VERSION_DEBUG}, + {"MemoryDebug", CURL_VERSION_CURLDEBUG}, + {"GSS-Negotiate", CURL_VERSION_GSSNEGOTIATE}, + {"IDN", CURL_VERSION_IDN}, + {"IPv6", CURL_VERSION_IPV6}, + {"krb4", CURL_VERSION_KERBEROS4}, + {"Largefile", CURL_VERSION_LARGEFILE}, + {"libz", CURL_VERSION_LIBZ}, + {"NTLM", CURL_VERSION_NTLM}, + {"NTLMWB", CURL_VERSION_NTLM_WB}, + {"SPNEGO", CURL_VERSION_SPNEGO}, + {"SSL", CURL_VERSION_SSL}, + {"SSPI", CURL_VERSION_SSPI}, + {"TLS-SRP", CURL_VERSION_TLSAUTH_SRP}, + {"HTTP2", CURL_VERSION_HTTP2}, + {"GSSAPI", CURL_VERSION_GSSAPI}, + {"KERBEROS5", CURL_VERSION_KERBEROS5}, + {"UNIX_SOCKETS", CURL_VERSION_UNIX_SOCKETS}, + {"PSL", CURL_VERSION_PSL}, + {"HTTPS_PROXY", CURL_VERSION_HTTPS_PROXY}, + {"MULTI_SSL", CURL_VERSION_MULTI_SSL}, + {"BROTLI", CURL_VERSION_BROTLI}, + #if LIBCURL_VERSION_NUM >= 0x074001 /* Available since 7.64.1 */ + {"ALTSVC", CURL_VERSION_ALTSVC}, + #endif + #if LIBCURL_VERSION_NUM >= 0x074200 /* Available since 7.66.0 */ + {"HTTP3", CURL_VERSION_HTTP3}, + #endif + #if LIBCURL_VERSION_NUM >= 0x074800 /* Available since 7.72.0 */ + {"UNICODE", CURL_VERSION_UNICODE}, + {"ZSTD", CURL_VERSION_ZSTD}, + #endif + #if LIBCURL_VERSION_NUM >= 0x074a00 /* Available since 7.74.0 */ + {"HSTS", CURL_VERSION_HSTS}, + #endif + #if LIBCURL_VERSION_NUM >= 0x074c00 /* Available since 7.76.0 */ + {"GSASL", CURL_VERSION_GSASL}, + #endif + #if LIBCURL_VERSION_NUM >= 0x075600 /* Available since 7.86.0 */ + {"ThreadSafe", CURL_VERSION_THREADSAFE}, + #endif + {NULL, 0} + }; + + php_info_print_table_row(1, "Features"); + for(i=0; ifeatures & feats[i].bitmask ? "Yes" : "No"); + } } } } @@ -1034,17 +1045,26 @@ PHP_FUNCTION(curl_version) CAAL("version_number", d->version_num); CAAL("age", d->age); - CAAL("features", d->features); + /* Add an array of features */ + zval feature_list; + array_init(&feature_list); + if (d->age >= CURLVERSION_ELEVENTH && d->feature_names) { { + char **p = (char **) d->feature_names; + while (*p != NULL) { + add_next_index_string(&feature_list, *p); + p++; + } + } + } else { + { struct feat { const char *name; int bitmask; }; unsigned int i; - zval feature_list; - array_init(&feature_list); /* Sync this list with PHP_MINFO_FUNCTION(curl) as well */ static const struct feat feats[] = { @@ -1098,9 +1118,8 @@ PHP_FUNCTION(curl_version) add_assoc_bool(&feature_list, feats[i].name, d->features & feats[i].bitmask ? true : false); } } - - CAAZ("feature_list", &feature_list); } + CAAZ("features", &feature_list); CAAL("ssl_version_number", d->ssl_version_num); CAAS("version", d->version); CAAS("host", d->host); From a6b36953abb4df242036b95d70e8b8f29376b34f Mon Sep 17 00:00:00 2001 From: nono303 Date: Tue, 18 Feb 2025 11:22:54 +0100 Subject: [PATCH 03/21] Display SSL supported backends --- ext/curl/interface.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 0f39784cd5b4a..156bcb27ab5dd 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -365,6 +365,14 @@ PHP_MINFO_FUNCTION(curl) if (d->ssl_version) { php_info_print_table_row(2, "SSL Version", d->ssl_version); } + n = 0; + int i; + const curl_ssl_backend **list; + curl_global_sslset(CURLSSLBACKEND_NONE, NULL, &list); + for(i = 0; list[i]; i++) { + n += snprintf(str + n, sizeof(str) - n, "%s%s", list[i]->name, list[i+1] != NULL ? ", " : ""); + } + php_info_print_table_row(2, "SSL backends", str); if (d->libz_version) { php_info_print_table_row(2, "ZLib Version", d->libz_version); @@ -1138,7 +1146,18 @@ PHP_FUNCTION(curl_version) } CAAZ("protocols", &protocol_list); } - if (d->age >= 1) { + /* Add an array of ssl backends */ + { + zval ssl_backends; + array_init(&ssl_backends); + int i; + const curl_ssl_backend **list; + curl_global_sslset(CURLSSLBACKEND_NONE, NULL, &list); + for(i = 0; list[i]; i++) + add_next_index_string (&ssl_backends, list[i]->name); + CAAZ("ssl_backends", &ssl_backends); + } + if (d->age >= 1) { CAAS("ares", d->ares); CAAL("ares_num", d->ares_num); } From ce6aa50597359783f5228813630f18792c922f72 Mon Sep 17 00:00:00 2001 From: nono303 Date: Tue, 18 Feb 2025 11:25:59 +0100 Subject: [PATCH 04/21] Fix typo (like **ares** version was displayed as **ZLib**) --- ext/curl/interface.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 156bcb27ab5dd..f42610364a4f4 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -272,9 +272,10 @@ PHP_MINFO_FUNCTION(curl) d = curl_version_info(CURLVERSION_NOW); php_info_print_table_start(); php_info_print_table_row(2, "cURL support", "enabled"); - php_info_print_table_row(2, "cURL Information", d->version); + php_info_print_table_row(2, "cURL version", d->version); snprintf(str, sizeof(str), "%d", d->age); php_info_print_table_row(2, "Age", str); + php_info_print_table_row(2, "Host", d->host); // Features if (d->age >= CURLVERSION_ELEVENTH && d->feature_names) { @@ -352,6 +353,7 @@ PHP_MINFO_FUNCTION(curl) } } + // Protocols n = 0; p = (char **) d->protocols; while (*p != NULL) { @@ -360,8 +362,7 @@ PHP_MINFO_FUNCTION(curl) } php_info_print_table_row(2, "Protocols", str); - php_info_print_table_row(2, "Host", d->host); - + // SSL if (d->ssl_version) { php_info_print_table_row(2, "SSL Version", d->ssl_version); } @@ -374,13 +375,14 @@ PHP_MINFO_FUNCTION(curl) } php_info_print_table_row(2, "SSL backends", str); + // Feature versions if (d->libz_version) { - php_info_print_table_row(2, "ZLib Version", d->libz_version); + php_info_print_table_row(2, "Zlib Version", d->libz_version); } #if defined(CURLVERSION_SECOND) && CURLVERSION_NOW >= CURLVERSION_SECOND if (d->ares) { - php_info_print_table_row(2, "ZLib Version", d->ares); + php_info_print_table_row(2, "c-ares Version", d->ares); } #endif @@ -1053,6 +1055,7 @@ PHP_FUNCTION(curl_version) CAAL("version_number", d->version_num); CAAL("age", d->age); + CAAS("host", d->host); /* Add an array of features */ zval feature_list; @@ -1130,7 +1133,6 @@ PHP_FUNCTION(curl_version) CAAZ("features", &feature_list); CAAL("ssl_version_number", d->ssl_version_num); CAAS("version", d->version); - CAAS("host", d->host); CAAS("ssl_version", d->ssl_version); CAAS("libz_version", d->libz_version); /* Add an array of protocols */ From e62269517b116cf6c23ea29f045d30667598f9fb Mon Sep 17 00:00:00 2001 From: nono303 Date: Tue, 18 Feb 2025 11:29:40 +0100 Subject: [PATCH 05/21] remove non human readable values (might be discussed) --- ext/curl/interface.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index f42610364a4f4..f91f11858676a 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1053,7 +1053,7 @@ PHP_FUNCTION(curl_version) array_init(return_value); - CAAL("version_number", d->version_num); + CAAS("version", d->version); CAAL("age", d->age); CAAS("host", d->host); @@ -1131,8 +1131,6 @@ PHP_FUNCTION(curl_version) } } CAAZ("features", &feature_list); - CAAL("ssl_version_number", d->ssl_version_num); - CAAS("version", d->version); CAAS("ssl_version", d->ssl_version); CAAS("libz_version", d->libz_version); /* Add an array of protocols */ From 44ec7e7d23107e1a1ef0c4941b26ddf170628e67 Mon Sep 17 00:00:00 2001 From: nono303 Date: Tue, 18 Feb 2025 11:30:54 +0100 Subject: [PATCH 06/21] Fix non-working condition with `CURLVERSION_NOW` using `age` --- ext/curl/interface.c | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index f91f11858676a..5d9a95dc38b90 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -379,25 +379,17 @@ PHP_MINFO_FUNCTION(curl) if (d->libz_version) { php_info_print_table_row(2, "Zlib Version", d->libz_version); } - -#if defined(CURLVERSION_SECOND) && CURLVERSION_NOW >= CURLVERSION_SECOND - if (d->ares) { + if (d->age >= CURLVERSION_SECOND && d->ares) { php_info_print_table_row(2, "c-ares Version", d->ares); } -#endif - -#if defined(CURLVERSION_THIRD) && CURLVERSION_NOW >= CURLVERSION_THIRD - if (d->libidn) { - php_info_print_table_row(2, "libIDN Version", d->libidn); + if (d->age >= CURLVERSION_THIRD && d->libidn) { + php_info_print_table_row(2, "Libidn Version", d->libidn); } -#endif - - if (d->iconv_ver_num) { - php_info_print_table_row(2, "IconV Version", d->iconv_ver_num); + if (d->age >= CURLVERSION_FOURTH && d->iconv_ver_num) { + php_info_print_table_row(2, "Iconv Version", d->iconv_ver_num); } - - if (d->libssh_version) { - php_info_print_table_row(2, "libSSH Version", d->libssh_version); + if (d->age >= CURLVERSION_FOURTH && d->libssh_version) { + php_info_print_table_row(2, "Libssh Version", d->libssh_version); } php_info_print_table_end(); From 477e35c8c825efa00ca5a5afc5e86236496bec58 Mon Sep 17 00:00:00 2001 From: nono303 Date: Tue, 18 Feb 2025 11:34:22 +0100 Subject: [PATCH 07/21] fix feature_names --- ext/curl/interface.c | 115 ++++++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 57 deletions(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 5d9a95dc38b90..dd988173bb7eb 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1062,63 +1062,64 @@ PHP_FUNCTION(curl_version) } } else { { - struct feat { - const char *name; - int bitmask; - }; - - unsigned int i; - - /* Sync this list with PHP_MINFO_FUNCTION(curl) as well */ - static const struct feat feats[] = { - {"AsynchDNS", CURL_VERSION_ASYNCHDNS}, - {"CharConv", CURL_VERSION_CONV}, - {"Debug", CURL_VERSION_DEBUG}, - {"MemoryDebug", CURL_VERSION_CURLDEBUG}, - {"GSS-Negotiate", CURL_VERSION_GSSNEGOTIATE}, - {"IDN", CURL_VERSION_IDN}, - {"IPv6", CURL_VERSION_IPV6}, - {"krb4", CURL_VERSION_KERBEROS4}, - {"Largefile", CURL_VERSION_LARGEFILE}, - {"libz", CURL_VERSION_LIBZ}, - {"NTLM", CURL_VERSION_NTLM}, - {"NTLMWB", CURL_VERSION_NTLM_WB}, - {"SPNEGO", CURL_VERSION_SPNEGO}, - {"SSL", CURL_VERSION_SSL}, - {"SSPI", CURL_VERSION_SSPI}, - {"TLS-SRP", CURL_VERSION_TLSAUTH_SRP}, - {"HTTP2", CURL_VERSION_HTTP2}, - {"GSSAPI", CURL_VERSION_GSSAPI}, - {"KERBEROS5", CURL_VERSION_KERBEROS5}, - {"UNIX_SOCKETS", CURL_VERSION_UNIX_SOCKETS}, - {"PSL", CURL_VERSION_PSL}, - {"HTTPS_PROXY", CURL_VERSION_HTTPS_PROXY}, - {"MULTI_SSL", CURL_VERSION_MULTI_SSL}, - {"BROTLI", CURL_VERSION_BROTLI}, -#if LIBCURL_VERSION_NUM >= 0x074001 /* Available since 7.64.1 */ - {"ALTSVC", CURL_VERSION_ALTSVC}, -#endif -#if LIBCURL_VERSION_NUM >= 0x074200 /* Available since 7.66.0 */ - {"HTTP3", CURL_VERSION_HTTP3}, -#endif -#if LIBCURL_VERSION_NUM >= 0x074800 /* Available since 7.72.0 */ - {"UNICODE", CURL_VERSION_UNICODE}, - {"ZSTD", CURL_VERSION_ZSTD}, -#endif -#if LIBCURL_VERSION_NUM >= 0x074a00 /* Available since 7.74.0 */ - {"HSTS", CURL_VERSION_HSTS}, -#endif -#if LIBCURL_VERSION_NUM >= 0x074c00 /* Available since 7.76.0 */ - {"GSASL", CURL_VERSION_GSASL}, -#endif - #if LIBCURL_VERSION_NUM >= 0x075600 /* Available since 7.86.0 */ - {"ThreadSafe", CURL_VERSION_THREADSAFE}, - #endif - }; - - for(i = 0; i < sizeof(feats) / sizeof(feats[0]); i++) { - if (feats[i].name) { - add_assoc_bool(&feature_list, feats[i].name, d->features & feats[i].bitmask ? true : false); + struct feat { + const char *name; + int bitmask; + }; + + unsigned int i; + + /* Sync this list with PHP_MINFO_FUNCTION(curl) as well */ + static const struct feat feats[] = { + {"AsynchDNS", CURL_VERSION_ASYNCHDNS}, + {"CharConv", CURL_VERSION_CONV}, + {"Debug", CURL_VERSION_DEBUG}, + {"MemoryDebug", CURL_VERSION_CURLDEBUG}, + {"GSS-Negotiate", CURL_VERSION_GSSNEGOTIATE}, + {"IDN", CURL_VERSION_IDN}, + {"IPv6", CURL_VERSION_IPV6}, + {"krb4", CURL_VERSION_KERBEROS4}, + {"Largefile", CURL_VERSION_LARGEFILE}, + {"libz", CURL_VERSION_LIBZ}, + {"NTLM", CURL_VERSION_NTLM}, + {"NTLMWB", CURL_VERSION_NTLM_WB}, + {"SPNEGO", CURL_VERSION_SPNEGO}, + {"SSL", CURL_VERSION_SSL}, + {"SSPI", CURL_VERSION_SSPI}, + {"TLS-SRP", CURL_VERSION_TLSAUTH_SRP}, + {"HTTP2", CURL_VERSION_HTTP2}, + {"GSSAPI", CURL_VERSION_GSSAPI}, + {"KERBEROS5", CURL_VERSION_KERBEROS5}, + {"UNIX_SOCKETS", CURL_VERSION_UNIX_SOCKETS}, + {"PSL", CURL_VERSION_PSL}, + {"HTTPS_PROXY", CURL_VERSION_HTTPS_PROXY}, + {"MULTI_SSL", CURL_VERSION_MULTI_SSL}, + {"BROTLI", CURL_VERSION_BROTLI}, + #if LIBCURL_VERSION_NUM >= 0x074001 /* Available since 7.64.1 */ + {"ALTSVC", CURL_VERSION_ALTSVC}, + #endif + #if LIBCURL_VERSION_NUM >= 0x074200 /* Available since 7.66.0 */ + {"HTTP3", CURL_VERSION_HTTP3}, + #endif + #if LIBCURL_VERSION_NUM >= 0x074800 /* Available since 7.72.0 */ + {"UNICODE", CURL_VERSION_UNICODE}, + {"ZSTD", CURL_VERSION_ZSTD}, + #endif + #if LIBCURL_VERSION_NUM >= 0x074a00 /* Available since 7.74.0 */ + {"HSTS", CURL_VERSION_HSTS}, + #endif + #if LIBCURL_VERSION_NUM >= 0x074c00 /* Available since 7.76.0 */ + {"GSASL", CURL_VERSION_GSASL}, + #endif + #if LIBCURL_VERSION_NUM >= 0x075600 /* Available since 7.86.0 */ + {"ThreadSafe", CURL_VERSION_THREADSAFE}, + #endif + }; + + for(i = 0; i < sizeof(feats) / sizeof(feats[0]); i++) { + if (feats[i].name) { + add_assoc_bool(&feature_list, feats[i].name, d->features & feats[i].bitmask ? true : false); + } } } } From 0fd76062ad563a1018e8d3a43b008d032fc956fe Mon Sep 17 00:00:00 2001 From: nono303 Date: Tue, 18 Feb 2025 11:36:18 +0100 Subject: [PATCH 08/21] Return protocols module versions in an array for `curl_version()` --- ext/curl/interface.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index dd988173bb7eb..053c1a6ac50f1 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1124,15 +1124,12 @@ PHP_FUNCTION(curl_version) } } CAAZ("features", &feature_list); - CAAS("ssl_version", d->ssl_version); - CAAS("libz_version", d->libz_version); + /* Add an array of protocols */ { char **p = (char **) d->protocols; zval protocol_list; - array_init(&protocol_list); - while (*p != NULL) { add_next_index_string(&protocol_list, *p); p++; @@ -1150,20 +1147,28 @@ PHP_FUNCTION(curl_version) add_next_index_string (&ssl_backends, list[i]->name); CAAZ("ssl_backends", &ssl_backends); } - if (d->age >= 1) { - CAAS("ares", d->ares); - CAAL("ares_num", d->ares_num); + zval feature_version; + array_init(&feature_version); + if (d->ssl_version) { + add_assoc_string (&feature_version, "ssl", d->ssl_version); } - if (d->age >= 2) { - CAAS("libidn", d->libidn); + if (d->libz_version) { + add_assoc_string (&feature_version, "libz", d->libz_version); } - if (d->age >= 3) { - CAAL("iconv_ver_num", d->iconv_ver_num); - CAAS("libssh_version", d->libssh_version); + if (d->age >= CURLVERSION_SECOND && d->ares) { + add_assoc_string (&feature_version, "ares", d->ares); + } + if (d->age >= CURLVERSION_THIRD && d->libidn) { + add_assoc_string (&feature_version, "libidn", d->libidn); + } + if (d->age >= CURLVERSION_FOURTH && d->iconv_ver_num) { + CAAL("version_iconv", d->iconv_ver_num); + } + if (d->age >= CURLVERSION_FOURTH && d->libssh_version) { + add_assoc_string (&feature_version, "libssh", d->libssh_version); } - if (d->age >= 4) { - CAAL("brotli_ver_num", d->brotli_ver_num); - CAAS("brotli_version", d->brotli_version); + if (d->age >= CURLVERSION_FIFTH && d->brotli_version) { + add_assoc_string (&feature_version, "brotli", d->brotli_version); } } /* }}} */ From 730cabcf25a03bb3f23e62b955cf890c45927484 Mon Sep 17 00:00:00 2001 From: nono303 Date: Tue, 18 Feb 2025 11:37:14 +0100 Subject: [PATCH 09/21] Add new supported protocols (**Brotli**, **Nghttp2**, **QUIC**, **Zstd**, **Hyper**, **GNU SASL**, **RTMP**) --- ext/curl/interface.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 053c1a6ac50f1..409ff891f58fe 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -391,6 +391,27 @@ PHP_MINFO_FUNCTION(curl) if (d->age >= CURLVERSION_FOURTH && d->libssh_version) { php_info_print_table_row(2, "Libssh Version", d->libssh_version); } + if (d->age >= CURLVERSION_FIFTH && d->brotli_version) { + php_info_print_table_row(2, "Brotli Version", d->brotli_version); + } + if (d->age >= CURLVERSION_SIXTH && d->nghttp2_version) { + php_info_print_table_row(2, "Nghttp2 Version", d->nghttp2_version); + } + if (d->age >= CURLVERSION_SIXTH && d->quic_version) { + php_info_print_table_row(2, "QUIC Version", d->quic_version); + } + if (d->age >= CURLVERSION_EIGHTH && d->zstd_version) { + php_info_print_table_row(2, "Zstd Version", d->zstd_version); + } + if (d->age >= CURLVERSION_NINTH && d->hyper_version) { + php_info_print_table_row(2, "Hyper Version", d->hyper_version); + } + if (d->age >= CURLVERSION_TENTH && d->gsasl_version) { + php_info_print_table_row(2, "GNU SASL Version", d->gsasl_version); + } + if (d->age >= CURLVERSION_TWELFTH && d->rtmp_version) { + php_info_print_table_row(2, "RTMP Version", d->rtmp_version); + } php_info_print_table_end(); @@ -1170,6 +1191,25 @@ PHP_FUNCTION(curl_version) if (d->age >= CURLVERSION_FIFTH && d->brotli_version) { add_assoc_string (&feature_version, "brotli", d->brotli_version); } + if (d->age >= CURLVERSION_SIXTH && d->nghttp2_version) { + add_assoc_string (&feature_version, "nghttp2", d->nghttp2_version); + } + if (d->age >= CURLVERSION_SIXTH && d->quic_version) { + add_assoc_string (&feature_version, "quic", d->quic_version); + } + if (d->age >= CURLVERSION_EIGHTH && d->zstd_version) { + add_assoc_string (&feature_version, "zstd", d->zstd_version); + } + if (d->age >= CURLVERSION_NINTH && d->hyper_version) { + add_assoc_string (&feature_version, "hyper", d->hyper_version); + } + if (d->age >= CURLVERSION_TENTH && d->gsasl_version) { + add_assoc_string (&feature_version, "gsasl", d->gsasl_version); + } + if (d->age >= CURLVERSION_TWELFTH && d->rtmp_version) { + add_assoc_string (&feature_version, "rtmp", d->rtmp_version); + } + CAAZ("feature_versions", &feature_version); } /* }}} */ From 4dd4982ef6c5985498725ae5c4b6ade4ba710174 Mon Sep 17 00:00:00 2001 From: nono303 Date: Tue, 18 Feb 2025 11:41:29 +0100 Subject: [PATCH 10/21] clean indent: space > tab --- ext/curl/interface.c | 84 ++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 409ff891f58fe..aa60ae8383670 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -271,7 +271,7 @@ PHP_MINFO_FUNCTION(curl) d = curl_version_info(CURLVERSION_NOW); php_info_print_table_start(); - php_info_print_table_row(2, "cURL support", "enabled"); + php_info_print_table_row(2, "cURL support", "enabled"); php_info_print_table_row(2, "cURL version", d->version); snprintf(str, sizeof(str), "%d", d->age); php_info_print_table_row(2, "Age", str); @@ -301,7 +301,7 @@ PHP_MINFO_FUNCTION(curl) {"AsynchDNS", CURL_VERSION_ASYNCHDNS}, {"CharConv", CURL_VERSION_CONV}, {"Debug", CURL_VERSION_DEBUG}, - {"MemoryDebug", CURL_VERSION_CURLDEBUG}, + {"MemoryDebug", CURL_VERSION_CURLDEBUG}, {"GSS-Negotiate", CURL_VERSION_GSSNEGOTIATE}, {"IDN", CURL_VERSION_IDN}, {"IPv6", CURL_VERSION_IPV6}, @@ -338,9 +338,9 @@ PHP_MINFO_FUNCTION(curl) #if LIBCURL_VERSION_NUM >= 0x074c00 /* Available since 7.76.0 */ {"GSASL", CURL_VERSION_GSASL}, #endif - #if LIBCURL_VERSION_NUM >= 0x075600 /* Available since 7.86.0 */ - {"ThreadSafe", CURL_VERSION_THREADSAFE}, - #endif + #if LIBCURL_VERSION_NUM >= 0x075600 /* Available since 7.86.0 */ + {"ThreadSafe", CURL_VERSION_THREADSAFE}, + #endif {NULL, 0} }; @@ -788,8 +788,8 @@ static int curl_prereqfunction(void *clientp, char *conn_primary_ip, char *conn_ // gets called. Return CURL_PREREQFUNC_OK immediately in this case to avoid // zend_call_known_fcc() with an uninitialized FCC. if (!ZEND_FCC_INITIALIZED(ch->handlers.prereq)) { - return rval; - } + return rval; + } #if PHP_CURL_DEBUG fprintf(stderr, "curl_prereqfunction() called\n"); @@ -983,42 +983,42 @@ static int curl_debug(CURL *handle, curl_infotype type, char *data, size_t size, { php_curl *ch = (php_curl *)clientp; - #if PHP_CURL_DEBUG - fprintf(stderr, "curl_debug() called\n"); - fprintf(stderr, "type = %d, data = %s\n", type, data); - #endif + #if PHP_CURL_DEBUG + fprintf(stderr, "curl_debug() called\n"); + fprintf(stderr, "type = %d, data = %s\n", type, data); + #endif // Implicitly store the headers for compatibility with CURLINFO_HEADER_OUT // used as a Curl option. Previously, setting CURLINFO_HEADER_OUT set curl_debug // as the CURLOPT_DEBUGFUNCTION and stored the debug data when type is set to // CURLINFO_HEADER_OUT. For backward compatibility, we now store the headers // but also call the user-callback function if available. - if (type == CURLINFO_HEADER_OUT) { - if (ch->header.str) { - zend_string_release_ex(ch->header.str, 0); - } - ch->header.str = zend_string_init(data, size, 0); - } + if (type == CURLINFO_HEADER_OUT) { + if (ch->header.str) { + zend_string_release_ex(ch->header.str, 0); + } + ch->header.str = zend_string_init(data, size, 0); + } - if (!ZEND_FCC_INITIALIZED(ch->handlers.debug)) { - return 0; - } + if (!ZEND_FCC_INITIALIZED(ch->handlers.debug)) { + return 0; + } - zval args[3]; + zval args[3]; - GC_ADDREF(&ch->std); - ZVAL_OBJ(&args[0], &ch->std); - ZVAL_LONG(&args[1], type); - ZVAL_STRINGL(&args[2], data, size); + GC_ADDREF(&ch->std); + ZVAL_OBJ(&args[0], &ch->std); + ZVAL_LONG(&args[1], type); + ZVAL_STRINGL(&args[2], data, size); - ch->in_callback = true; - zend_call_known_fcc(&ch->handlers.debug, NULL, /* param_count */ 3, args, /* named_params */ NULL); - ch->in_callback = false; + ch->in_callback = true; + zend_call_known_fcc(&ch->handlers.debug, NULL, /* param_count */ 3, args, /* named_params */ NULL); + ch->in_callback = false; - zval_ptr_dtor(&args[0]); - zval_ptr_dtor(&args[2]); + zval_ptr_dtor(&args[0]); + zval_ptr_dtor(&args[2]); - return 0; + return 0; } /* }}} */ @@ -1074,7 +1074,7 @@ PHP_FUNCTION(curl_version) zval feature_list; array_init(&feature_list); if (d->age >= CURLVERSION_ELEVENTH && d->feature_names) { - { + { char **p = (char **) d->feature_names; while (*p != NULL) { add_next_index_string(&feature_list, *p); @@ -1095,7 +1095,7 @@ PHP_FUNCTION(curl_version) {"AsynchDNS", CURL_VERSION_ASYNCHDNS}, {"CharConv", CURL_VERSION_CONV}, {"Debug", CURL_VERSION_DEBUG}, - {"MemoryDebug", CURL_VERSION_CURLDEBUG}, + {"MemoryDebug", CURL_VERSION_CURLDEBUG}, {"GSS-Negotiate", CURL_VERSION_GSSNEGOTIATE}, {"IDN", CURL_VERSION_IDN}, {"IPv6", CURL_VERSION_IPV6}, @@ -1132,9 +1132,9 @@ PHP_FUNCTION(curl_version) #if LIBCURL_VERSION_NUM >= 0x074c00 /* Available since 7.76.0 */ {"GSASL", CURL_VERSION_GSASL}, #endif - #if LIBCURL_VERSION_NUM >= 0x075600 /* Available since 7.86.0 */ - {"ThreadSafe", CURL_VERSION_THREADSAFE}, - #endif + #if LIBCURL_VERSION_NUM >= 0x075600 /* Available since 7.86.0 */ + {"ThreadSafe", CURL_VERSION_THREADSAFE}, + #endif }; for(i = 0; i < sizeof(feats) / sizeof(feats[0]); i++) { @@ -1184,8 +1184,8 @@ PHP_FUNCTION(curl_version) } if (d->age >= CURLVERSION_FOURTH && d->iconv_ver_num) { CAAL("version_iconv", d->iconv_ver_num); - } - if (d->age >= CURLVERSION_FOURTH && d->libssh_version) { + } + if (d->age >= CURLVERSION_FOURTH && d->libssh_version) { add_assoc_string (&feature_version, "libssh", d->libssh_version); } if (d->age >= CURLVERSION_FIFTH && d->brotli_version) { @@ -1193,7 +1193,7 @@ PHP_FUNCTION(curl_version) } if (d->age >= CURLVERSION_SIXTH && d->nghttp2_version) { add_assoc_string (&feature_version, "nghttp2", d->nghttp2_version); - } + } if (d->age >= CURLVERSION_SIXTH && d->quic_version) { add_assoc_string (&feature_version, "quic", d->quic_version); } @@ -2370,9 +2370,9 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue case CURLINFO_HEADER_OUT: if (ZEND_FCC_INITIALIZED(ch->handlers.debug)) { - zend_value_error("CURLINFO_HEADER_OUT option must not be set when the CURLOPT_DEBUGFUNCTION option is set"); - return FAILURE; - } + zend_value_error("CURLINFO_HEADER_OUT option must not be set when the CURLOPT_DEBUGFUNCTION option is set"); + return FAILURE; + } if (zend_is_true(zvalue)) { curl_easy_setopt(ch->cp, CURLOPT_DEBUGFUNCTION, curl_debug); From 72c54a5340b05254395404f6d83aa25d27c06321 Mon Sep 17 00:00:00 2001 From: nono303 Date: Tue, 18 Feb 2025 14:42:31 +0100 Subject: [PATCH 11/21] rollback for curl_version() - put back long: version_number & features - keep original key: feature_list --- ext/curl/interface.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index aa60ae8383670..fc5b31e7095ad 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1067,9 +1067,10 @@ PHP_FUNCTION(curl_version) array_init(return_value); CAAS("version", d->version); + CAAL("version_number", d->version_num); CAAL("age", d->age); CAAS("host", d->host); - + CAAL("features", d->features); /* Add an array of features */ zval feature_list; array_init(&feature_list); @@ -1144,7 +1145,7 @@ PHP_FUNCTION(curl_version) } } } - CAAZ("features", &feature_list); + CAAZ("feature_list", &feature_list); /* Add an array of protocols */ { From 2076e8ad4a57fe96cde6f3b4777bce26585c4bde Mon Sep 17 00:00:00 2001 From: nono303 Date: Wed, 19 Feb 2025 12:43:28 +0100 Subject: [PATCH 12/21] use LIBCURL_VERSION_NUM to fix https://github.com/php/php-src/pull/17848/commits/44ec7e7d23107e1a1ef0c4941b26ddf170628e67 --- ext/curl/interface.c | 102 +++++++++++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 29 deletions(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index fc5b31e7095ad..dd5cb5f8d4ce5 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -278,7 +278,7 @@ PHP_MINFO_FUNCTION(curl) php_info_print_table_row(2, "Host", d->host); // Features - if (d->age >= CURLVERSION_ELEVENTH && d->feature_names) { +#if LIBCURL_VERSION_NUM >= 0x075700 /* Available since 7.87.0 CURLVERSION_ELEVENTH */ n = 0; p = (char **) d->feature_names; while (*p != NULL) { @@ -286,7 +286,7 @@ PHP_MINFO_FUNCTION(curl) p++; } php_info_print_table_row(2, "Features", str); - } else { +#else /* To update on each new cURL release using src/main.c in cURL sources */ /* make sure to sync this list with curl_version as well */ if (d->features) { @@ -351,7 +351,7 @@ PHP_MINFO_FUNCTION(curl) } } } - } +#endif // Protocols n = 0; @@ -379,39 +379,61 @@ PHP_MINFO_FUNCTION(curl) if (d->libz_version) { php_info_print_table_row(2, "Zlib Version", d->libz_version); } - if (d->age >= CURLVERSION_SECOND && d->ares) { +#if LIBCURL_VERSION_NUM >= 0x070B01 /* Available since 7.11.1 CURLVERSION_SECOND */ + if (d->ares) { php_info_print_table_row(2, "c-ares Version", d->ares); } - if (d->age >= CURLVERSION_THIRD && d->libidn) { +#endif +#if LIBCURL_VERSION_NUM >= 0x070C00 /* Available since 7.12.0 CURLVERSION_THIRD */ + if (d->libidn) { php_info_print_table_row(2, "Libidn Version", d->libidn); } - if (d->age >= CURLVERSION_FOURTH && d->iconv_ver_num) { +#endif +#if LIBCURL_VERSION_NUM >= 0x071001 /* Available since 7.16.1 CURLVERSION_FOURTH */ + if (d->iconv_ver_num) { php_info_print_table_row(2, "Iconv Version", d->iconv_ver_num); } - if (d->age >= CURLVERSION_FOURTH && d->libssh_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x071001 /* Available since 7.16.1 CURLVERSION_FOURTH */ + if (d->libssh_version) { php_info_print_table_row(2, "Libssh Version", d->libssh_version); } - if (d->age >= CURLVERSION_FIFTH && d->brotli_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x073900 /* Available since 7.57.0 CURLVERSION_FIFTH */ + if (d->brotli_version) { php_info_print_table_row(2, "Brotli Version", d->brotli_version); } - if (d->age >= CURLVERSION_SIXTH && d->nghttp2_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x074200 /* Available since 7.66.0 CURLVERSION_SIXTH */ + if (d->nghttp2_version) { php_info_print_table_row(2, "Nghttp2 Version", d->nghttp2_version); } - if (d->age >= CURLVERSION_SIXTH && d->quic_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x074200 /* Available since 7.66.0 CURLVERSION_SIXTH */ + if (d->quic_version) { php_info_print_table_row(2, "QUIC Version", d->quic_version); } - if (d->age >= CURLVERSION_EIGHTH && d->zstd_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x074800 /* Available since 7.72.0 CURLVERSION_EIGHTH */ + if (d->zstd_version) { php_info_print_table_row(2, "Zstd Version", d->zstd_version); } - if (d->age >= CURLVERSION_NINTH && d->hyper_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x074b00 /* Available since 7.75.0 CURLVERSION_NINTH */ + if ( d->hyper_version) { php_info_print_table_row(2, "Hyper Version", d->hyper_version); } - if (d->age >= CURLVERSION_TENTH && d->gsasl_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x074d00 /* Available since 7.77.0 CURLVERSION_TENTH */ + if (d->gsasl_version) { php_info_print_table_row(2, "GNU SASL Version", d->gsasl_version); } - if (d->age >= CURLVERSION_TWELFTH && d->rtmp_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x080800 /* Available since 8.8.0 CURLVERSION_TWELFTH */ + if (d->rtmp_version) { php_info_print_table_row(2, "RTMP Version", d->rtmp_version); } +#endif php_info_print_table_end(); @@ -1074,7 +1096,7 @@ PHP_FUNCTION(curl_version) /* Add an array of features */ zval feature_list; array_init(&feature_list); - if (d->age >= CURLVERSION_ELEVENTH && d->feature_names) { +#if defined(CURLVERSION_ELEVENTH) && CURLVERSION_NOW >= CURLVERSION_ELEVENTH { char **p = (char **) d->feature_names; while (*p != NULL) { @@ -1082,7 +1104,7 @@ PHP_FUNCTION(curl_version) p++; } } - } else { +#else { struct feat { const char *name; @@ -1144,7 +1166,7 @@ PHP_FUNCTION(curl_version) } } } - } +#endif CAAZ("feature_list", &feature_list); /* Add an array of protocols */ @@ -1177,39 +1199,61 @@ PHP_FUNCTION(curl_version) if (d->libz_version) { add_assoc_string (&feature_version, "libz", d->libz_version); } - if (d->age >= CURLVERSION_SECOND && d->ares) { +#if LIBCURL_VERSION_NUM >= 0x070B01 /* Available since 7.11.1 CURLVERSION_SECOND */ + if (d->ares) { add_assoc_string (&feature_version, "ares", d->ares); } - if (d->age >= CURLVERSION_THIRD && d->libidn) { +#endif +#if LIBCURL_VERSION_NUM >= 0x070C00 /* Available since 7.12.0 CURLVERSION_THIRD */ + if (d->libidn) { add_assoc_string (&feature_version, "libidn", d->libidn); } - if (d->age >= CURLVERSION_FOURTH && d->iconv_ver_num) { - CAAL("version_iconv", d->iconv_ver_num); +#endif +#if LIBCURL_VERSION_NUM >= 0x071001 /* Available since 7.16.1 CURLVERSION_FOURTH */ + if (d->iconv_ver_num) { + add_assoc_string (&feature_version, "iconv", d->iconv_ver_num); } - if (d->age >= CURLVERSION_FOURTH && d->libssh_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x071001 /* Available since 7.16.1 CURLVERSION_FOURTH */ + if (d->libssh_version) { add_assoc_string (&feature_version, "libssh", d->libssh_version); } - if (d->age >= CURLVERSION_FIFTH && d->brotli_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x073900 /* Available since 7.57.0 CURLVERSION_FIFTH */ + if (d->brotli_version) { add_assoc_string (&feature_version, "brotli", d->brotli_version); } - if (d->age >= CURLVERSION_SIXTH && d->nghttp2_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x074200 /* Available since 7.66.0 CURLVERSION_SIXTH */ + if (d->nghttp2_version) { add_assoc_string (&feature_version, "nghttp2", d->nghttp2_version); } - if (d->age >= CURLVERSION_SIXTH && d->quic_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x074200 /* Available since 7.66.0 CURLVERSION_SIXTH */ + if (d->quic_version) { add_assoc_string (&feature_version, "quic", d->quic_version); } - if (d->age >= CURLVERSION_EIGHTH && d->zstd_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x074800 /* Available since 7.72.0 CURLVERSION_EIGHTH */ + if (d->zstd_version) { add_assoc_string (&feature_version, "zstd", d->zstd_version); } - if (d->age >= CURLVERSION_NINTH && d->hyper_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x074b00 /* Available since 7.75.0 CURLVERSION_NINTH */ + if (d->hyper_version) { add_assoc_string (&feature_version, "hyper", d->hyper_version); } - if (d->age >= CURLVERSION_TENTH && d->gsasl_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x074d00 /* Available since 7.77.0 CURLVERSION_TENTH */ + if (d->gsasl_version) { add_assoc_string (&feature_version, "gsasl", d->gsasl_version); } - if (d->age >= CURLVERSION_TWELFTH && d->rtmp_version) { +#endif +#if LIBCURL_VERSION_NUM >= 0x080800 /* Available since 8.8.0 CURLVERSION_TWELFTH */ + if (d->rtmp_version) { add_assoc_string (&feature_version, "rtmp", d->rtmp_version); } +#endif CAAZ("feature_versions", &feature_version); } /* }}} */ From 740f2701437750e6dd77cfc109a31a67f15e76a4 Mon Sep 17 00:00:00 2001 From: nono303 Date: Wed, 19 Feb 2025 15:03:14 +0100 Subject: [PATCH 13/21] fix incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *' --- ext/curl/interface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index dd5cb5f8d4ce5..8cbfbe6ce81c3 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1211,7 +1211,7 @@ PHP_FUNCTION(curl_version) #endif #if LIBCURL_VERSION_NUM >= 0x071001 /* Available since 7.16.1 CURLVERSION_FOURTH */ if (d->iconv_ver_num) { - add_assoc_string (&feature_version, "iconv", d->iconv_ver_num); + add_assoc_long (&feature_version, "iconv", d->iconv_ver_num); } #endif #if LIBCURL_VERSION_NUM >= 0x071001 /* Available since 7.16.1 CURLVERSION_FOURTH */ From 3b3d5fb3253b4bd9abb85480c29d003f7ae0250e Mon Sep 17 00:00:00 2001 From: nono303 Date: Wed, 19 Feb 2025 16:44:53 +0100 Subject: [PATCH 14/21] typo --- ext/curl/interface.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 8cbfbe6ce81c3..cbfa62a1a0f5f 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1191,70 +1191,70 @@ PHP_FUNCTION(curl_version) add_next_index_string (&ssl_backends, list[i]->name); CAAZ("ssl_backends", &ssl_backends); } - zval feature_version; - array_init(&feature_version); + zval features_version; + array_init(&features_version); if (d->ssl_version) { - add_assoc_string (&feature_version, "ssl", d->ssl_version); + add_assoc_string (&features_version, "ssl", d->ssl_version); } if (d->libz_version) { - add_assoc_string (&feature_version, "libz", d->libz_version); + add_assoc_string (&features_version, "libz", d->libz_version); } #if LIBCURL_VERSION_NUM >= 0x070B01 /* Available since 7.11.1 CURLVERSION_SECOND */ if (d->ares) { - add_assoc_string (&feature_version, "ares", d->ares); + add_assoc_string (&features_version, "ares", d->ares); } #endif #if LIBCURL_VERSION_NUM >= 0x070C00 /* Available since 7.12.0 CURLVERSION_THIRD */ if (d->libidn) { - add_assoc_string (&feature_version, "libidn", d->libidn); + add_assoc_string (&features_version, "libidn", d->libidn); } #endif #if LIBCURL_VERSION_NUM >= 0x071001 /* Available since 7.16.1 CURLVERSION_FOURTH */ if (d->iconv_ver_num) { - add_assoc_long (&feature_version, "iconv", d->iconv_ver_num); + add_assoc_long (&features_version, "iconv", d->iconv_ver_num); } #endif #if LIBCURL_VERSION_NUM >= 0x071001 /* Available since 7.16.1 CURLVERSION_FOURTH */ if (d->libssh_version) { - add_assoc_string (&feature_version, "libssh", d->libssh_version); + add_assoc_string (&features_version, "libssh", d->libssh_version); } #endif #if LIBCURL_VERSION_NUM >= 0x073900 /* Available since 7.57.0 CURLVERSION_FIFTH */ if (d->brotli_version) { - add_assoc_string (&feature_version, "brotli", d->brotli_version); + add_assoc_string (&features_version, "brotli", d->brotli_version); } #endif #if LIBCURL_VERSION_NUM >= 0x074200 /* Available since 7.66.0 CURLVERSION_SIXTH */ if (d->nghttp2_version) { - add_assoc_string (&feature_version, "nghttp2", d->nghttp2_version); + add_assoc_string (&features_version, "nghttp2", d->nghttp2_version); } #endif #if LIBCURL_VERSION_NUM >= 0x074200 /* Available since 7.66.0 CURLVERSION_SIXTH */ if (d->quic_version) { - add_assoc_string (&feature_version, "quic", d->quic_version); + add_assoc_string (&features_version, "quic", d->quic_version); } #endif #if LIBCURL_VERSION_NUM >= 0x074800 /* Available since 7.72.0 CURLVERSION_EIGHTH */ if (d->zstd_version) { - add_assoc_string (&feature_version, "zstd", d->zstd_version); + add_assoc_string (&features_version, "zstd", d->zstd_version); } #endif #if LIBCURL_VERSION_NUM >= 0x074b00 /* Available since 7.75.0 CURLVERSION_NINTH */ if (d->hyper_version) { - add_assoc_string (&feature_version, "hyper", d->hyper_version); + add_assoc_string (&features_version, "hyper", d->hyper_version); } #endif #if LIBCURL_VERSION_NUM >= 0x074d00 /* Available since 7.77.0 CURLVERSION_TENTH */ if (d->gsasl_version) { - add_assoc_string (&feature_version, "gsasl", d->gsasl_version); + add_assoc_string (&features_version, "gsasl", d->gsasl_version); } #endif #if LIBCURL_VERSION_NUM >= 0x080800 /* Available since 8.8.0 CURLVERSION_TWELFTH */ if (d->rtmp_version) { - add_assoc_string (&feature_version, "rtmp", d->rtmp_version); + add_assoc_string (&features_version, "rtmp", d->rtmp_version); } #endif - CAAZ("feature_versions", &feature_version); + CAAZ("features_versions", &features_version); } /* }}} */ From 2bf74963e655b4e3e90aa26515e4701fc6b05604 Mon Sep 17 00:00:00 2001 From: nono303 Date: Wed, 19 Feb 2025 16:47:19 +0100 Subject: [PATCH 15/21] BC: - remove ssl_version_number: not used anymore, always 0 https://github.com/curl/curl/blob/master/include/curl/curl.h#L3089 - ["ssl_version"] & ["libz_version"] moved to ["features_version"]["ssl"] & ["features_version"]["libz"] --- ext/curl/tests/curl_version_basic_001.phpt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ext/curl/tests/curl_version_basic_001.phpt b/ext/curl/tests/curl_version_basic_001.phpt index 52652822a308f..8c3896f68bf5d 100644 --- a/ext/curl/tests/curl_version_basic_001.phpt +++ b/ext/curl/tests/curl_version_basic_001.phpt @@ -8,18 +8,16 @@ curl var_dump($info_curl["version_number"]); var_dump($info_curl["age"]); var_dump($info_curl["features"]); - var_dump($info_curl["ssl_version_number"]); var_dump($info_curl["version"]); var_dump($info_curl["host"]); - var_dump($info_curl["ssl_version"]); - var_dump($info_curl["libz_version"]); + var_dump($info_curl["features_version"]["ssl"]); + var_dump($info_curl["features_version"]["libz"]); var_dump(array_key_exists("protocols", $info_curl)); ?> --EXPECTF-- int(%i) int(%i) int(%i) -int(%i) string(%i) "%s" string(%i) "%s" string(%i) "%S" From e7a4806a075a479a498a39d95241d1ae115a6732 Mon Sep 17 00:00:00 2001 From: nono303 Date: Wed, 19 Feb 2025 17:05:33 +0100 Subject: [PATCH 16/21] typo --- ext/curl/interface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index cbfa62a1a0f5f..0ec074833c46f 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1254,7 +1254,7 @@ PHP_FUNCTION(curl_version) add_assoc_string (&features_version, "rtmp", d->rtmp_version); } #endif - CAAZ("features_versions", &features_version); + CAAZ("features_version", &features_version); } /* }}} */ From 3b9b4980885b7f04be21d3629ccdeff27f9e89a6 Mon Sep 17 00:00:00 2001 From: nono303 Date: Thu, 20 Feb 2025 10:10:21 +0100 Subject: [PATCH 17/21] fix curl/tests/curl_version_features-array.phpt with new feature_list --- ext/curl/tests/curl_version_features-array.phpt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ext/curl/tests/curl_version_features-array.phpt b/ext/curl/tests/curl_version_features-array.phpt index 3bf47cea4f3bb..46c01ed1a068d 100644 --- a/ext/curl/tests/curl_version_features-array.phpt +++ b/ext/curl/tests/curl_version_features-array.phpt @@ -29,6 +29,7 @@ Array [AsynchDNS] => bool [CharConv] => bool [Debug] => bool + [MemoryDebug] => bool [GSS-Negotiate] => bool [IDN] => bool [IPv6] => bool @@ -49,5 +50,12 @@ Array [HTTPS_PROXY] => bool [MULTI_SSL] => bool [BROTLI] => bool + [ALTSVC] => bool + [HTTP3] => bool + [UNICODE] => bool + [ZSTD] => bool + [HSTS] => bool + [GSASL] => bool + [ThreadSafe] => bool %A) Complete From 7450dd132c9a0bef39d88b4c3021adc9e949e684 Mon Sep 17 00:00:00 2001 From: nono303 Date: Thu, 20 Feb 2025 10:53:59 +0100 Subject: [PATCH 18/21] fix check_win_config.phpt --- ext/curl/tests/check_win_config.phpt | 41 +++++----------------------- 1 file changed, 7 insertions(+), 34 deletions(-) diff --git a/ext/curl/tests/check_win_config.phpt b/ext/curl/tests/check_win_config.phpt index fc29e37281970..b031704949b1a 100644 --- a/ext/curl/tests/check_win_config.phpt +++ b/ext/curl/tests/check_win_config.phpt @@ -22,41 +22,14 @@ if(substr(PHP_OS, 0, 3) != 'WIN' ) DONE --EXPECTF-- cURL support => enabled -cURL Information => %s +cURL version => %s Age => %d -Features -AsynchDNS => Yes -CharConv => No -Debug => No -GSS-Negotiate => No -IDN => Yes -IPv6 => Yes -krb4 => No -Largefile => Yes -libz => Yes -NTLM => Yes -NTLMWB => No -SPNEGO => Yes -SSL => Yes -SSPI => Yes -TLS-SRP => No -HTTP2 => Yes -GSSAPI => No -KERBEROS5 => Yes -UNIX_SOCKETS => %r(Yes|No)%r -PSL => No -HTTPS_PROXY => Yes -MULTI_SSL => %s -BROTLI => %s -ALTSVC => Yes -HTTP3 => No -UNICODE => No -ZSTD => No -HSTS => Yes -GSASL => No -Protocols => dict, file, ftp, ftps, gopher, %r(gophers, )?%rhttp, https, imap, imaps, ldap, ldaps, %r(mqtt, )?%rpop3, pop3s, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp%r(, ws)?(, wss)?%r Host => %s-pc-win32 +Features => alt-svc, AsynchDNS, HSTS, HTTP2, HTTPS-proxy, IDN, IPv6, Kerberos, Largefile, libz, NTLM, SPNEGO, SSL, SSPI, threadsafe, UnixSockets +Protocols => dict, file, ftp, ftps, gopher, %r(gophers, )?%rhttp, https, imap, imaps, ldap, ldaps, %r(mqtt, )?%rpop3, pop3s, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp%r(, ws)?(, wss)?%r SSL Version => OpenSSL/%s -ZLib Version => %s -libSSH Version => libssh2/%s +SSL backends => %s +Zlib Version => %s +Libssh Version => libssh2/%s +Nghttp2 Version => %s DONE From 7278aae6770bdae699639182c4bc18174a1a4905 Mon Sep 17 00:00:00 2001 From: nono303 Date: Thu, 20 Feb 2025 18:28:33 +0100 Subject: [PATCH 19/21] fix last usage of CURLVERSION_* --- ext/curl/interface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 0ec074833c46f..12ffcb5571093 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1096,7 +1096,7 @@ PHP_FUNCTION(curl_version) /* Add an array of features */ zval feature_list; array_init(&feature_list); -#if defined(CURLVERSION_ELEVENTH) && CURLVERSION_NOW >= CURLVERSION_ELEVENTH +#if LIBCURL_VERSION_NUM >= 0x075700 /* Available since 7.87.0 CURLVERSION_ELEVENTH */ { char **p = (char **) d->feature_names; while (*p != NULL) { From f5c2245cf597d2aa0caac5625cfb0075d2b58503 Mon Sep 17 00:00:00 2001 From: nono303 Date: Fri, 21 Feb 2025 09:57:48 +0100 Subject: [PATCH 20/21] fix curl_version_features-array for LIBCURL_VERSION_NUM >= 7.87.0 (only enabled features are listed) --- ext/curl/interface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 12ffcb5571093..24e43534169e6 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1100,7 +1100,7 @@ PHP_FUNCTION(curl_version) { char **p = (char **) d->feature_names; while (*p != NULL) { - add_next_index_string(&feature_list, *p); + add_assoc_bool(&feature_list, *p, true); p++; } } From 8787e289b8fc8a1257d4d87addd6a775e0876b2a Mon Sep 17 00:00:00 2001 From: nono303 Date: Fri, 21 Feb 2025 10:28:23 +0100 Subject: [PATCH 21/21] update expected based on LINUX_X64_RELEASE_NTS (as curl implementation may / are different between OS) --- .../tests/curl_version_features-array.phpt | 33 +++++++------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/ext/curl/tests/curl_version_features-array.phpt b/ext/curl/tests/curl_version_features-array.phpt index 46c01ed1a068d..2b348fbcf5002 100644 --- a/ext/curl/tests/curl_version_features-array.phpt +++ b/ext/curl/tests/curl_version_features-array.phpt @@ -26,36 +26,25 @@ curl --EXPECTF-- Array ( + [alt-svc] => bool [AsynchDNS] => bool - [CharConv] => bool - [Debug] => bool - [MemoryDebug] => bool - [GSS-Negotiate] => bool + [brotli] => bool + [GSS-API] => bool + [HSTS] => bool + [HTTP2] => bool + [HTTPS-proxy] => bool [IDN] => bool [IPv6] => bool - [krb4] => bool + [Kerberos] => bool [Largefile] => bool [libz] => bool [NTLM] => bool - [NTLMWB] => bool + [PSL] => bool [SPNEGO] => bool [SSL] => bool - [SSPI] => bool + [threadsafe] => bool [TLS-SRP] => bool - [HTTP2] => bool - [GSSAPI] => bool - [KERBEROS5] => bool - [UNIX_SOCKETS] => bool - [PSL] => bool - [HTTPS_PROXY] => bool - [MULTI_SSL] => bool - [BROTLI] => bool - [ALTSVC] => bool - [HTTP3] => bool - [UNICODE] => bool - [ZSTD] => bool - [HSTS] => bool - [GSASL] => bool - [ThreadSafe] => bool + [UnixSockets] => bool + [zstd] => bool %A) Complete