From cec20f615db844f1b77a5685ad266452602a98a3 Mon Sep 17 00:00:00 2001 From: Pierrick Charron Date: Sun, 5 Jun 2022 14:50:23 -0400 Subject: [PATCH 1/2] Expose new constants from libcurl 7.62 to 7.80 --- NEWS | 3 + UPGRADING | 78 ++++++++++++++++++- ext/curl/interface.c | 178 +++++++++++++++++++++++++++++++++++++++++++ ext/curl/multi.c | 3 + 4 files changed, 261 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 04e237e04ff44..00685a58293d5 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,9 @@ PHP NEWS . Fixed bug GH-7821 and GH-8418 (Allow arbitrary const expressions in backed enums). (ilutov) +- Curl: + . Added new constants from cURL 7.62 to 7.80. (Pierrick) + - MBString: . Backwards-compatible mappings for 0x5C/0x7E in Shift-JIS are restored, after they had been changed in 8.1.0. (Alex Dowad) diff --git a/UPGRADING b/UPGRADING index dc770ff148a42..5ef8b778936ec 100644 --- a/UPGRADING +++ b/UPGRADING @@ -76,6 +76,7 @@ PHP 8.2 UPGRADE NOTES - Curl: . Added CURLINFO_EFFECTIVE_METHOD option and returning the effective HTTP method in curl_getinfo() return value. + . Exposed multiple new constants from libcurl 7.62 to 7.80. - OCI8: . Added an oci8.prefetch_lob_size directive and oci_set_prefetch_lob() @@ -240,8 +241,83 @@ PHP 8.2 UPGRADE NOTES . LOCALE_NEUTRAL - Curl: - . CURLOPT_XFERINFOFUNCTION + . CURLALTSVC_H1 (libcurl >= 7.64.1) + . CURLALTSVC_H2 (libcurl >= 7.64.1) + . CURLALTSVC_H3 (libcurl >= 7.64.1) + . CURLALTSVC_READONLYFILE (libcurl >= 7.64.1) + . CURLAUTH_AWS_SIGV4 (libcurl >= 7.75.0) + . CURLE_PROXY (libcurl >= 7.73.0) + . CURLFTPMETHOD_DEFAULT + . CURLHSTS_ENABLE (libcurl >= 7.74.0) + . CURLHSTS_READONLYFILE (libcurl >= 7.74.0) + . CURLINFO_PROXY_ERROR (libcurl >= 7.73.0) + . CURLINFO_REFERER (libcurl >= 7.76.0) + . CURLINFO_RETRY_AFTER (libcurl >= 7.66.0) + . CURLMOPT_MAX_CONCURRENT_STREAMS (libcurl >= 7.67.0) + . CURLOPT_ALTSVC_CTRL (libcurl >= 7.64.1) + . CURLOPT_ALTSVC (libcurl >= 7.64.1) + . CURLOPT_AWS_SIGV4 (libcurl >= 7.75.0) + . CURLOPT_CAINFO_BLOB (libcurl >= 7.77.0) + . CURLOPT_DOH_SSL_VERIFYHOST (libcurl >= 7.76.0) + . CURLOPT_DOH_SSL_VERIFYPEER (libcurl >= 7.76.0) + . CURLOPT_DOH_SSL_VERIFYSTATUS (libcurl >= 7.76.0) + . CURLOPT_HSTS_CTRL (libcurl >= 7.74.0) + . CURLOPT_HSTS (libcurl >= 7.74.0) + . CURLOPT_MAIL_RCPT_ALLLOWFAILS (libcurl >= 7.69.0) + . CURLOPT_MAXAGE_CONN (libcurl >= 7.65.0) . CURLOPT_MAXFILESIZE_LARGE + . CURLOPT_MAXLIFETIME_CONN (libcurl >= 7.80.0) + . CURLOPT_PROXY_CAINFO_BLOB (libcurl >= 7.77.0) + . CURLOPT_SASL_AUTHZID (libcurl >= 7.66.0) + . CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256 (libcurl >= 7.80.0) + . CURLOPT_SSL_EC_CURVES (libcurl >= 7.73.0) + . CURLOPT_UPKEEP_INTERVAL_MS (libcurl >= 7.62.0) + . CURLOPT_UPLOAD_BUFFERSIZE (libcurl >= 7.62.0) + . CURLOPT_XFERINFOFUNCTION (libcurl >= 7.32.0) + . CURLPROTO_MQTT (libcurl >= 7.71.0) + . CURLPX_BAD_ADDRESS_TYPE (libcurl >= 7.73.0) + . CURLPX_BAD_VERSION (libcurl >= 7.73.0) + . CURLPX_CLOSED (libcurl >= 7.73.0) + . CURLPX_GSSAPI (libcurl >= 7.73.0) + . CURLPX_GSSAPI_PERMSG (libcurl >= 7.73.0) + . CURLPX_GSSAPI_PROTECTION (libcurl >= 7.73.0) + . CURLPX_IDENTD_DIFFER (libcurl >= 7.73.0) + . CURLPX_IDENTD (libcurl >= 7.73.0) + . CURLPX_LONG_HOSTNAME (libcurl >= 7.73.0) + . CURLPX_LONG_PASSWD (libcurl >= 7.73.0) + . CURLPX_LONG_USER (libcurl >= 7.73.0) + . CURLPX_NO_AUTH (libcurl >= 7.73.0) + . CURLPX_OK (libcurl >= 7.73.0) + . CURLPX_RECV_ADDRESS (libcurl >= 7.73.0) + . CURLPX_RECV_AUTH (libcurl >= 7.73.0) + . CURLPX_RECV_CONNECT (libcurl >= 7.73.0) + . CURLPX_RECV_REQACK (libcurl >= 7.73.0) + . CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED (libcurl >= 7.73.0) + . CURLPX_REPLY_COMMAND_NOT_SUPPORTED (libcurl >= 7.73.0) + . CURLPX_REPLY_CONNECTION_REFUSED (libcurl >= 7.73.0) + . CURLPX_REPLY_GENERAL_SERVER_FAILURE (libcurl >= 7.73.0) + . CURLPX_REPLY_HOST_UNREACHABLE (libcurl >= 7.73.0) + . CURLPX_REPLY_NETWORK_UNREACHABLE (libcurl >= 7.73.0) + . CURLPX_REPLY_NOT_ALLOWED (libcurl >= 7.73.0) + . CURLPX_REPLY_TTL_EXPIRED (libcurl >= 7.73.0) + . CURLPX_REPLY_UNASSIGNED (libcurl >= 7.73.0) + . CURLPX_REQUEST_FAILED (libcurl >= 7.73.0) + . CURLPX_RESOLVE_HOST (libcurl >= 7.73.0) + . CURLPX_SEND_AUTH (libcurl >= 7.73.0) + . CURLPX_SEND_CONNECT (libcurl >= 7.73.0) + . CURLPX_SEND_REQUEST (libcurl >= 7.73.0) + . CURLPX_UNKNOWN_FAIL (libcurl >= 7.73.0) + . CURLPX_UNKNOWN_MODE (libcurl >= 7.73.0) + . CURLPX_USER_REJECTED (libcurl >= 7.73.0) + . CURLSSLOPT_AUTO_CLIENT_CERT (libcurl >= 7.77.0) + . CURLSSLOPT_NATIVE_CA (libcurl >= 7.71.0) + . CURLSSLOPT_NO_PARTIALCHAIN (libcurl >= 7.68.0) + . CURLSSLOPT_REVOKE_BEST_EFFORT (libcurl >= 7.70.0) + . CURL_VERSION_GSASL (libcurl >= 7.76.0) + . CURL_VERSION_HSTS (libcurl >= 7.74.0) + . CURL_VERSION_HTTP3 (libcurl >= 7.66.0) + . CURL_VERSION_UNICODE (libcurl >= 7.72.0) + . CURL_VERSION_ZSTD (libcurl >= 7.72.0) - Sockets: . SO_INCOMING_CPU diff --git a/ext/curl/interface.c b/ext/curl/interface.c index ff827aa697262..d3de062205daa 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -295,6 +295,22 @@ PHP_MINFO_FUNCTION(curl) #endif #if LIBCURL_VERSION_NUM >= 0x073900 /* 7.57.0 */ {"BROTLI", CURL_VERSION_BROTLI}, +#endif +#if LIBCURL_VERSION_NUM >= 0x074001 /* 7.64.1 */ + {"ALTSVC", CURL_VERSION_ALTSVC}, +#endif +#if LIBCURL_VERSION_NUM >= 0x074200 /* 7.66.0 */ + {"HTTP3", CURL_VERSION_HTTP3}, +#endif +#if LIBCURL_VERSION_NUM >= 0x074800 /* 7.72.0 */ + {"UNICODE", CURL_VERSION_UNICODE}, + {"ZSTD", CURL_VERSION_ZSTD}, +#endif +#if LIBCURL_VERSION_NUM >= 0x074a00 /* 7.74.0 */ + {"HSTS", CURL_VERSION_HSTS}, +#endif +#if LIBCURL_VERSION_NUM >= 0x074c00 /* 7.76.0 */ + {"GSASL", CURL_VERSION_GSASL}, #endif {NULL, 0} }; @@ -703,6 +719,7 @@ PHP_MINIT_FUNCTION(curl) REGISTER_CURL_CONSTANT(CURLOPT_LOCALPORTRANGE); /* Available since 7.15.3 */ + REGISTER_CURL_CONSTANT(CURLFTPMETHOD_DEFAULT); REGISTER_CURL_CONSTANT(CURLFTPMETHOD_MULTICWD); REGISTER_CURL_CONSTANT(CURLFTPMETHOD_NOCWD); REGISTER_CURL_CONSTANT(CURLFTPMETHOD_SINGLECWD); @@ -1151,6 +1168,8 @@ PHP_MINIT_FUNCTION(curl) #if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */ REGISTER_CURL_CONSTANT(CURLOPT_DOH_URL); + REGISTER_CURL_CONSTANT(CURLOPT_UPKEEP_INTERVAL_MS); + REGISTER_CURL_CONSTANT(CURLOPT_UPLOAD_BUFFERSIZE); #endif #if LIBCURL_VERSION_NUM >= 0x074000 /* Available since 7.64.0 */ @@ -1158,9 +1177,41 @@ PHP_MINIT_FUNCTION(curl) #endif #if LIBCURL_VERSION_NUM >= 0x074001 /* Available since 7.64.1 */ + REGISTER_CURL_CONSTANT(CURLALTSVC_H1); + REGISTER_CURL_CONSTANT(CURLALTSVC_H2); + REGISTER_CURL_CONSTANT(CURLALTSVC_H3); + REGISTER_CURL_CONSTANT(CURLALTSVC_READONLYFILE); + REGISTER_CURL_CONSTANT(CURLOPT_ALTSVC); + REGISTER_CURL_CONSTANT(CURLOPT_ALTSVC_CTRL); REGISTER_CURL_CONSTANT(CURL_VERSION_ALTSVC); #endif +#if LIBCURL_VERSION_NUM >= 0x074100 /* Available since 7.65.0 */ + REGISTER_CURL_CONSTANT(CURLOPT_MAXAGE_CONN); +#endif + +#if LIBCURL_VERSION_NUM >= 0x074200 /* Available since 7.66.0 */ + REGISTER_CURL_CONSTANT(CURLOPT_SASL_AUTHZID); + REGISTER_CURL_CONSTANT(CURL_VERSION_HTTP3); + REGISTER_CURL_CONSTANT(CURLINFO_RETRY_AFTER); +#endif + +#if LIBCURL_VERSION_NUM >= 0x074300 /* Available since 7.67.0 */ + REGISTER_CURL_CONSTANT(CURLMOPT_MAX_CONCURRENT_STREAMS); +#endif + +#if LIBCURL_VERSION_NUM >= 0x074400 /* Available since 7.68.0 */ + REGISTER_CURL_CONSTANT(CURLSSLOPT_NO_PARTIALCHAIN); +#endif + +#if LIBCURL_VERSION_NUM >= 0x074500 /* Available since 7.69.0 */ + REGISTER_CURL_CONSTANT(CURLOPT_MAIL_RCPT_ALLLOWFAILS); +#endif + +#if LIBCURL_VERSION_NUM >= 0x074600 /* Available since 7.70.0 */ + REGISTER_CURL_CONSTANT(CURLSSLOPT_REVOKE_BEST_EFFORT); +#endif + #if LIBCURL_VERSION_NUM >= 0x074700 /* Available since 7.71.0 */ REGISTER_CURL_CONSTANT(CURLOPT_ISSUERCERT_BLOB); REGISTER_CURL_CONSTANT(CURLOPT_PROXY_ISSUERCERT); @@ -1169,6 +1220,87 @@ PHP_MINIT_FUNCTION(curl) REGISTER_CURL_CONSTANT(CURLOPT_PROXY_SSLKEY_BLOB); REGISTER_CURL_CONSTANT(CURLOPT_SSLCERT_BLOB); REGISTER_CURL_CONSTANT(CURLOPT_SSLKEY_BLOB); + + REGISTER_CURL_CONSTANT(CURLPROTO_MQTT); + + REGISTER_CURL_CONSTANT(CURLSSLOPT_NATIVE_CA); +#endif + +#if LIBCURL_VERSION_NUM >= 0x074800 /* Available since 7.72.0 */ + REGISTER_CURL_CONSTANT(CURL_VERSION_UNICODE); + REGISTER_CURL_CONSTANT(CURL_VERSION_ZSTD); +#endif + +#if LIBCURL_VERSION_NUM >= 0x074900 /* Available since 7.73.0 */ + REGISTER_CURL_CONSTANT(CURLE_PROXY); + REGISTER_CURL_CONSTANT(CURLINFO_PROXY_ERROR); + REGISTER_CURL_CONSTANT(CURLOPT_SSL_EC_CURVES); + REGISTER_CURL_CONSTANT(CURLPX_BAD_ADDRESS_TYPE); + REGISTER_CURL_CONSTANT(CURLPX_BAD_VERSION); + REGISTER_CURL_CONSTANT(CURLPX_CLOSED); + REGISTER_CURL_CONSTANT(CURLPX_GSSAPI); + REGISTER_CURL_CONSTANT(CURLPX_GSSAPI_PERMSG); + REGISTER_CURL_CONSTANT(CURLPX_GSSAPI_PROTECTION); + REGISTER_CURL_CONSTANT(CURLPX_IDENTD); + REGISTER_CURL_CONSTANT(CURLPX_IDENTD_DIFFER); + REGISTER_CURL_CONSTANT(CURLPX_LONG_HOSTNAME); + REGISTER_CURL_CONSTANT(CURLPX_LONG_PASSWD); + REGISTER_CURL_CONSTANT(CURLPX_LONG_USER); + REGISTER_CURL_CONSTANT(CURLPX_NO_AUTH); + REGISTER_CURL_CONSTANT(CURLPX_OK); + REGISTER_CURL_CONSTANT(CURLPX_RECV_ADDRESS); + REGISTER_CURL_CONSTANT(CURLPX_RECV_AUTH); + REGISTER_CURL_CONSTANT(CURLPX_RECV_CONNECT); + REGISTER_CURL_CONSTANT(CURLPX_RECV_REQACK); + REGISTER_CURL_CONSTANT(CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED); + REGISTER_CURL_CONSTANT(CURLPX_REPLY_COMMAND_NOT_SUPPORTED); + REGISTER_CURL_CONSTANT(CURLPX_REPLY_CONNECTION_REFUSED); + REGISTER_CURL_CONSTANT(CURLPX_REPLY_GENERAL_SERVER_FAILURE); + REGISTER_CURL_CONSTANT(CURLPX_REPLY_HOST_UNREACHABLE); + REGISTER_CURL_CONSTANT(CURLPX_REPLY_NETWORK_UNREACHABLE); + REGISTER_CURL_CONSTANT(CURLPX_REPLY_NOT_ALLOWED); + REGISTER_CURL_CONSTANT(CURLPX_REPLY_TTL_EXPIRED); + REGISTER_CURL_CONSTANT(CURLPX_REPLY_UNASSIGNED); + REGISTER_CURL_CONSTANT(CURLPX_REQUEST_FAILED); + REGISTER_CURL_CONSTANT(CURLPX_RESOLVE_HOST); + REGISTER_CURL_CONSTANT(CURLPX_SEND_AUTH); + REGISTER_CURL_CONSTANT(CURLPX_SEND_CONNECT); + REGISTER_CURL_CONSTANT(CURLPX_SEND_REQUEST); + REGISTER_CURL_CONSTANT(CURLPX_UNKNOWN_FAIL); + REGISTER_CURL_CONSTANT(CURLPX_UNKNOWN_MODE); + REGISTER_CURL_CONSTANT(CURLPX_USER_REJECTED); +#endif + +#if LIBCURL_VERSION_NUM >= 0x074a00 /* Available since 7.74.0 */ + REGISTER_CURL_CONSTANT(CURLHSTS_ENABLE); + REGISTER_CURL_CONSTANT(CURLHSTS_READONLYFILE); + REGISTER_CURL_CONSTANT(CURLOPT_HSTS); + REGISTER_CURL_CONSTANT(CURLOPT_HSTS_CTRL); + REGISTER_CURL_CONSTANT(CURL_VERSION_HSTS); +#endif + +#if LIBCURL_VERSION_NUM >= 0x074b00 /* Available since 7.75.0 */ + REGISTER_CURL_CONSTANT(CURLAUTH_AWS_SIGV4); + REGISTER_CURL_CONSTANT(CURLOPT_AWS_SIGV4); +#endif + +#if LIBCURL_VERSION_NUM >= 0x074c00 /* Available since 7.76.0 */ + REGISTER_CURL_CONSTANT(CURLINFO_REFERER); + REGISTER_CURL_CONSTANT(CURLOPT_DOH_SSL_VERIFYHOST); + REGISTER_CURL_CONSTANT(CURLOPT_DOH_SSL_VERIFYPEER); + REGISTER_CURL_CONSTANT(CURLOPT_DOH_SSL_VERIFYSTATUS); + REGISTER_CURL_CONSTANT(CURL_VERSION_GSASL); +#endif + +#if LIBCURL_VERSION_NUM >= 0x074d00 /* Available since 7.77.0 */ + REGISTER_CURL_CONSTANT(CURLOPT_CAINFO_BLOB); + REGISTER_CURL_CONSTANT(CURLOPT_PROXY_CAINFO_BLOB); + REGISTER_CURL_CONSTANT(CURLSSLOPT_AUTO_CLIENT_CERT); +#endif + +#if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */ + REGISTER_CURL_CONSTANT(CURLOPT_MAXLIFETIME_CONN); + REGISTER_CURL_CONSTANT(CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256); #endif REGISTER_CURL_CONSTANT(CURLOPT_SAFE_UPLOAD); @@ -2545,8 +2677,32 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue #if LIBCURL_VERSION_NUM >= 0x073d00 /* Available since 7.61.0 */ case CURLOPT_DISALLOW_USERNAME_IN_URL: #endif +#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */ + case CURLOPT_UPKEEP_INTERVAL_MS: + case CURLOPT_UPLOAD_BUFFERSIZE: +#endif #if LIBCURL_VERSION_NUM >= 0x074000 /* Available since 7.64.0 */ case CURLOPT_HTTP09_ALLOWED: +#endif +#if LIBCURL_VERSION_NUM >= 0x074001 /* Available since 7.64.1 */ + case CURLOPT_ALTSVC_CTRL: +#endif +#if LIBCURL_VERSION_NUM >= 0x074100 /* Available since 7.65.0 */ + case CURLOPT_MAXAGE_CONN: +#endif +#if LIBCURL_VERSION_NUM >= 0x074500 /* Available since 7.69.0 */ + case CURLOPT_MAIL_RCPT_ALLLOWFAILS: +#endif +#if LIBCURL_VERSION_NUM >= 0x074a00 /* Available since 7.74.0 */ + case CURLOPT_HSTS_CTRL: +#endif +#if LIBCURL_VERSION_NUM >= 0x074c00 /* Available since 7.76.0 */ + case CURLOPT_DOH_SSL_VERIFYHOST: + case CURLOPT_DOH_SSL_VERIFYPEER: + case CURLOPT_DOH_SSL_VERIFYSTATUS: +#endif +#if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */ + case CURLOPT_MAXLIFETIME_CONN: #endif lval = zval_get_long(zvalue); if ((option == CURLOPT_PROTOCOLS || option == CURLOPT_REDIR_PROTOCOLS) && @@ -2644,8 +2800,23 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue case CURLOPT_PROXY_TLS13_CIPHERS: case CURLOPT_TLS13_CIPHERS: #endif +#if LIBCURL_VERSION_NUM >= 0x074001 /* Available since 7.64.1 */ + case CURLOPT_ALTSVC: +#endif +#if LIBCURL_VERSION_NUM >= 0x074200 /* Available since 7.66.0 */ + case CURLOPT_SASL_AUTHZID: +#endif #if LIBCURL_VERSION_NUM >= 0x074700 /* Available since 7.71.0 */ case CURLOPT_PROXY_ISSUERCERT: +#endif +#if LIBCURL_VERSION_NUM >= 0x074900 /* Available since 7.73.0 */ + case CURLOPT_SSL_EC_CURVES: +#endif +#if LIBCURL_VERSION_NUM >= 0x074b00 /* Available since 7.75.0 */ + case CURLOPT_AWS_SIGV4: +#endif +#if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */ + case CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256: #endif { zend_string *tmp_str; @@ -2672,6 +2843,9 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue #endif #if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */ case CURLOPT_DOH_URL: +#endif +#if LIBCURL_VERSION_NUM >= 0x074a00 /* Available since 7.74.0 */ + case CURLOPT_HSTS: #endif case CURLOPT_KRBLEVEL: { @@ -3072,6 +3246,10 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue case CURLOPT_PROXY_SSLKEY_BLOB: case CURLOPT_SSLCERT_BLOB: case CURLOPT_SSLKEY_BLOB: +#if LIBCURL_VERSION_NUM >= 0x074d00 /* Available since 7.77.0 */ + case CURLOPT_CAINFO_BLOB: + case CURLOPT_PROXY_CAINFO_BLOB: +#endif { zend_string *tmp_str; zend_string *str = zval_get_tmp_string(zvalue, &tmp_str); diff --git a/ext/curl/multi.c b/ext/curl/multi.c index 7ac2aa40ce545..fb8f08ccdbaa4 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -441,6 +441,9 @@ static bool _php_curl_multi_setopt(php_curlm *mh, zend_long option, zval *zvalue case CURLMOPT_MAX_HOST_CONNECTIONS: case CURLMOPT_MAX_PIPELINE_LENGTH: case CURLMOPT_MAX_TOTAL_CONNECTIONS: +#endif +#if LIBCURL_VERSION_NUM >= 0x074300 /* Available since 7.67.0 */ + case CURLMOPT_MAX_CONCURRENT_STREAMS: #endif { zend_long lval = zval_get_long(zvalue); From b9af4335e333cbb7553dcd26be9b682e02b4534b Mon Sep 17 00:00:00 2001 From: Pierrick Charron Date: Wed, 8 Jun 2022 01:32:32 -0400 Subject: [PATCH 2/2] Add new curl_upkeep() function --- NEWS | 1 + UPGRADING | 4 ++++ ext/curl/curl.stub.php | 4 ++++ ext/curl/curl_arginfo.h | 14 +++++++++++++- ext/curl/interface.c | 22 ++++++++++++++++++++++ ext/curl/tests/curl_upkeep_001.phpt | 27 +++++++++++++++++++++++++++ 6 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 ext/curl/tests/curl_upkeep_001.phpt diff --git a/NEWS b/NEWS index 00685a58293d5..38465be6766b1 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ PHP NEWS - Curl: . Added new constants from cURL 7.62 to 7.80. (Pierrick) + . New function curl_upkeep(). (Pierrick) - MBString: . Backwards-compatible mappings for 0x5C/0x7E in Shift-JIS are restored, diff --git a/UPGRADING b/UPGRADING index 5ef8b778936ec..e28498efe9a80 100644 --- a/UPGRADING +++ b/UPGRADING @@ -77,6 +77,7 @@ PHP 8.2 UPGRADE NOTES . Added CURLINFO_EFFECTIVE_METHOD option and returning the effective HTTP method in curl_getinfo() return value. . Exposed multiple new constants from libcurl 7.62 to 7.80. + . Added new function curl_upkeep() to perform any connection upkeep checks. - OCI8: . Added an oci8.prefetch_lob_size directive and oci_set_prefetch_lob() @@ -174,6 +175,9 @@ PHP 8.2 UPGRADE NOTES 6. New Functions ======================================== +- Curl: + . curl_upkeep() (libcurl >= 7.62.0) + - Reflection: . ReflectionFunction::isAnonymous() . ReflectionMethod::hasPrototype() diff --git a/ext/curl/curl.stub.php b/ext/curl/curl.stub.php index a474effba5295..58c5a959b25f6 100644 --- a/ext/curl/curl.stub.php +++ b/ext/curl/curl.stub.php @@ -54,6 +54,10 @@ function curl_getinfo(CurlHandle $handle, ?int $option = null): mixed {} /** @refcount 1 */ function curl_init(?string $url = null): CurlHandle|false {} +#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */ +function curl_upkeep(CurlHandle $handle): bool {} +#endif + function curl_multi_add_handle(CurlMultiHandle $multi_handle, CurlHandle $handle): int {} function curl_multi_close(CurlMultiHandle $multi_handle): void {} diff --git a/ext/curl/curl_arginfo.h b/ext/curl/curl_arginfo.h index 614954788caab..b8b0b4013ef95 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: 3abf3f6d5dfb14d2e22ebf5730a869e2c17c7958 */ + * Stub hash: 1bd8a84a4aa80912463ea76d08f64d3c2cf4c0db */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_close, 0, 1, IS_VOID, 0) ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0) @@ -49,6 +49,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_curl_init, 0, 0, CurlHandle, ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, url, IS_STRING, 1, "null") ZEND_END_ARG_INFO() +#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */ +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_upkeep, 0, 1, _IS_BOOL, 0) + ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0) +ZEND_END_ARG_INFO() +#endif + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_add_handle, 0, 2, IS_LONG, 0) ZEND_ARG_OBJ_INFO(0, multi_handle, CurlMultiHandle, 0) ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0) @@ -144,6 +150,9 @@ ZEND_FUNCTION(curl_exec); ZEND_FUNCTION(curl_file_create); ZEND_FUNCTION(curl_getinfo); ZEND_FUNCTION(curl_init); +#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */ +ZEND_FUNCTION(curl_upkeep); +#endif ZEND_FUNCTION(curl_multi_add_handle); ZEND_FUNCTION(curl_multi_close); ZEND_FUNCTION(curl_multi_errno); @@ -179,6 +188,9 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(curl_file_create, arginfo_curl_file_create) ZEND_FE(curl_getinfo, arginfo_curl_getinfo) ZEND_FE(curl_init, arginfo_curl_init) +#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */ + ZEND_FE(curl_upkeep, arginfo_curl_upkeep) +#endif ZEND_FE(curl_multi_add_handle, arginfo_curl_multi_add_handle) ZEND_FE(curl_multi_close, arginfo_curl_multi_close) ZEND_FE(curl_multi_errno, arginfo_curl_multi_errno) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index d3de062205daa..6f556dddae286 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -3989,3 +3989,25 @@ PHP_FUNCTION(curl_pause) RETURN_LONG(curl_easy_pause(ch->cp, bitmask)); } /* }}} */ + +#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */ +/* {{{ perform connection upkeep checks */ +PHP_FUNCTION(curl_upkeep) +{ + CURLcode error; + zval *zid; + php_curl *ch; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_OBJECT_OF_CLASS(zid, curl_ce) + ZEND_PARSE_PARAMETERS_END(); + + ch = Z_CURL_P(zid); + + error = curl_easy_upkeep(ch->cp); + SAVE_CURL_ERROR(ch, error); + + RETURN_BOOL(error == CURLE_OK); +} +/*}}} */ +#endif diff --git a/ext/curl/tests/curl_upkeep_001.phpt b/ext/curl/tests/curl_upkeep_001.phpt new file mode 100644 index 0000000000000..8695c3a63aab8 --- /dev/null +++ b/ext/curl/tests/curl_upkeep_001.phpt @@ -0,0 +1,27 @@ +--TEST-- +curl_upkeep() function +--EXTENSIONS-- +curl +--SKIPIF-- += 7.62.0'); +?> +--FILE-- + +--EXPECT-- +bool(true)