Skip to content

Commit 635b306

Browse files
committed
CurlUrl Object Api
1 parent 5b1e9c1 commit 635b306

14 files changed

+315
-73
lines changed

ext/curl/curl.stub.php

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,29 @@ final class CurlShareHandle
3333
*/
3434
final class CurlUrl implements Stringable
3535
{
36+
public function __construct(?string $url = null) {}
37+
38+
/**
39+
* @alias curl_url_get
40+
*/
41+
public function get(int $part, int $flags = 0): string {}
42+
43+
/**
44+
* @alias curl_url_set
45+
*/
46+
public function set(int $part, string $content, int $flags = 0): true {}
47+
48+
/**
49+
* @alias curl_url_errno
50+
*/
51+
public function getErrno(): int {}
52+
3653
public function __toString(): string {}
3754
}
55+
56+
final class CurlUrlException extends Exception
57+
{
58+
}
3859
#endif
3960

4061
function curl_close(CurlHandle $handle): void {}
@@ -123,9 +144,9 @@ function curl_strerror(int $error_code): ?string {}
123144
#if LIBCURL_VERSION_NUM >= 0x073E00 /* Available since 7.62.0 */
124145
function curl_url(?string $url = null): CurlUrl|false {}
125146

126-
function curl_url_set(CurlUrl $url, int $part, string $content, int $flags = 0): bool {}
147+
function curl_url_set(CurlUrl $url, int $part, string $content, int $flags = 0): true {}
127148

128-
function curl_url_get(CurlUrl $url, int $part, int $flags = 0): string|false {}
149+
function curl_url_get(CurlUrl $url, int $part, int $flags = 0): string {}
129150

130151
function curl_url_errno(CurlUrl $url): int {}
131152
#endif

ext/curl/curl_arginfo.h

Lines changed: 56 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/curl/interface.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,8 +1414,10 @@ PHP_MINIT_FUNCTION(curl)
14141414
curl_share_register_handlers();
14151415

14161416
#if LIBCURL_VERSION_NUM >= 0x073e00 /* 7.62.0 */
1417-
curl_url_ce = register_class_CurlUrl(zend_ce_stringable);
1417+
curl_CURLUrl_ce = register_class_CurlUrl(zend_ce_stringable);
14181418
curl_url_register_handlers();
1419+
1420+
curl_CURLUrlException_ce = register_class_CurlUrlException(zend_ce_exception);
14191421
#endif
14201422

14211423
curlfile_register_class();
@@ -3349,7 +3351,7 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
33493351
/* CurlUrl object */
33503352
#if LIBCURL_VERSION_NUM >= 0x073f00 /* Available since 7.63.0 */
33513353
case CURLOPT_CURLU:
3352-
if (Z_TYPE_P(zvalue) == IS_OBJECT && Z_OBJCE_P(zvalue) == curl_url_ce) {
3354+
if (Z_TYPE_P(zvalue) == IS_OBJECT && Z_OBJCE_P(zvalue) == curl_CURLUrl_ce) {
33533355
php_curlurl *uh = Z_CURL_URL_P(zvalue);
33543356
curl_easy_setopt(ch->cp, CURLOPT_CURLU, uh->url);
33553357

ext/curl/php_curl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ 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;
41+
PHP_CURL_API extern zend_class_entry *curl_CURLUrl_ce;
42+
PHP_CURL_API extern zend_class_entry *curl_CURLUrlException_ce;
4243
PHP_CURL_API extern zend_class_entry *curl_CURLFile_class;
4344
PHP_CURL_API extern zend_class_entry *curl_CURLStringFile_class;
4445

ext/curl/tests/curl_url_002.phpt

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--TEST--
2-
curl_url() function with string containing null byte
2+
curl_url function with string containing null byte
33
--EXTENSIONS--
44
curl
55
--SKIPIF--
@@ -8,12 +8,35 @@ if (curl_version()['version_number'] < 0x073e00) die('skip requires curl >= 7.62
88
?>
99
--FILE--
1010
<?php
11-
$url = "http://www.example.com\0http://google.com";
11+
$invalidUrl = "http://www.example.com\0http://google.com";
12+
1213
try {
13-
curl_url($url);
14-
} catch (ValueError $exception) {
15-
echo $exception->getMessage() . "\n";
14+
curl_url($invalidUrl);
15+
} catch (CurlUrlException $e) {
16+
echo $e->getMessage() . "\n";
17+
}
18+
19+
try {
20+
new CurlUrl($invalidUrl);
21+
} catch (CurlUrlException $e) {
22+
echo $e->getMessage() . "\n";
23+
}
24+
25+
$url = new CurlUrl();
26+
try {
27+
curl_url_set($url, CURLUPART_URL, $invalidUrl);
28+
} catch (CurlUrlException $e) {
29+
echo $e->getMessage() . "\n";
30+
}
31+
32+
try {
33+
$url->set(CURLUPART_URL, $invalidUrl);
34+
} catch (CurlUrlException $e) {
35+
echo $e->getMessage() . "\n";
1636
}
1737
?>
1838
--EXPECT--
19-
curl_url(): string must not contain any null bytes
39+
curl_url(): Argument #1 ($url) must not contain any null bytes
40+
CurlUrl::__construct(): Argument #1 ($url) must not contain any null bytes
41+
curl_url_set(): Argument #3 ($content) must not contain any null bytes
42+
CurlUrl::set(): Argument #2 ($content) must not contain any null bytes

ext/curl/tests/curl_url_003.phpt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--TEST--
2-
curl_url_get() function
2+
curl_url_get() and CurlUrl::get()
33
--EXTENSIONS--
44
curl
55
--SKIPIF--
@@ -11,7 +11,12 @@ if (curl_version()['version_number'] < 0x073e00) die('skip requires curl >= 7.62
1111
$url = curl_url('https://www.example.com/');
1212
echo curl_url_get($url, CURLUPART_URL), PHP_EOL;
1313
echo curl_url_get($url, CURLUPART_PORT, CURLU_DEFAULT_PORT), PHP_EOL;
14+
15+
echo $url->get(CURLUPART_URL), PHP_EOL;
16+
echo $url->get(CURLUPART_PORT, CURLU_DEFAULT_PORT), PHP_EOL;
1417
?>
1518
--EXPECT--
1619
https://www.example.com/
1720
443
21+
https://www.example.com/
22+
443

ext/curl/tests/curl_url_004.phpt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--TEST--
2-
curl_url_set() function
2+
curl_url_set() and CurlUrl::set()
33
--EXTENSIONS--
44
curl
55
--SKIPIF--
@@ -10,10 +10,18 @@ if (curl_version()['version_number'] < 0x073e00) die('skip requires curl >= 7.62
1010
<?php
1111
$url = curl_url();
1212
var_dump(curl_url_set($url, CURLUPART_HOST, 'www.example.com'));
13-
var_dump(curl_url_set($url, CURLUPART_SCHEME, 'ftp'));
14-
echo curl_url_get($url, CURLUPART_URL);
13+
var_dump(curl_url_set($url, CURLUPART_SCHEME, 'foobar', CURLU_NON_SUPPORT_SCHEME));
14+
echo curl_url_get($url, CURLUPART_URL), PHP_EOL;
15+
16+
var_dump($url->set(CURLUPART_HOST, 'www.php.net'));
17+
var_dump($url->set(CURLUPART_SCHEME, 'foobar', CURLU_NON_SUPPORT_SCHEME));
18+
echo $url->get(CURLUPART_URL);
19+
1520
?>
1621
--EXPECT--
1722
bool(true)
1823
bool(true)
19-
ftp://www.example.com/
24+
foobar://www.example.com/
25+
bool(true)
26+
bool(true)
27+
foobar://www.php.net/

ext/curl/tests/curl_url_005.phpt

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--TEST--
2-
curl_url_set() function with error
2+
curl_url_set() and CurlUrl::set() with errors
33
--EXTENSIONS--
44
curl
55
--SKIPIF--
@@ -10,10 +10,26 @@ if (curl_version()['version_number'] < 0x073e00) die('skip requires curl >= 7.62
1010
<?php
1111
$url = curl_url();
1212
var_dump(curl_url_errno($url));
13-
var_dump(curl_url_set($url, CURLUPART_SCHEME, 'foobar'));
13+
try {
14+
curl_url_set($url, CURLUPART_SCHEME, 'foobar');
15+
} catch (CurlUrlException $e) {
16+
var_dump($e->getCode() == CURLUE_UNSUPPORTED_SCHEME);
17+
}
1418
var_dump(curl_url_errno($url) == CURLUE_UNSUPPORTED_SCHEME);
19+
20+
$url = new CurlUrl();
21+
var_dump($url->getErrno());
22+
try {
23+
$url->set(CURLUPART_SCHEME, 'foobar');
24+
} catch (CurlUrlException $e) {
25+
var_dump($e->getCode() == CURLUE_UNSUPPORTED_SCHEME);
26+
}
27+
var_dump($url->getErrno() == CURLUE_UNSUPPORTED_SCHEME);
1528
?>
1629
--EXPECT--
1730
int(0)
18-
bool(false)
31+
bool(true)
32+
bool(true)
33+
int(0)
34+
bool(true)
1935
bool(true)

ext/curl/tests/curl_url_007.phpt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ if (curl_version()['version_number'] < 0x073e00) die('skip requires curl >= 7.62
88
?>
99
--FILE--
1010
<?php
11-
echo curl_url('https://www.example.com/');
11+
echo curl_url('https://www.example.com/'), PHP_EOL;
12+
echo new CurlUrl('https://www.php.net/');
1213
?>
1314
--EXPECT--
1415
https://www.example.com/
16+
https://www.php.net/

ext/curl/tests/curl_url_008.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
CurlUrl constructor
3+
--EXTENSIONS--
4+
curl
5+
--SKIPIF--
6+
<?php
7+
if (curl_version()['version_number'] < 0x073e00) die('skip requires curl >= 7.62.0');
8+
?>
9+
--FILE--
10+
<?php
11+
12+
$url1 = new CurlUrl();
13+
$url2 = new CurlUrl(null);
14+
$url3 = new CurlUrl('https://www.google.com');
15+
16+
var_dump($url1, $url2, $url3);
17+
?>
18+
--EXPECT--
19+
object(CurlUrl)#1 (0) {
20+
}
21+
object(CurlUrl)#2 (0) {
22+
}
23+
object(CurlUrl)#3 (0) {
24+
}

ext/curl/tests/curl_url_009.phpt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--TEST--
2+
curl_url_get() and CurlUrl::get() with errors
3+
--EXTENSIONS--
4+
curl
5+
--SKIPIF--
6+
<?php
7+
if (curl_version()['version_number'] < 0x073e00) die('skip requires curl >= 7.62.0');
8+
?>
9+
--FILE--
10+
<?php
11+
$url = curl_url();
12+
var_dump(curl_url_errno($url));
13+
try {
14+
curl_url_get($url, CURLUPART_SCHEME);
15+
} catch (CurlUrlException $e) {
16+
var_dump($e->getCode() == CURLUE_NO_SCHEME);
17+
}
18+
var_dump(curl_url_errno($url) == CURLUE_NO_SCHEME);
19+
20+
$url = new CurlUrl();
21+
var_dump($url->getErrno());
22+
try {
23+
$url->get(CURLUPART_SCHEME);
24+
} catch (CurlUrlException $e) {
25+
var_dump($e->getCode() == CURLUE_NO_SCHEME);
26+
}
27+
var_dump($url->getErrno() == CURLUE_NO_SCHEME);
28+
?>
29+
--EXPECT--
30+
int(0)
31+
bool(true)
32+
bool(true)
33+
int(0)
34+
bool(true)
35+
bool(true)

0 commit comments

Comments
 (0)