Skip to content

Commit b516566

Browse files
kocsismatenikic
andcommitted
Convert CURL resources to objects
Closes GH-5402 Co-authored-by: Nikita Popov <nikita.ppv@gmail.com>
1 parent 1e095e3 commit b516566

20 files changed

+619
-471
lines changed

UPGRADING

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,21 @@ PHP 8.0 UPGRADE NOTES
739739

740740
- CURL:
741741
. The CURL extension now requires at least libcurl 7.29.0.
742+
. curl_init() will now return a CurlHandle object rather than a resource.
743+
Return value checks using is_resource() should be replaced with
744+
checks for `false`. The curl_close() function no longer has an effect,
745+
instead the CurlHandle instance is automatically destroyed if it is no
746+
longer referenced.
747+
. curl_multi_init() will now return a CurlMultiHandle object rather than a
748+
resource. Return value checks using is_resource() should be replaced with
749+
checks for `false`. The curl_multi_close() function no longer has an effect,
750+
instead the CurlMultiHandle instance is automatically destroyed if it is no
751+
longer referenced.
752+
. curl_share_init() will now return a CurlShareHandle object rather than a
753+
resource. Return value checks using is_resource() should be replaced with
754+
checks for `false`. The curl_share_close() function no longer has an effect,
755+
instead the CurlShareHandle instance is automatically destroyed if it is no
756+
longer referenced.
742757

743758
- Enchant:
744759
. The enchant extension now uses libenchant-2 by default when available.

ext/curl/curl.stub.php

Lines changed: 42 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -2,120 +2,82 @@
22

33
/** @generate-function-entries */
44

5-
/** @param resource $handle */
6-
function curl_close($handle): void {}
5+
final class CurlHandle
6+
{
7+
}
78

8-
/**
9-
* @param resource $handle
10-
* @return resource|false
11-
*/
12-
function curl_copy_handle($handle) {}
9+
final class CurlMultiHandle
10+
{
11+
}
1312

14-
/** @param resource $handle */
15-
function curl_errno($handle): int {}
13+
final class CurlShareHandle
14+
{
15+
}
1616

17-
/** @param resource $handle */
18-
function curl_error($handle): string {}
17+
function curl_close(CurlHandle $handle): void {}
18+
19+
function curl_copy_handle(CurlHandle $handle): CurlHandle|false {}
20+
21+
function curl_errno(CurlHandle $handle): int {}
22+
23+
function curl_error(CurlHandle $handle): string {}
1924

2025
#if LIBCURL_VERSION_NUM >= 0x070f04 /* 7.15.4 */
21-
/** @param resource $handle */
22-
function curl_escape($handle, string $string): string|false {}
26+
function curl_escape(CurlHandle $handle, string $string): string|false {}
2327

24-
/** @param resource $handle */
25-
function curl_unescape($handle, string $string): string|false {}
28+
function curl_unescape(CurlHandle $handle, string $string): string|false {}
2629

27-
/**
28-
* @param resource $multi_handle
29-
* @param mixed $value
30-
*/
31-
function curl_multi_setopt($multi_handle, int $option, $value): bool {}
30+
function curl_multi_setopt(CurlMultiHandle $multi_handle, int $option, mixed $value): bool {}
3231

3332
#endif
3433

35-
/** @param resource $handle */
36-
function curl_exec($handle): string|bool {}
34+
function curl_exec(CurlHandle $handle): string|bool {}
3735

38-
function curl_file_create(
39-
string $filename,
40-
string $mimetype = UNKNOWN,
41-
string $postname = UNKNOWN
42-
): CURLFile {}
36+
function curl_file_create(string $filename, string $mimetype = UNKNOWN, string $postname = UNKNOWN): CURLFile {}
4337

44-
/**
45-
* @param resource $handle
46-
* @return mixed
47-
*/
48-
function curl_getinfo($handle, int $option = UNKNOWN) {}
38+
function curl_getinfo(CurlHandle $handle, int $option = UNKNOWN): mixed {}
4939

50-
/**
51-
* @param resource $handle
52-
* @return resource|false
53-
*/
54-
function curl_init(string $url = UNKNOWN) {}
40+
function curl_init(string $url = UNKNOWN): CurlHandle|false {}
5541

56-
/**
57-
* @param resource $multi_handle
58-
* @param resource $handle
59-
*/
60-
function curl_multi_add_handle($multi_handle, $handle): int {}
42+
function curl_multi_add_handle(CurlMultiHandle $multi_handle, CurlHandle $handle): int {}
6143

62-
/** @param resource $multi_handle */
63-
function curl_multi_close($multi_handle): void {}
44+
function curl_multi_close(CurlMultiHandle $multi_handle): void {}
6445

65-
/** @param resource $multi_handle */
66-
function curl_multi_errno($multi_handle): int {}
46+
function curl_multi_errno(CurlMultiHandle $multi_handle): int {}
6747

68-
/** @param resource $multi_handle */
69-
function curl_multi_exec($multi_handle, &$still_running): int {}
48+
/** @param int $still_running */
49+
function curl_multi_exec(CurlMultiHandle $multi_handle, &$still_running): int {}
7050

71-
/** @param resource $multi_handle */
72-
function curl_multi_getcontent($multi_handle): ?string {}
51+
function curl_multi_getcontent(CurlHandle $multi_handle): ?string {}
7352

74-
/** @param resource $multi_handle */
75-
function curl_multi_info_read($multi_handle, &$msgs_in_queue = null): array|false {}
53+
/** @param int|null $msgs_in_queue */
54+
function curl_multi_info_read(CurlMultiHandle $multi_handle, &$msgs_in_queue = null): array|false {}
7655

77-
/** @return resource */
78-
function curl_multi_init() {}
56+
function curl_multi_init(): CurlMultiHandle {}
7957

80-
/**
81-
* @param resource $multi_handle
82-
* @param resource $handle
83-
*/
84-
function curl_multi_remove_handle($multi_handle, $handle): int {}
58+
function curl_multi_remove_handle(CurlMultiHandle $multi_handle, CurlHandle $handle): int {}
8559

86-
/** @param resource $multi_handle */
87-
function curl_multi_select($multi_handle, float $timeout = 1.0): int {}
60+
function curl_multi_select(CurlMultiHandle $multi_handle, float $timeout = 1.0): int {}
8861

8962
function curl_multi_strerror(int $error_number): ?string {}
9063

9164
#if LIBCURL_VERSION_NUM >= 0x071200 /* 7.18.0 */
92-
/** @param resource $handle */
93-
function curl_pause($handle, int $bitmask): int {}
65+
function curl_pause(CurlHandle $handle, int $bitmask): int {}
9466
#endif
9567

96-
/** @param resource $handle */
97-
function curl_reset($handle): void {}
68+
function curl_reset(CurlHandle $handle): void {}
9869

99-
/** @param resource $handle */
100-
function curl_setopt_array($handle, array $options): bool {}
70+
function curl_setopt_array(CurlHandle $handle, array $options): bool {}
10171

102-
/**
103-
* @param resource $handle
104-
* @param mixed $value
105-
*/
106-
function curl_setopt($handle, int $option, $value): bool {}
72+
function curl_setopt(CurlHandle $handle, int $option, mixed $value): bool {}
10773

108-
/** @param resource $share_handle */
109-
function curl_share_close($share_handle): void {}
74+
function curl_share_close(CurlShareHandle $share_handle): void {}
11075

111-
/** @param resource $share_handle */
112-
function curl_share_errno($share_handle): int {}
76+
function curl_share_errno(CurlShareHandle $share_handle): int {}
11377

114-
/** @return resource */
115-
function curl_share_init() {}
78+
function curl_share_init(): CurlShareHandle {}
11679

117-
/** @param resource $share_handle */
118-
function curl_share_setopt($share_handle, int $option, $value): bool {}
80+
function curl_share_setopt(CurlShareHandle $share_handle, int $option, mixed $value): bool {}
11981

12082
function curl_share_strerror(int $error_number): ?string {}
12183

ext/curl/curl_arginfo.h

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
/* This is a generated file, edit the .stub.php file instead. */
22

33
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_close, 0, 1, IS_VOID, 0)
4-
ZEND_ARG_INFO(0, handle)
4+
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
55
ZEND_END_ARG_INFO()
66

7-
ZEND_BEGIN_ARG_INFO_EX(arginfo_curl_copy_handle, 0, 0, 1)
8-
ZEND_ARG_INFO(0, handle)
7+
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_curl_copy_handle, 0, 1, CurlHandle, MAY_BE_FALSE)
8+
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
99
ZEND_END_ARG_INFO()
1010

1111
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_errno, 0, 1, IS_LONG, 0)
12-
ZEND_ARG_INFO(0, handle)
12+
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
1313
ZEND_END_ARG_INFO()
1414

1515
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_error, 0, 1, IS_STRING, 0)
16-
ZEND_ARG_INFO(0, handle)
16+
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
1717
ZEND_END_ARG_INFO()
1818

1919
#if LIBCURL_VERSION_NUM >= 0x070f04 /* 7.15.4 */
2020
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_curl_escape, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
21-
ZEND_ARG_INFO(0, handle)
21+
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
2222
ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
2323
ZEND_END_ARG_INFO()
2424
#endif
@@ -29,14 +29,14 @@ ZEND_END_ARG_INFO()
2929

3030
#if LIBCURL_VERSION_NUM >= 0x070f04 /* 7.15.4 */
3131
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_setopt, 0, 3, _IS_BOOL, 0)
32-
ZEND_ARG_INFO(0, multi_handle)
32+
ZEND_ARG_OBJ_INFO(0, multi_handle, CurlMultiHandle, 0)
3333
ZEND_ARG_TYPE_INFO(0, option, IS_LONG, 0)
34-
ZEND_ARG_INFO(0, value)
34+
ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
3535
ZEND_END_ARG_INFO()
3636
#endif
3737

3838
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_curl_exec, 0, 1, MAY_BE_STRING|MAY_BE_BOOL)
39-
ZEND_ARG_INFO(0, handle)
39+
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
4040
ZEND_END_ARG_INFO()
4141

4242
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_curl_file_create, 0, 1, CURLFile, 0)
@@ -45,49 +45,49 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_curl_file_create, 0, 1, CURLFile,
4545
ZEND_ARG_TYPE_INFO(0, postname, IS_STRING, 0)
4646
ZEND_END_ARG_INFO()
4747

48-
ZEND_BEGIN_ARG_INFO_EX(arginfo_curl_getinfo, 0, 0, 1)
49-
ZEND_ARG_INFO(0, handle)
48+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_getinfo, 0, 1, IS_MIXED, 0)
49+
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
5050
ZEND_ARG_TYPE_INFO(0, option, IS_LONG, 0)
5151
ZEND_END_ARG_INFO()
5252

53-
ZEND_BEGIN_ARG_INFO_EX(arginfo_curl_init, 0, 0, 0)
53+
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_curl_init, 0, 0, CurlHandle, MAY_BE_FALSE)
5454
ZEND_ARG_TYPE_INFO(0, url, IS_STRING, 0)
5555
ZEND_END_ARG_INFO()
5656

5757
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_add_handle, 0, 2, IS_LONG, 0)
58-
ZEND_ARG_INFO(0, multi_handle)
59-
ZEND_ARG_INFO(0, handle)
58+
ZEND_ARG_OBJ_INFO(0, multi_handle, CurlMultiHandle, 0)
59+
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
6060
ZEND_END_ARG_INFO()
6161

6262
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_close, 0, 1, IS_VOID, 0)
63-
ZEND_ARG_INFO(0, multi_handle)
63+
ZEND_ARG_OBJ_INFO(0, multi_handle, CurlMultiHandle, 0)
6464
ZEND_END_ARG_INFO()
6565

6666
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_errno, 0, 1, IS_LONG, 0)
67-
ZEND_ARG_INFO(0, multi_handle)
67+
ZEND_ARG_OBJ_INFO(0, multi_handle, CurlMultiHandle, 0)
6868
ZEND_END_ARG_INFO()
6969

7070
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_exec, 0, 2, IS_LONG, 0)
71-
ZEND_ARG_INFO(0, multi_handle)
71+
ZEND_ARG_OBJ_INFO(0, multi_handle, CurlMultiHandle, 0)
7272
ZEND_ARG_INFO(1, still_running)
7373
ZEND_END_ARG_INFO()
7474

7575
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_getcontent, 0, 1, IS_STRING, 1)
76-
ZEND_ARG_INFO(0, multi_handle)
76+
ZEND_ARG_OBJ_INFO(0, multi_handle, CurlHandle, 0)
7777
ZEND_END_ARG_INFO()
7878

7979
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_curl_multi_info_read, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE)
80-
ZEND_ARG_INFO(0, multi_handle)
80+
ZEND_ARG_OBJ_INFO(0, multi_handle, CurlMultiHandle, 0)
8181
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, msgs_in_queue, "null")
8282
ZEND_END_ARG_INFO()
8383

84-
ZEND_BEGIN_ARG_INFO_EX(arginfo_curl_multi_init, 0, 0, 0)
84+
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_curl_multi_init, 0, 0, CurlMultiHandle, 0)
8585
ZEND_END_ARG_INFO()
8686

8787
#define arginfo_curl_multi_remove_handle arginfo_curl_multi_add_handle
8888

8989
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_select, 0, 1, IS_LONG, 0)
90-
ZEND_ARG_INFO(0, multi_handle)
90+
ZEND_ARG_OBJ_INFO(0, multi_handle, CurlMultiHandle, 0)
9191
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_DOUBLE, 0, "1.0")
9292
ZEND_END_ARG_INFO()
9393

@@ -97,38 +97,39 @@ ZEND_END_ARG_INFO()
9797

9898
#if LIBCURL_VERSION_NUM >= 0x071200 /* 7.18.0 */
9999
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_pause, 0, 2, IS_LONG, 0)
100-
ZEND_ARG_INFO(0, handle)
100+
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
101101
ZEND_ARG_TYPE_INFO(0, bitmask, IS_LONG, 0)
102102
ZEND_END_ARG_INFO()
103103
#endif
104104

105105
#define arginfo_curl_reset arginfo_curl_close
106106

107107
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_setopt_array, 0, 2, _IS_BOOL, 0)
108-
ZEND_ARG_INFO(0, handle)
108+
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
109109
ZEND_ARG_TYPE_INFO(0, options, IS_ARRAY, 0)
110110
ZEND_END_ARG_INFO()
111111

112112
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_setopt, 0, 3, _IS_BOOL, 0)
113-
ZEND_ARG_INFO(0, handle)
113+
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
114114
ZEND_ARG_TYPE_INFO(0, option, IS_LONG, 0)
115-
ZEND_ARG_INFO(0, value)
115+
ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
116116
ZEND_END_ARG_INFO()
117117

118118
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_share_close, 0, 1, IS_VOID, 0)
119-
ZEND_ARG_INFO(0, share_handle)
119+
ZEND_ARG_OBJ_INFO(0, share_handle, CurlShareHandle, 0)
120120
ZEND_END_ARG_INFO()
121121

122122
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_share_errno, 0, 1, IS_LONG, 0)
123-
ZEND_ARG_INFO(0, share_handle)
123+
ZEND_ARG_OBJ_INFO(0, share_handle, CurlShareHandle, 0)
124124
ZEND_END_ARG_INFO()
125125

126-
#define arginfo_curl_share_init arginfo_curl_multi_init
126+
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_curl_share_init, 0, 0, CurlShareHandle, 0)
127+
ZEND_END_ARG_INFO()
127128

128129
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_share_setopt, 0, 3, _IS_BOOL, 0)
129-
ZEND_ARG_INFO(0, share_handle)
130+
ZEND_ARG_OBJ_INFO(0, share_handle, CurlShareHandle, 0)
130131
ZEND_ARG_TYPE_INFO(0, option, IS_LONG, 0)
131-
ZEND_ARG_INFO(0, value)
132+
ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
132133
ZEND_END_ARG_INFO()
133134

134135
#define arginfo_curl_share_strerror arginfo_curl_multi_strerror
@@ -225,3 +226,18 @@ static const zend_function_entry ext_functions[] = {
225226
ZEND_FE(curl_version, arginfo_curl_version)
226227
ZEND_FE_END
227228
};
229+
230+
231+
static const zend_function_entry class_CurlHandle_methods[] = {
232+
ZEND_FE_END
233+
};
234+
235+
236+
static const zend_function_entry class_CurlMultiHandle_methods[] = {
237+
ZEND_FE_END
238+
};
239+
240+
241+
static const zend_function_entry class_CurlShareHandle_methods[] = {
242+
ZEND_FE_END
243+
};

0 commit comments

Comments
 (0)