Skip to content

Commit 30bdbca

Browse files
committed
WIP curl_url functions
1 parent c1d0779 commit 30bdbca

13 files changed

+550
-2
lines changed

ext/curl/config.m4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ int main(int argc, char *argv[])
8181
$CURL_LIBS
8282
])
8383

84-
PHP_NEW_EXTENSION(curl, interface.c multi.c share.c curl_file.c, $ext_shared)
84+
PHP_NEW_EXTENSION(curl, interface.c multi.c share.c curl_file.c url.c, $ext_shared)
8585
PHP_INSTALL_HEADERS([ext/curl], [php_curl.h])
8686
PHP_SUBST(CURL_SHARED_LIBADD)
8787
fi

ext/curl/curl.stub.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,16 @@ final class CurlShareHandle
2626
{
2727
}
2828

29+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
30+
/**
31+
* @strict-properties
32+
* @not-serializable
33+
*/
34+
final class CurlUrl
35+
{
36+
}
37+
#endif
38+
2939
function curl_close(CurlHandle $handle): void {}
3040

3141
/** @refcount 1 */
@@ -109,6 +119,20 @@ function curl_share_strerror(int $error_code): ?string {}
109119
/** @refcount 1 */
110120
function curl_strerror(int $error_code): ?string {}
111121

122+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
123+
function curl_url(?string $url = null): CurlUrl|false {}
124+
125+
function curl_url_set(CurlUrl $url, int $part, string $content, int $flags = 0): bool {}
126+
127+
function curl_url_get(CurlUrl $url, int $part, int $flags = 0): string|false {}
128+
129+
function curl_url_errno(CurlUrl $url): int {}
130+
#endif
131+
132+
#if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
133+
function curl_url_strerror(int $error_code): ?string {}
134+
#endif
135+
112136
/**
113137
* @return array<string, int|string|array>|false
114138
* @refcount 1

ext/curl/curl_arginfo.h

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 1bd8a84a4aa80912463ea76d08f64d3c2cf4c0db */
2+
* Stub hash: 60734f7cecbc1ebd6351a6775e427259a0a1b521 */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_close, 0, 1, IS_VOID, 0)
55
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
@@ -135,6 +135,41 @@ ZEND_END_ARG_INFO()
135135

136136
#define arginfo_curl_strerror arginfo_curl_multi_strerror
137137

138+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
139+
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_curl_url, 0, 0, CurlUrl, MAY_BE_FALSE)
140+
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, url, IS_STRING, 1, "null")
141+
ZEND_END_ARG_INFO()
142+
#endif
143+
144+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
145+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_url_set, 0, 3, _IS_BOOL, 0)
146+
ZEND_ARG_OBJ_INFO(0, url, CurlUrl, 0)
147+
ZEND_ARG_TYPE_INFO(0, part, IS_LONG, 0)
148+
ZEND_ARG_TYPE_INFO(0, content, IS_STRING, 0)
149+
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
150+
ZEND_END_ARG_INFO()
151+
#endif
152+
153+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
154+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_curl_url_get, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
155+
ZEND_ARG_OBJ_INFO(0, url, CurlUrl, 0)
156+
ZEND_ARG_TYPE_INFO(0, part, IS_LONG, 0)
157+
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
158+
ZEND_END_ARG_INFO()
159+
#endif
160+
161+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
162+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_url_errno, 0, 1, IS_LONG, 0)
163+
ZEND_ARG_OBJ_INFO(0, url, CurlUrl, 0)
164+
ZEND_END_ARG_INFO()
165+
#endif
166+
167+
#if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
168+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_url_strerror, 0, 1, IS_STRING, 1)
169+
ZEND_ARG_TYPE_INFO(0, error_code, IS_LONG, 0)
170+
ZEND_END_ARG_INFO()
171+
#endif
172+
138173
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_curl_version, 0, 0, MAY_BE_ARRAY|MAY_BE_FALSE)
139174
ZEND_END_ARG_INFO()
140175

@@ -173,6 +208,21 @@ ZEND_FUNCTION(curl_share_init);
173208
ZEND_FUNCTION(curl_share_setopt);
174209
ZEND_FUNCTION(curl_share_strerror);
175210
ZEND_FUNCTION(curl_strerror);
211+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
212+
ZEND_FUNCTION(curl_url);
213+
#endif
214+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
215+
ZEND_FUNCTION(curl_url_set);
216+
#endif
217+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
218+
ZEND_FUNCTION(curl_url_get);
219+
#endif
220+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
221+
ZEND_FUNCTION(curl_url_errno);
222+
#endif
223+
#if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
224+
ZEND_FUNCTION(curl_url_strerror);
225+
#endif
176226
ZEND_FUNCTION(curl_version);
177227

178228

@@ -211,6 +261,21 @@ static const zend_function_entry ext_functions[] = {
211261
ZEND_FE(curl_share_setopt, arginfo_curl_share_setopt)
212262
ZEND_FE(curl_share_strerror, arginfo_curl_share_strerror)
213263
ZEND_FE(curl_strerror, arginfo_curl_strerror)
264+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
265+
ZEND_FE(curl_url, arginfo_curl_url)
266+
#endif
267+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
268+
ZEND_FE(curl_url_set, arginfo_curl_url_set)
269+
#endif
270+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
271+
ZEND_FE(curl_url_get, arginfo_curl_url_get)
272+
#endif
273+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
274+
ZEND_FE(curl_url_errno, arginfo_curl_url_errno)
275+
#endif
276+
#if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
277+
ZEND_FE(curl_url_strerror, arginfo_curl_url_strerror)
278+
#endif
214279
ZEND_FE(curl_version, arginfo_curl_version)
215280
ZEND_FE_END
216281
};
@@ -230,6 +295,13 @@ static const zend_function_entry class_CurlShareHandle_methods[] = {
230295
ZEND_FE_END
231296
};
232297

298+
299+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
300+
static const zend_function_entry class_CurlUrl_methods[] = {
301+
ZEND_FE_END
302+
};
303+
#endif
304+
233305
static zend_class_entry *register_class_CurlHandle(void)
234306
{
235307
zend_class_entry ce, *class_entry;
@@ -262,3 +334,16 @@ static zend_class_entry *register_class_CurlShareHandle(void)
262334

263335
return class_entry;
264336
}
337+
338+
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
339+
static zend_class_entry *register_class_CurlUrl(void)
340+
{
341+
zend_class_entry ce, *class_entry;
342+
343+
INIT_CLASS_ENTRY(ce, "CurlUrl", class_CurlUrl_methods);
344+
class_entry = zend_register_internal_class_ex(&ce, NULL);
345+
class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES|ZEND_ACC_NOT_SERIALIZABLE;
346+
347+
return class_entry;
348+
}
349+
#endif

ext/curl/curl_private.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ typedef struct {
110110
zval private_data;
111111
/* CurlShareHandle object set using CURLOPT_SHARE. */
112112
struct _php_curlsh *share;
113+
#if LIBCURL_VERSION_NUM >= 0x073f00 /* 7.63.0 */
114+
struct _php_curlurl *url;
115+
#endif
113116
zend_object std;
114117
} php_curl;
115118

@@ -137,6 +140,16 @@ typedef struct _php_curlsh {
137140
zend_object std;
138141
} php_curlsh;
139142

143+
#if LIBCURL_VERSION_NUM >= 0x073e00 /* 7.62.0 */
144+
typedef struct _php_curlurl {
145+
CURLU *url;
146+
struct {
147+
int no;
148+
} err;
149+
zend_object std;
150+
} php_curlurl;
151+
#endif
152+
140153
php_curl *init_curl_handle_into_zval(zval *curl);
141154
void init_curl_handle(php_curl *ch);
142155
void _php_curl_cleanup_handle(php_curl *);
@@ -156,8 +169,19 @@ static inline php_curlsh *curl_share_from_obj(zend_object *obj) {
156169

157170
#define Z_CURL_SHARE_P(zv) curl_share_from_obj(Z_OBJ_P(zv))
158171

172+
#if LIBCURL_VERSION_NUM >= 0x073e00 /* 7.62.0 */
173+
static inline php_curlurl *curl_url_from_obj(zend_object *obj) {
174+
return (php_curlurl *)((char *)(obj) - XtOffsetOf(php_curlurl, std));
175+
}
176+
177+
#define Z_CURL_URL_P(zv) curl_url_from_obj(Z_OBJ_P(zv))
178+
#endif
179+
159180
void curl_multi_register_handlers(void);
160181
void curl_share_register_handlers(void);
182+
#if LIBCURL_VERSION_NUM >= 0x073e00 /* 7.62.0 */
183+
void curl_url_register_handlers(void);
184+
#endif
161185
void curlfile_register_class(void);
162186
int curl_cast_object(zend_object *obj, zval *result, int type);
163187

ext/curl/interface.c

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,6 +1170,51 @@ PHP_MINIT_FUNCTION(curl)
11701170
REGISTER_CURL_CONSTANT(CURLOPT_DOH_URL);
11711171
REGISTER_CURL_CONSTANT(CURLOPT_UPKEEP_INTERVAL_MS);
11721172
REGISTER_CURL_CONSTANT(CURLOPT_UPLOAD_BUFFERSIZE);
1173+
1174+
REGISTER_CURL_CONSTANT(CURLUPART_FRAGMENT);
1175+
REGISTER_CURL_CONSTANT(CURLUPART_HOST);
1176+
REGISTER_CURL_CONSTANT(CURLUPART_OPTIONS);
1177+
REGISTER_CURL_CONSTANT(CURLUPART_PASSWORD);
1178+
REGISTER_CURL_CONSTANT(CURLUPART_PATH);
1179+
REGISTER_CURL_CONSTANT(CURLUPART_PORT);
1180+
REGISTER_CURL_CONSTANT(CURLUPART_QUERY);
1181+
REGISTER_CURL_CONSTANT(CURLUPART_SCHEME);
1182+
REGISTER_CURL_CONSTANT(CURLUPART_URL);
1183+
REGISTER_CURL_CONSTANT(CURLUPART_USER);
1184+
1185+
REGISTER_CURL_CONSTANT(CURLU_APPENDQUERY);
1186+
REGISTER_CURL_CONSTANT(CURLU_DEFAULT_PORT);
1187+
REGISTER_CURL_CONSTANT(CURLU_DEFAULT_SCHEME);
1188+
REGISTER_CURL_CONSTANT(CURLU_DISALLOW_USER);
1189+
REGISTER_CURL_CONSTANT(CURLU_GUESS_SCHEME);
1190+
REGISTER_CURL_CONSTANT(CURLU_NO_DEFAULT_PORT);
1191+
REGISTER_CURL_CONSTANT(CURLU_NON_SUPPORT_SCHEME);
1192+
REGISTER_CURL_CONSTANT(CURLU_PATH_AS_IS);
1193+
REGISTER_CURL_CONSTANT(CURLU_URLDECODE);
1194+
REGISTER_CURL_CONSTANT(CURLU_URLENCODE);
1195+
1196+
REGISTER_CURL_CONSTANT(CURLUE_BAD_HANDLE);
1197+
REGISTER_CURL_CONSTANT(CURLUE_BAD_PARTPOINTER);
1198+
REGISTER_CURL_CONSTANT(CURLUE_BAD_PORT_NUMBER);
1199+
REGISTER_CURL_CONSTANT(CURLUE_MALFORMED_INPUT);
1200+
REGISTER_CURL_CONSTANT(CURLUE_NO_FRAGMENT);
1201+
REGISTER_CURL_CONSTANT(CURLUE_NO_HOST);
1202+
REGISTER_CURL_CONSTANT(CURLUE_NO_OPTIONS);
1203+
REGISTER_CURL_CONSTANT(CURLUE_NO_PASSWORD);
1204+
REGISTER_CURL_CONSTANT(CURLUE_NO_PORT);
1205+
REGISTER_CURL_CONSTANT(CURLUE_NO_QUERY);
1206+
REGISTER_CURL_CONSTANT(CURLUE_NO_SCHEME);
1207+
REGISTER_CURL_CONSTANT(CURLUE_NO_USER);
1208+
REGISTER_CURL_CONSTANT(CURLUE_OK);
1209+
REGISTER_CURL_CONSTANT(CURLUE_OUT_OF_MEMORY);
1210+
REGISTER_CURL_CONSTANT(CURLUE_UNKNOWN_PART);
1211+
REGISTER_CURL_CONSTANT(CURLUE_UNSUPPORTED_SCHEME);
1212+
REGISTER_CURL_CONSTANT(CURLUE_URLDECODE);
1213+
REGISTER_CURL_CONSTANT(CURLUE_USER_NOT_ALLOWED);
1214+
#endif
1215+
1216+
#if LIBCURL_VERSION_NUM >= 0x073f00 /* Available since 7.63.0 */
1217+
REGISTER_CURL_CONSTANT(CURLOPT_CURLU);
11731218
#endif
11741219

11751220
#if LIBCURL_VERSION_NUM >= 0x074000 /* Available since 7.64.0 */
@@ -1188,6 +1233,8 @@ PHP_MINIT_FUNCTION(curl)
11881233

11891234
#if LIBCURL_VERSION_NUM >= 0x074100 /* Available since 7.65.0 */
11901235
REGISTER_CURL_CONSTANT(CURLOPT_MAXAGE_CONN);
1236+
1237+
REGISTER_CURL_CONSTANT(CURLUPART_ZONEID);
11911238
#endif
11921239

11931240
#if LIBCURL_VERSION_NUM >= 0x074200 /* Available since 7.66.0 */
@@ -1198,6 +1245,7 @@ PHP_MINIT_FUNCTION(curl)
11981245

11991246
#if LIBCURL_VERSION_NUM >= 0x074300 /* Available since 7.67.0 */
12001247
REGISTER_CURL_CONSTANT(CURLMOPT_MAX_CONCURRENT_STREAMS);
1248+
REGISTER_CURL_CONSTANT(CURLU_NO_AUTHORITY);
12011249
#endif
12021250

12031251
#if LIBCURL_VERSION_NUM >= 0x074400 /* Available since 7.68.0 */
@@ -1263,11 +1311,30 @@ PHP_MINIT_FUNCTION(curl)
12631311
REGISTER_CURL_CONSTANT(CURLSSLOPT_AUTO_CLIENT_CERT);
12641312
#endif
12651313

1314+
#if LIBCURL_VERSION_NUM >= 0x074e00 /* Available since 7.78.0 */
1315+
REGISTER_CURL_CONSTANT(CURLU_ALLOW_SPACE);
1316+
#endif
1317+
12661318
#if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
12671319
REGISTER_CURL_CONSTANT(CURLOPT_MAXLIFETIME_CONN);
12681320
REGISTER_CURL_CONSTANT(CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256);
12691321
#endif
12701322

1323+
#if LIBCURL_VERSION_NUM >= 0x075100 /* Available since 7.81.0 */
1324+
REGISTER_CURL_CONSTANT(CURLUE_BAD_FILE_URL);
1325+
REGISTER_CURL_CONSTANT(CURLUE_BAD_FRAGMENT);
1326+
REGISTER_CURL_CONSTANT(CURLUE_BAD_HOSTNAME);
1327+
REGISTER_CURL_CONSTANT(CURLUE_BAD_IPV6);
1328+
REGISTER_CURL_CONSTANT(CURLUE_BAD_LOGIN);
1329+
REGISTER_CURL_CONSTANT(CURLUE_BAD_PASSWORD);
1330+
REGISTER_CURL_CONSTANT(CURLUE_BAD_PATH);
1331+
REGISTER_CURL_CONSTANT(CURLUE_BAD_QUERY);
1332+
REGISTER_CURL_CONSTANT(CURLUE_BAD_SCHEME);
1333+
REGISTER_CURL_CONSTANT(CURLUE_BAD_SLASHES);
1334+
REGISTER_CURL_CONSTANT(CURLUE_BAD_USER);
1335+
REGISTER_CURL_CONSTANT(CURLUE_NO_ZONEID);
1336+
#endif
1337+
12711338
REGISTER_CURL_CONSTANT(CURLOPT_SAFE_UPLOAD);
12721339

12731340
#ifdef PHP_CURL_NEED_OPENSSL_TSL
@@ -1309,6 +1376,12 @@ PHP_MINIT_FUNCTION(curl)
13091376

13101377
curl_share_ce = register_class_CurlShareHandle();
13111378
curl_share_register_handlers();
1379+
1380+
#if LIBCURL_VERSION_NUM >= 0x073e00 /* 7.62.0 */
1381+
curl_url_ce = register_class_CurlUrl();
1382+
curl_url_register_handlers();
1383+
#endif
1384+
13121385
curlfile_register_class();
13131386

13141387
return SUCCESS;
@@ -1361,6 +1434,13 @@ static zend_object *curl_clone_obj(zend_object *object) {
13611434
}
13621435
}
13631436

1437+
#if LIBCURL_VERSION_NUM >= 0x073f00 /* 7.63.0 */
1438+
if (ch->url) {
1439+
clone_ch->url = ch->url;
1440+
GC_ADDREF(&ch->url->std);
1441+
}
1442+
#endif
1443+
13641444
return &clone_ch->std;
13651445
}
13661446

@@ -3230,6 +3310,22 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
32303310
break;
32313311
#endif
32323312

3313+
/* CurlUrl object */
3314+
#if LIBCURL_VERSION_NUM >= 0x073f00 /* Available since 7.63.0 */
3315+
case CURLOPT_CURLU:
3316+
if (Z_TYPE_P(zvalue) == IS_OBJECT && Z_OBJCE_P(zvalue) == curl_url_ce) {
3317+
php_curlurl *uh = Z_CURL_URL_P(zvalue);
3318+
curl_easy_setopt(ch->cp, CURLOPT_CURLU, uh->url);
3319+
3320+
if (ch->url) {
3321+
OBJ_RELEASE(&ch->url->std);
3322+
}
3323+
GC_ADDREF(&uh->std);
3324+
ch->url = uh;
3325+
}
3326+
break;
3327+
#endif
3328+
32333329
default:
32343330
if (is_array_config) {
32353331
zend_argument_value_error(2, "must contain only valid cURL options");
@@ -3780,6 +3876,11 @@ static void curl_free_obj(zend_object *object)
37803876
if (ch->share) {
37813877
OBJ_RELEASE(&ch->share->std);
37823878
}
3879+
#if LIBCURL_VERSION_NUM >= 0x073f00 /* 7.63.0 */
3880+
if (ch->url) {
3881+
OBJ_RELEASE(&ch->url->std);
3882+
}
3883+
#endif
37833884

37843885
zend_object_std_dtor(&ch->std);
37853886
}

ext/curl/php_curl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ extern zend_module_entry curl_module_entry;
3838
PHP_CURL_API extern zend_class_entry *curl_ce;
3939
PHP_CURL_API extern zend_class_entry *curl_share_ce;
4040
PHP_CURL_API extern zend_class_entry *curl_multi_ce;
41+
PHP_CURL_API extern zend_class_entry *curl_url_ce;
4142
PHP_CURL_API extern zend_class_entry *curl_CURLFile_class;
4243
PHP_CURL_API extern zend_class_entry *curl_CURLStringFile_class;
4344

0 commit comments

Comments
 (0)