Skip to content

Commit ee1d77f

Browse files
committed
[HttpFoundation] Fix request uri when it starts with double slashes
1 parent 02b3510 commit ee1d77f

File tree

2 files changed

+57
-45
lines changed

2 files changed

+57
-45
lines changed

src/Symfony/Component/HttpFoundation/Request.php

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1837,15 +1837,23 @@ protected function prepareRequestUri()
18371837
} elseif ($this->server->has('REQUEST_URI')) {
18381838
$requestUri = $this->server->get('REQUEST_URI');
18391839

1840-
// HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path, only use URL path
1841-
$uriComponents = parse_url($requestUri);
1840+
if ('' !== $requestUri && '/' === $requestUri[0]) {
1841+
// To only use path and query remove the fragment.
1842+
if (false !== $pos = strpos($requestUri, '#')) {
1843+
$requestUri = substr($requestUri, 0, $pos);
1844+
}
1845+
} else {
1846+
// HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path,
1847+
// only use URL path.
1848+
$uriComponents = parse_url($requestUri);
18421849

1843-
if (isset($uriComponents['path'])) {
1844-
$requestUri = $uriComponents['path'];
1845-
}
1850+
if (isset($uriComponents['path'])) {
1851+
$requestUri = $uriComponents['path'];
1852+
}
18461853

1847-
if (isset($uriComponents['query'])) {
1848-
$requestUri .= '?'.$uriComponents['query'];
1854+
if (isset($uriComponents['query'])) {
1855+
$requestUri .= '?'.$uriComponents['query'];
1856+
}
18491857
}
18501858
} elseif ($this->server->has('ORIG_PATH_INFO')) {
18511859
// IIS 5.0, PHP as CGI

src/Symfony/Component/HttpFoundation/Tests/RequestTest.php

Lines changed: 42 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -238,49 +238,53 @@ public function testCreate()
238238
$this->assertEquals('http://test.com/foo', $request->getUri());
239239
}
240240

241-
public function testCreateWithRequestUri()
241+
/**
242+
* @dataProvider getRequestUriData
243+
*/
244+
public function testGetRequestUri($serverRequestUri, $expected, $message)
242245
{
243-
$request = Request::create('http://test.com:80/foo');
244-
$request->server->set('REQUEST_URI', 'http://test.com:80/foo');
245-
$this->assertEquals('http://test.com/foo', $request->getUri());
246-
$this->assertEquals('/foo', $request->getPathInfo());
247-
$this->assertEquals('test.com', $request->getHost());
248-
$this->assertEquals('test.com', $request->getHttpHost());
249-
$this->assertEquals(80, $request->getPort());
250-
$this->assertFalse($request->isSecure());
246+
$request = new Request();
247+
$request->server->add(array(
248+
'REQUEST_URI' => $serverRequestUri,
251249

252-
$request = Request::create('http://test.com:8080/foo');
253-
$request->server->set('REQUEST_URI', 'http://test.com:8080/foo');
254-
$this->assertEquals('http://test.com:8080/foo', $request->getUri());
255-
$this->assertEquals('/foo', $request->getPathInfo());
256-
$this->assertEquals('test.com', $request->getHost());
257-
$this->assertEquals('test.com:8080', $request->getHttpHost());
258-
$this->assertEquals(8080, $request->getPort());
259-
$this->assertFalse($request->isSecure());
250+
// For having http://test.com
251+
'SERVER_NAME' => 'test.com',
252+
'SERVER_PORT' => 80,
253+
));
260254

261-
$request = Request::create('http://test.com/foo?bar=foo', 'GET', array('bar' => 'baz'));
262-
$request->server->set('REQUEST_URI', 'http://test.com/foo?bar=foo');
263-
$this->assertEquals('http://test.com/foo?bar=baz', $request->getUri());
264-
$this->assertEquals('/foo', $request->getPathInfo());
265-
$this->assertEquals('bar=baz', $request->getQueryString());
266-
$this->assertEquals('test.com', $request->getHost());
267-
$this->assertEquals('test.com', $request->getHttpHost());
268-
$this->assertEquals(80, $request->getPort());
269-
$this->assertFalse($request->isSecure());
255+
$this->assertSame($expected, $request->getRequestUri(), $message);
256+
$this->assertSame($expected, $request->server->get('REQUEST_URI'), 'Normalize the request URI.');
257+
}
270258

271-
$request = Request::create('https://test.com:443/foo');
272-
$request->server->set('REQUEST_URI', 'https://test.com:443/foo');
273-
$this->assertEquals('https://test.com/foo', $request->getUri());
274-
$this->assertEquals('/foo', $request->getPathInfo());
275-
$this->assertEquals('test.com', $request->getHost());
276-
$this->assertEquals('test.com', $request->getHttpHost());
277-
$this->assertEquals(443, $request->getPort());
278-
$this->assertTrue($request->isSecure());
259+
public function getRequestUriData()
260+
{
261+
$message = 'Do not modify the path.';
262+
yield array('/foo', '/foo', $message);
263+
yield array('//bar/foo', '//bar/foo', $message);
264+
yield array('///bar/foo', '///bar/foo', $message);
279265

280-
// Fragment should not be included in the URI
281-
$request = Request::create('http://test.com/foo#bar');
282-
$request->server->set('REQUEST_URI', 'http://test.com/foo#bar');
283-
$this->assertEquals('http://test.com/foo', $request->getUri());
266+
$message = 'Handle when the scheme, host are on REQUEST_URI.';
267+
yield array('http://test.com/foo?bar=baz', '/foo?bar=baz', $message);
268+
269+
$message = 'Handle when the scheme, host and port are on REQUEST_URI.';
270+
yield array('http://test.com:80/foo', '/foo', $message);
271+
yield array('https://test.com:8080/foo', '/foo', $message);
272+
yield array('https://test.com:443/foo', '/foo', $message);
273+
274+
$message = 'Fragment should not be included in the URI';
275+
yield array('http://test.com/foo#bar', '/foo', $message);
276+
yield array('/foo#bar', '/foo', $message);
277+
}
278+
279+
public function testGetRequestUriWithoutRequiredHeader()
280+
{
281+
$expected = '';
282+
283+
$request = new Request();
284+
285+
$message = 'Fallback to empty URI when headers are missing.';
286+
$this->assertSame($expected, $request->getRequestUri(), $message);
287+
$this->assertSame($expected, $request->server->get('REQUEST_URI'), 'Normalize the request URI.');
284288
}
285289

286290
public function testCreateCheckPrecedence()

0 commit comments

Comments
 (0)