Skip to content

Commit 4add218

Browse files
thg2kondrejmirtes
authored andcommitted
More specific type for 'port' component of 'parse_url()'
1 parent 4b6d964 commit 4add218

File tree

4 files changed

+18
-18
lines changed

4 files changed

+18
-18
lines changed

src/Type/Php/ParseUrlFunctionDynamicReturnTypeExtension.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use PHPStan\Type\Constant\ConstantStringType;
1414
use PHPStan\Type\ConstantType;
1515
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
16-
use PHPStan\Type\IntegerType;
16+
use PHPStan\Type\IntegerRangeType;
1717
use PHPStan\Type\NullType;
1818
use PHPStan\Type\StringType;
1919
use PHPStan\Type\Type;
@@ -122,17 +122,17 @@ private function cacheReturnTypes(): void
122122
}
123123

124124
$string = new StringType();
125-
$integer = new IntegerType();
125+
$port = IntegerRangeType::fromInterval(0, 65535);
126126
$false = new ConstantBooleanType(false);
127127
$null = new NullType();
128128

129129
$stringOrFalseOrNull = TypeCombinator::union($string, $false, $null);
130-
$integerOrFalseOrNull = TypeCombinator::union($integer, $false, $null);
130+
$portOrFalseOrNull = TypeCombinator::union($port, $false, $null);
131131

132132
$this->componentTypesPairedConstants = [
133133
PHP_URL_SCHEME => $stringOrFalseOrNull,
134134
PHP_URL_HOST => $stringOrFalseOrNull,
135-
PHP_URL_PORT => $integerOrFalseOrNull,
135+
PHP_URL_PORT => $portOrFalseOrNull,
136136
PHP_URL_USER => $stringOrFalseOrNull,
137137
PHP_URL_PASS => $stringOrFalseOrNull,
138138
PHP_URL_PATH => $stringOrFalseOrNull,
@@ -143,7 +143,7 @@ private function cacheReturnTypes(): void
143143
$this->componentTypesPairedStrings = [
144144
'scheme' => $string,
145145
'host' => $string,
146-
'port' => $integer,
146+
'port' => $port,
147147
'user' => $string,
148148
'pass' => $string,
149149
'path' => $string,

tests/PHPStan/Analyser/LegacyNodeScopeResolverTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5385,7 +5385,7 @@ public function dataFunctions(): array
53855385
'$parseUrlConstantUrlWithoutComponent2',
53865386
],
53875387
[
5388-
'array{scheme?: string, host?: string, port?: int, user?: string, pass?: string, path?: string, query?: string, fragment?: string}|false',
5388+
'array{scheme?: string, host?: string, port?: int<0, 65535>, user?: string, pass?: string, path?: string, query?: string, fragment?: string}|false',
53895389
'$parseUrlConstantUrlUnknownComponent',
53905390
],
53915391
[
@@ -5405,11 +5405,11 @@ public function dataFunctions(): array
54055405
'$parseUrlStringUrlWithComponentInvalid',
54065406
],
54075407
[
5408-
'int|false|null',
5408+
'int<0, 65535>|false|null',
54095409
'$parseUrlStringUrlWithComponentPort',
54105410
],
54115411
[
5412-
'array{scheme?: string, host?: string, port?: int, user?: string, pass?: string, path?: string, query?: string, fragment?: string}|false',
5412+
'array{scheme?: string, host?: string, port?: int<0, 65535>, user?: string, pass?: string, path?: string, query?: string, fragment?: string}|false',
54135413
'$parseUrlStringUrlWithoutComponent',
54145414
],
54155415
[

tests/PHPStan/Analyser/data/bug-2001.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,28 @@ class HelloWorld
99
public function parseUrl(string $url): string
1010
{
1111
$parsedUrl = parse_url(urldecode($url));
12-
assertType('array{scheme?: string, host?: string, port?: int, user?: string, pass?: string, path?: string, query?: string, fragment?: string}|false', $parsedUrl);
12+
assertType('array{scheme?: string, host?: string, port?: int<0, 65535>, user?: string, pass?: string, path?: string, query?: string, fragment?: string}|false', $parsedUrl);
1313

1414
if (array_key_exists('host', $parsedUrl)) {
15-
assertType('array{scheme?: string, host: string, port?: int, user?: string, pass?: string, path?: string, query?: string, fragment?: string}', $parsedUrl);
15+
assertType('array{scheme?: string, host: string, port?: int<0, 65535>, user?: string, pass?: string, path?: string, query?: string, fragment?: string}', $parsedUrl);
1616
throw new \RuntimeException('Absolute URLs are prohibited for the redirectTo parameter.');
1717
}
1818

19-
assertType('array{scheme?: string, port?: int, user?: string, pass?: string, path?: string, query?: string, fragment?: string}|false', $parsedUrl);
19+
assertType('array{scheme?: string, port?: int<0, 65535>, user?: string, pass?: string, path?: string, query?: string, fragment?: string}|false', $parsedUrl);
2020

2121
$redirectUrl = $parsedUrl['path'];
2222

2323
if (array_key_exists('query', $parsedUrl)) {
24-
assertType('array{scheme?: string, port?: int, user?: string, pass?: string, path?: string, query: string, fragment?: string}', $parsedUrl);
24+
assertType('array{scheme?: string, port?: int<0, 65535>, user?: string, pass?: string, path?: string, query: string, fragment?: string}', $parsedUrl);
2525
$redirectUrl .= '?' . $parsedUrl['query'];
2626
}
2727

2828
if (array_key_exists('fragment', $parsedUrl)) {
29-
assertType('array{scheme?: string, port?: int, user?: string, pass?: string, path?: string, query?: string, fragment: string}', $parsedUrl);
29+
assertType('array{scheme?: string, port?: int<0, 65535>, user?: string, pass?: string, path?: string, query?: string, fragment: string}', $parsedUrl);
3030
$redirectUrl .= '#' . $parsedUrl['query'];
3131
}
3232

33-
assertType('array{scheme?: string, port?: int, user?: string, pass?: string, path?: string, query?: string, fragment?: string}|false', $parsedUrl);
33+
assertType('array{scheme?: string, port?: int<0, 65535>, user?: string, pass?: string, path?: string, query?: string, fragment?: string}|false', $parsedUrl);
3434

3535
return $redirectUrl;
3636
}

tests/PHPStan/Analyser/data/bug-3009.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,18 @@ public function createRedirectRequest(string $redirectUri): ?string
1111
{
1212
$redirectUrlParts = parse_url($redirectUri);
1313
if (false === is_array($redirectUrlParts) || true === array_key_exists('host', $redirectUrlParts)) {
14-
assertType('array{scheme?: string, host: string, port?: int, user?: string, pass?: string, path?: string, query?: string, fragment?: string}|false', $redirectUrlParts);
14+
assertType('array{scheme?: string, host: string, port?: int<0, 65535>, user?: string, pass?: string, path?: string, query?: string, fragment?: string}|false', $redirectUrlParts);
1515
return null;
1616
}
1717

18-
assertType('array{scheme?: string, host?: string, port?: int, user?: string, pass?: string, path?: string, query?: string, fragment?: string}', $redirectUrlParts);
18+
assertType('array{scheme?: string, host?: string, port?: int<0, 65535>, user?: string, pass?: string, path?: string, query?: string, fragment?: string}', $redirectUrlParts);
1919

2020
if (true === array_key_exists('query', $redirectUrlParts)) {
21-
assertType('array{scheme?: string, host?: string, port?: int, user?: string, pass?: string, path?: string, query: string, fragment?: string}', $redirectUrlParts);
21+
assertType('array{scheme?: string, host?: string, port?: int<0, 65535>, user?: string, pass?: string, path?: string, query: string, fragment?: string}', $redirectUrlParts);
2222
$redirectServer['QUERY_STRING'] = $redirectUrlParts['query'];
2323
}
2424

25-
assertType('array{scheme?: string, host?: string, port?: int, user?: string, pass?: string, path?: string, query?: string, fragment?: string}', $redirectUrlParts);
25+
assertType('array{scheme?: string, host?: string, port?: int<0, 65535>, user?: string, pass?: string, path?: string, query?: string, fragment?: string}', $redirectUrlParts);
2626

2727
return 'foo';
2828
}

0 commit comments

Comments
 (0)