Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8bd84c5

Browse files
Work around parse_url() bug
1 parent 0a9f66c commit 8bd84c5

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

Controller/RedirectController.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,14 +119,19 @@ public function urlRedirectAction(Request $request, string $path, bool $permanen
119119
$statusCode = $permanent ? 301 : 302;
120120
}
121121

122+
if (null === $scheme) {
123+
$scheme = $request->getScheme();
124+
}
125+
126+
if (str_starts_with($path, '//')) {
127+
$path = $scheme.':'.$path;
128+
}
129+
122130
// redirect if the path is a full URL
123131
if (parse_url($path, \PHP_URL_SCHEME)) {
124132
return new RedirectResponse($path, $statusCode);
125133
}
126134

127-
if (null === $scheme) {
128-
$scheme = $request->getScheme();
129-
}
130135

131136
if ($qs = $request->server->get('QUERY_STRING') ?: $request->getQueryString()) {
132137
if (!str_contains($path, '?')) {

Tests/Controller/RedirectControllerTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,20 @@ public function testFullURLWithMethodKeep()
183183
$this->assertEquals(307, $returnResponse->getStatusCode());
184184
}
185185

186+
public function testProtocolRelative()
187+
{
188+
$request = new Request();
189+
$controller = new RedirectController();
190+
191+
$returnResponse = $controller->urlRedirectAction($request, '//foo.bar/');
192+
$this->assertRedirectUrl($returnResponse, 'http://foo.bar/');
193+
$this->assertSame(302, $returnResponse->getStatusCode());
194+
195+
$returnResponse = $controller->urlRedirectAction($request, '//foo.bar/', false, 'https');
196+
$this->assertRedirectUrl($returnResponse, 'https://foo.bar/');
197+
$this->assertSame(302, $returnResponse->getStatusCode());
198+
}
199+
186200
public function testUrlRedirectDefaultPorts()
187201
{
188202
$host = 'www.example.com';

0 commit comments

Comments
 (0)