8000 bug #29256 [HttpFoundation] Fixed absolute Request URI with default p… · symfony/symfony@0f2d577 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0f2d577

Browse files
committed
bug #29256 [HttpFoundation] Fixed absolute Request URI with default port (thomasbisignani)
This PR was merged into the 3.4 branch. Discussion ---------- [HttpFoundation] Fixed absolute Request URI with default port | Q | A | ------------- | --- | Branch? | 3.4 | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #29234 | License | MIT | Doc PR | This PR fixes the #29234 issue, the request URI with default port was not properly generated. Example : ```php $request = Request::create('http://test.com:80/foo'); $request->server->set('REQUEST_URI', 'http://test.com:80/foo'); ``` Before this fix, the `$request->getUri()` method returned `http://test.com/:80/foo` : ```diff Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'http://test.com/foo' +'http://test.com/:80/foo' ``` Commits ------- cddce2a [HttpFoundation] Fixed absolute Request URI with default port
2 parents 812a878 + cddce2a commit 0f2d577

File tree

2 files changed

+58
-3
lines changed

2 files changed

+58
-3
lines changed

src/Symfony/Component/HttpFoundation/Request.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1836,10 +1836,16 @@ protected function prepareRequestUri()
18361836
$this->server->remove('IIS_WasUrlRewritten');
18371837
} elseif ($this->server->has('REQUEST_URI')) {
18381838
$requestUri = $this->server->get('REQUEST_URI');
1839+
18391840
// HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path, only use URL path
1840-
$schemeAndHttpHost = $this->getSchemeAndHttpHost();
1841-
if (0 === strpos($requestUri, $schemeAndHttpHost)) {
1842-
$requestUri = substr($requestUri, \strlen($schemeAndHttpHost));
1841+
$uriComponents = parse_url($requestUri);
1842+
1843+
if (isset($uriComponents['path'])) {
1844+
$requestUri = $uriComponents['path'];
1845+
}
1846+
1847+
if (isset($uriComponents['query'])) {
1848+
$requestUri .= '?'.$uriComponents['query'];
18431849
}
18441850
} elseif ($this->server->has('ORIG_PATH_INFO')) {
18451851
// IIS 5.0, PHP as CGI

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,55 @@ public function testCreate()
232232
$this->assertEquals(80, $request->getPort());
233233
$this->assertEquals('test.com', $request->getHttpHost());
234234
$this->assertFalse($request->isSecure());
235+
236+
// Fragment should not be included in the URI
237+
$request = Request::create('http://test.com/foo#bar');
238+
$this->assertEquals('http://test.com/foo', $request->getUri());
239+
}
240+
241+
public function testCreateWithRequestUri()
242+
{
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());
251+
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());
260+
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());
270+
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());
279+
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());
235284
}
236285

237286
public function testCreateCheckPrecedence()

0 commit comments

Comments
 (0)
0