Skip to content

Commit e65deb7

Browse files
committed
Fix tests
1 parent eed1ea3 commit e65deb7

File tree

6 files changed

+187
-62
lines changed

6 files changed

+187
-62
lines changed

ext/url/php_url.c

Lines changed: 73 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ static lxb_url_parser_t *init_parser(void)
4444
lexbor_mraw_t *mraw = lexbor_mraw_create();
4545
lxb_status_t status = lexbor_mraw_init(mraw, 4096 * 2);
4646
if (status != LXB_STATUS_OK) {
47+
lexbor_mraw_destroy(mraw, true);
4748
return NULL;
4849
}
4950

5051
lxb_url_parser_t *parser = lxb_url_parser_create();
5152
status = lxb_url_parser_init(parser, mraw);
5253
if (status != LXB_STATUS_OK) {
54+
lxb_url_parser_destroy(parser, true);
5355
return NULL;
5456
}
5557

@@ -64,8 +66,7 @@ static void destroy_parser(lxb_url_parser_t *parser)
6466

6567
#define PARSE_URL(url) \
6668
do { \
67-
lxb_url = lxb_url_parse(URL_G(parser), NULL, (unsigned char *) ZSTR_VAL(url), ZSTR_LEN(url)); \
68-
if (lxb_url == NULL) { \
69+
if (ZSTR_LEN(url) == 0 || (lxb_url = lxb_url_parse(URL_G(parser), NULL, (unsigned char *) ZSTR_VAL(url), ZSTR_LEN(url))) == NULL) { \
6970
zend_argument_value_error(1, "is not a valid URL"); \
7071
RETURN_THROWS(); \
7172
} \
@@ -158,19 +159,19 @@ static void cleanup_parser(void)
158159
void parse_url_to_array(zend_string *url, zval *return_value)
159160
{
160161
zval tmp;
161-
lxb_url_t *lxb_url;
162+
lxb_url_t *lxb_url = NULL;
162163

163164
PARSE_URL(url);
164165

165166
array_init(return_value);
166167

167168
url_scheme_to_zval(lxb_url, &tmp);
168-
if (Z_STRLEN(tmp) > 0) {
169+
if (Z_TYPE(tmp) == IS_STRING && Z_STRLEN(tmp) > 0) {
169170
zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_SCHEME), &tmp);
170171
}
171172

172173
url_host_to_zval(lxb_url, &tmp);
173-
if (Z_STRLEN(tmp) > 0) {
174+
if (Z_TYPE(tmp) == IS_STRING && Z_STRLEN(tmp) > 0) {
174175
zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_HOST), &tmp);
175176
}
176177

@@ -210,71 +211,89 @@ void parse_url_to_array(zend_string *url, zval *return_value)
210211
void parse_url_to_object(zend_string *url, zval *return_value)
211212
{
212213
zval tmp;
213-
lxb_url_t *lxb_url;
214+
lxb_url_t *lxb_url = NULL;
214215

215216
PARSE_URL(url);
216217

217218
object_init_ex(return_value, url_ce);
218219

219220
url_scheme_to_zval(lxb_url, &tmp);
220-
zend_update_property(
221-
url_ce, Z_OBJ_P(return_value),
222-
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_SCHEME)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_SCHEME)),
223-
&tmp
224-
);
221+
zend_update_property_ex(url_ce, Z_OBJ_P(return_value), ZSTR_KNOWN(ZEND_STR_SCHEME), &tmp);
222+
zval_ptr_dtor(&tmp);
225223

226224
url_host_to_zval(lxb_url, &tmp);
227-
zend_update_property(
228-
url_ce, Z_OBJ_P(return_value),
229-
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_HOST)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_HOST)),
230-
&tmp
231-
);
225+
zend_update_property_ex(url_ce, Z_OBJ_P(return_value), ZSTR_KNOWN(ZEND_STR_HOST), &tmp);
226+
zval_ptr_dtor(&tmp);
232227

233228
url_port_to_zval(lxb_url, &tmp);
234-
zend_update_property(
235-
url_ce, Z_OBJ_P(return_value),
236-
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_PORT)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_PORT)),
237-
&tmp
238-
);
229+
zend_update_property_ex(url_ce, Z_OBJ_P(return_value), ZSTR_KNOWN(ZEND_STR_PORT), &tmp);
230+
zval_ptr_dtor(&tmp);
239231

240232
url_user_to_zval(lxb_url, &tmp);
241-
zend_update_property(
242-
url_ce, Z_OBJ_P(return_value),
243-
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_USER)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_USER)),
244-
&tmp
245-
);
233+
zend_update_property_ex(url_ce, Z_OBJ_P(return_value), ZSTR_KNOWN(ZEND_STR_USER), &tmp);
234+
zval_ptr_dtor(&tmp);
246235

247236
url_password_to_zval(lxb_url, &tmp);
248-
zend_update_property(
249-
url_ce, Z_OBJ_P(return_value),
250-
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_PASSWORD)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_PASSWORD)),
251-
&tmp
252-
);
237+
zend_update_property_ex(url_ce, Z_OBJ_P(return_value), ZSTR_KNOWN(ZEND_STR_PASSWORD), &tmp);
238+
zval_ptr_dtor(&tmp);
253239

254240
url_path_to_zval(lxb_url, &tmp);
255-
zend_update_property(
256-
url_ce, Z_OBJ_P(return_value),
257-
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_PATH)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_PATH)),
258-
&tmp
259-
);
241+
zend_update_property_ex(url_ce, Z_OBJ_P(return_value), ZSTR_KNOWN(ZEND_STR_PATH), &tmp);
242+
zval_ptr_dtor(&tmp);
260243

261244
url_query_string_to_zval(lxb_url, &tmp);
262-
zend_update_property(
263-
url_ce, Z_OBJ_P(return_value),
264-
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_QUERY)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_QUERY)),
265-
&tmp
266-
);
245+
zend_update_property_ex(url_ce, Z_OBJ_P(return_value), ZSTR_KNOWN(ZEND_STR_QUERY), &tmp);
246+
zval_ptr_dtor(&tmp);
267247

268248
url_fragment_to_zval(lxb_url, &tmp);
269-
zend_update_property(
270-
url_ce, Z_OBJ_P(return_value),
271-
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_FRAGMENT)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_FRAGMENT)),
272-
&tmp
273-
);
249+
zend_update_property_ex(url_ce, Z_OBJ_P(return_value), ZSTR_KNOWN(ZEND_STR_FRAGMENT), &tmp);
250+
zval_ptr_dtor(&tmp);
274251

275252
cleanup_parser();
276253
}
277254

255+
void url_update_str_property(const zend_execute_data *execute_data, zend_string *name, zend_string *value)
256+
{
257+
zval zv;
258+
259+
if (value) {
260+
ZVAL_STR(&zv, value);
261+
} else {
262+
ZVAL_NULL(&zv);
263+
}
264+
265+
zend_update_property_ex(url_ce, Z_OBJ_P(getThis()), name, &zv);
266+
}
267+
268+
void url_update_long_property(const zend_execute_data *execute_data, zend_string *name, zend_long value, bool value_is_null)
269+
{
270+
zval zv;
271+
272+
if (!value_is_null) {
273+
ZVAL_LONG(&zv, value);
274+
} else {
275+
ZVAL_NULL(&zv);
276+
}
277+
278+
zend_update_property_ex(url_ce, Z_OBJ_P(getThis()), name, &zv);
279+
}
280+
281+
#define UPDATE_STR_PROPERTY(e, n, v) \
282+
do { \
283+
url_update_str_property(e, n, v); \
284+
if (EG(exception)) { \
285+
RETURN_THROWS(); \
286+
} \
287+
} while(0)
288+
289+
#define UPDATE_LONG_PROPERTY(e, n, v, vn) \
290+
do { \
291+
url_update_long_property(e, n, v, vn); \
292+
if (EG(exception)) { \
293+
RETURN_THROWS(); \
294+
} \
295+
} while(0)
296+
278297
PHP_METHOD(Url_Url, __construct)
279298
{
280299
zend_string *scheme = NULL, *host = NULL, *user = NULL, *password = NULL, *path = NULL, *query = NULL, *fragment = NULL;
@@ -292,9 +311,14 @@ PHP_METHOD(Url_Url, __construct)
292311
Z_PARAM_STR_OR_NULL(fragment)
293312
ZEND_PARSE_PARAMETERS_END();
294313

295-
zend_update_property_str(url_ce, Z_OBJ_P(getThis()), "scheme", sizeof("scheme")-1, scheme);
296-
297-
// TODO Not implemented yet
314+
UPDATE_STR_PROPERTY(execute_data, ZSTR_KNOWN(ZEND_STR_SCHEME), scheme);
315+
UPDATE_STR_PROPERTY(execute_data, ZSTR_KNOWN(ZEND_STR_HOST), host);
316+
UPDATE_LONG_PROPERTY(execute_data, ZSTR_KNOWN(ZEND_STR_PORT), port, port_is_null);
317+
UPDATE_STR_PROPERTY(execute_data, ZSTR_KNOWN(ZEND_STR_USER), user);
318+
UPDATE_STR_PROPERTY(execute_data, ZSTR_KNOWN(ZEND_STR_PASSWORD), password);
319+
UPDATE_STR_PROPERTY(execute_data, ZSTR_KNOWN(ZEND_STR_PATH), path);
320+
UPDATE_STR_PROPERTY(execute_data, ZSTR_KNOWN(ZEND_STR_QUERY), query);
321+
UPDATE_STR_PROPERTY(execute_data, ZSTR_KNOWN(ZEND_STR_FRAGMENT), fragment);
298322
}
299323

300324
PHP_METHOD(Url_Url, __toString)

ext/url/php_url.stub.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ enum UrlComponent: int {
1515
case Fragment = 7;
1616
}
1717

18-
readonly class Url implements \Stringable {
18+
/** @strict-properties */
19+
final readonly class Url implements \Stringable {
1920
public ?string $scheme;
2021
public ?string $host;
2122
public ?int $port;
@@ -39,6 +40,10 @@ public function __construct(
3940
public function __toString(): string {}
4041
}
4142

43+
/**
44+
* @strict-properties
45+
* @not-serializable
46+
*/
4247
final class UrlParser
4348
{
4449
/** @refcount 1 */

ext/url/php_url_arginfo.h

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

ext/url/tests/004.phpt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--TEST--
2-
Parse invalid URL
2+
Parse invalid URLs
33
--EXTENSIONS--
44
url
55
--FILE--
@@ -17,7 +17,14 @@ try {
1717
echo $e->getMessage() . "\n";
1818
}
1919

20+
try {
21+
\Url\UrlParser::parseUrl("");
22+
} catch (ValueError $e) {
23+
echo $e->getMessage() . "\n";
24+
}
25+
2026
?>
2127
--EXPECTF--
2228
Url\UrlParser::parseUrl(): Argument #1 ($url) is not a valid URL
2329
Url\UrlParser::parseUrlArray(): Argument #1 ($url) is not a valid URL
30+
Url\UrlParser::parseUrl(): Argument #1 ($url) is not a valid URL

ext/url/tests/005.phpt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
--TEST--
2+
Test manual Url/Url instance creation
3+
--EXTENSIONS--
4+
url
5+
--FILE--
6+
<?php
7+
8+
$url = new Url\Url("https", "example.com", null, null, null, null, null, null);
9+
var_dump($url);
10+
11+
$url = new Url\Url("https", "example.com", 8080, "user", "password", "/path", "q=r", "fragment");
12+
var_dump($url);
13+
14+
?>
15+
--EXPECTF--
16+
object(Url\Url)#%d (%d) {
17+
["scheme"]=>
18+
string(5) "https"
19+
["host"]=>
20+
string(11) "example.com"
21+
["port"]=>
22+
NULL
23+
["user"]=>
24+
NULL
25+
["password"]=>
26+
NULL
27+
["path"]=>
28+
NULL
29+
["query"]=>
30+
NULL
31+
["fragment"]=>
32+
NULL
33+
}
34+
object(Url\Url)#%d (%d) {
35+
["scheme"]=>
36+
string(5) "https"
37+
["host"]=>
38+
string(11) "example.com"
39+
["port"]=>
40+
int(8080)
41+
["user"]=>
42+
string(4) "user"
43+
["password"]=>
44+
string(8) "password"
45+
["path"]=>
46+
string(5) "/path"
47+
["query"]=>
48+
string(3) "q=r"
49+
["fragment"]=>
50+
string(8) "fragment"
51+
}

0 commit comments

Comments
 (0)