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
-------
cddce2af61
[HttpFoundation] Fixed absolute Request URI with default port
This commit is contained in:
commit
0f2d577ebd
@ -1836,10 +1836,16 @@ class Request
|
|||||||
$this->server->remove('IIS_WasUrlRewritten');
|
$this->server->remove('IIS_WasUrlRewritten');
|
||||||
} elseif ($this->server->has('REQUEST_URI')) {
|
} elseif ($this->server->has('REQUEST_URI')) {
|
||||||
$requestUri = $this->server->get('REQUEST_URI');
|
$requestUri = $this->server->get('REQUEST_URI');
|
||||||
|
|
||||||
// HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path, only use URL path
|
// HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path, only use URL path
|
||||||
$schemeAndHttpHost = $this->getSchemeAndHttpHost();
|
$uriComponents = parse_url($requestUri);
|
||||||
if (0 === strpos($requestUri, $schemeAndHttpHost)) {
|
|
||||||
$requestUri = substr($requestUri, \strlen($schemeAndHttpHost));
|
if (isset($uriComponents['path'])) {
|
||||||
|
$requestUri = $uriComponents['path'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($uriComponents['query'])) {
|
||||||
|
$requestUri .= '?'.$uriComponents['query'];
|
||||||
}
|
}
|
||||||
} elseif ($this->server->has('ORIG_PATH_INFO')) {
|
} elseif ($this->server->has('ORIG_PATH_INFO')) {
|
||||||
// IIS 5.0, PHP as CGI
|
// IIS 5.0, PHP as CGI
|
||||||
|
@ -232,6 +232,55 @@ class RequestTest extends TestCase
|
|||||||
$this->assertEquals(80, $request->getPort());
|
$this->assertEquals(80, $request->getPort());
|
||||||
$this->assertEquals('test.com', $request->getHttpHost());
|
$this->assertEquals('test.com', $request->getHttpHost());
|
||||||
$this->assertFalse($request->isSecure());
|
$this->assertFalse($request->isSecure());
|
||||||
|
|
||||||
|
// Fragment should not be included in the URI
|
||||||
|
$request = Request::create('http://test.com/foo#bar');
|
||||||
|
$this->assertEquals('http://test.com/foo', $request->getUri());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCreateWithRequestUri()
|
||||||
|
{
|
||||||
|
$request = Request::create('http://test.com:80/foo');
|
||||||
|
$request->server->set('REQUEST_URI', 'http://test.com:80/foo');
|
||||||
|
$this->assertEquals('http://test.com/foo', $request->getUri());
|
||||||
|
$this->assertEquals('/foo', $request->getPathInfo());
|
||||||
|
$this->assertEquals('test.com', $request->getHost());
|
||||||
|
$this->assertEquals('test.com', $request->getHttpHost());
|
||||||
|
$this->assertEquals(80, $request->getPort());
|
||||||
|
$this->assertFalse($request->isSecure());
|
||||||
|
|
||||||
|
$request = Request::create('http://test.com:8080/foo');
|
||||||
|
$request->server->set('REQUEST_URI', 'http://test.com:8080/foo');
|
||||||
|
$this->assertEquals('http://test.com:8080/foo', $request->getUri());
|
||||||
|
$this->assertEquals('/foo', $request->getPathInfo());
|
||||||
|
$this->assertEquals('test.com', $request->getHost());
|
||||||
|
$this->assertEquals('test.com:8080', $request->getHttpHost());
|
||||||
|
$this->assertEquals(8080, $request->getPort());
|
||||||
|
$this->assertFalse($request->isSecure());
|
||||||
|
|
||||||
|
$request = Request::create('http://test.com/foo?bar=foo', 'GET', array('bar' => 'baz'));
|
||||||
|
$request->server->set('REQUEST_URI', 'http://test.com/foo?bar=foo');
|
||||||
|
$this->assertEquals('http://test.com/foo?bar=baz', $request->getUri());
|
||||||
|
$this->assertEquals('/foo', $request->getPathInfo());
|
||||||
|
$this->assertEquals('bar=baz', $request->getQueryString());
|
||||||
|
$this->assertEquals('test.com', $request->getHost());
|
||||||
|
$this->assertEquals('test.com', $request->getHttpHost());
|
||||||
|
$this->assertEquals(80, $request->getPort());
|
||||||
|
$this->assertFalse($request->isSecure());
|
||||||
|
|
||||||
|
$request = Request::create('https://test.com:443/foo');
|
||||||
|
$request->server->set('REQUEST_URI', 'https://test.com:443/foo');
|
||||||
|
$this->assertEquals('https://test.com/foo', $request->getUri());
|
||||||
|
$this->assertEquals('/foo', $request->getPathInfo());
|
||||||
|
$this->assertEquals('test.com', $request->getHost());
|
||||||
|
$this->assertEquals('test.com', $request->getHttpHost());
|
||||||
|
$this->assertEquals(443, $request->getPort());
|
||||||
|
$this->assertTrue($request->isSecure());
|
||||||
|
|
||||||
|
// Fragment should not be included in the URI
|
||||||
|
$request = Request::create('http://test.com/foo#bar');
|
||||||
|
$request->server->set('REQUEST_URI', 'http://test.com/foo#bar');
|
||||||
|
$this->assertEquals('http://test.com/foo', $request->getUri());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCreateCheckPrecedence()
|
public function testCreateCheckPrecedence()
|
||||||
|
Reference in New Issue
Block a user