Skip to content

Commit 43dc427

Browse files
committed
Fix the distinction between missing and empty username/password for RFC3986 URIs
1 parent 0b974dd commit 43dc427

File tree

4 files changed

+107
-2
lines changed

4 files changed

+107
-2
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--TEST--
2+
Test Uri\Rfc3986\Uri parsing - userinfo - empty
3+
--EXTENSIONS--
4+
uri
5+
--FILE--
6+
<?php
7+
8+
$uri = Uri\Rfc3986\Uri::parse("https://@example.com");
9+
10+
var_dump($uri);
11+
var_dump($uri->toRawString());
12+
var_dump($uri->toString());
13+
14+
?>
15+
--EXPECTF--
16+
object(Uri\Rfc3986\Uri)#%d (%d) {
17+
["scheme"]=>
18+
string(5) "https"
19+
["username"]=>
20+
string(0) ""
21+
["password"]=>
22+
string(0) ""
23+
["host"]=>
24+
string(11) "example.com"
25+
["port"]=>
26+
NULL
27+
["path"]=>
28+
string(0) ""
29+
["query"]=>
30+
NULL
31+
["fragment"]=>
32+
NULL
33+
}
34+
string(20) "https://@example.com"
35+
string(20) "https://@example.com"
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--TEST--
2+
Test Uri\Rfc3986\Uri parsing - userinfo - only password
3+
--EXTENSIONS--
4+
uri
5+
--FILE--
6+
<?php
7+
8+
$uri = Uri\Rfc3986\Uri::parse("https://:pass@example.com");
9+
10+
var_dump($uri);
11+
var_dump($uri->toRawString());
12+
var_dump($uri->toString());
13+
14+
?>
15+
--EXPECTF--
16+
object(Uri\Rfc3986\Uri)#%d (%d) {
17+
["scheme"]=>
18+
string(5) "https"
19+
["username"]=>
20+
string(0) ""
21+
["password"]=>
22+
string(4) "pass"
23+
["host"]=>
24+
string(11) "example.com"
25+
["port"]=>
26+
NULL
27+
["path"]=>
28+
string(0) ""
29+
["query"]=>
30+
NULL
31+
["fragment"]=>
32+
NULL
33+
}
34+
string(25) "https://:pass@example.com"
35+
string(25) "https://:pass@example.com"
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--TEST--
2+
Test Uri\Rfc3986\Uri parsing - userinfo - only username
3+
--EXTENSIONS--
4+
uri
5+
--FILE--
6+
<?php
7+
8+
$uri = Uri\Rfc3986\Uri::parse("https://user:@example.com");
9+
10+
var_dump($uri);
11+
var_dump($uri->toRawString());
12+
var_dump($uri->toString());
13+
14+
?>
15+
--EXPECTF--
16+
object(Uri\Rfc3986\Uri)#%d (%d) {
17+
["scheme"]=>
18+
string(5) "https"
19+
["username"]=>
20+
string(4) "user"
21+
["password"]=>
22+
string(0) ""
23+
["host"]=>
24+
string(11) "example.com"
25+
["port"]=>
26+
NULL
27+
["path"]=>
28+
string(0) ""
29+
["query"]=>
30+
NULL
31+
["fragment"]=>
32+
NULL
33+
}
34+
string(25) "https://user:@example.com"
35+
string(25) "https://user:@example.com"

ext/uri/uri_parser_rfc3986.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_username_read(v
202202
} else if (c != NULL && c - uriparser_uri->userInfo.first > 0) {
203203
ZVAL_STRINGL(retval, uriparser_uri->userInfo.first, c - uriparser_uri->userInfo.first);
204204
} else {
205-
ZVAL_NULL(retval);
205+
ZVAL_EMPTY_STRING(retval);
206206
}
207207
} else {
208208
ZVAL_NULL(retval);
@@ -221,7 +221,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_password_read(v
221221
if (c != NULL && uriparser_uri->userInfo.afterLast - c - 1 > 0) {
222222
ZVAL_STRINGL(retval, c + 1, uriparser_uri->userInfo.afterLast - c - 1);
223223
} else {
224-
ZVAL_NULL(retval);
224+
ZVAL_EMPTY_STRING(retval);
225225
}
226226
} else {
227227
ZVAL_NULL(retval);

0 commit comments

Comments
 (0)