[HttpFoundation] fixed Request::create() when using HTTPS and getUri()/getPathForUri() when script name should be removed.
Original explanation from pull request: I'm Using symfony2 with URL Rewriting to 'hide' index.php. On form authentication, symfony2 redirect to http://host:port/index.php/login_path instead of http://host:port/login_path. I do understand that, in my case, redirect is set into one of : FormAuthenticationEntryPoint with getUriForPath() FormAuthenticationListener with getUriForPath() Security/Firewal/ExceptionListener with getUri() This path modify getUri and getUriForPath to : remove default port from URI remove script name if not initially present
This commit is contained in:
parent
30f231deaf
commit
e6d0385778
@ -148,10 +148,20 @@ class Request
|
||||
|
||||
$components = parse_url($uri);
|
||||
if (isset($components['host'])) {
|
||||
$defaults['SERVER_NAME'] = $components['host'];
|
||||
$defaults['HTTP_HOST'] = $components['host'];
|
||||
}
|
||||
|
||||
if (isset($components['scheme'])) {
|
||||
if ('https' === $components['scheme']) {
|
||||
$defaults['HTTPS'] = 'on';
|
||||
$defaults['SERVER_PORT'] = 443;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($components['port'])) {
|
||||
$defaults['SERVER_PORT'] = $components['port'];
|
||||
$defaults['HTTP_HOST'] = $defaults['HTTP_HOST'].':'.$components['port'];
|
||||
}
|
||||
|
||||
if (in_array(strtoupper($method), array('POST', 'PUT', 'DELETE'))) {
|
||||
@ -421,7 +431,7 @@ class Request
|
||||
$qs = '?'.$qs;
|
||||
}
|
||||
|
||||
return $this->getScheme().'://'.$this->getHost().':'.$this->getPort().$this->getScriptName().$this->getPathInfo().$qs;
|
||||
return $this->getScheme().'://'.$this->getHttpHost().$this->getBaseUrl().$this->getPathInfo().$qs;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -433,7 +443,7 @@ class Request
|
||||
*/
|
||||
public function getUriForPath($path)
|
||||
{
|
||||
return $this->getScheme().'://'.$this->getHost().':'.$this->getPort().$this->getScriptName().$path;
|
||||
return $this->getScheme().'://'.$this->getHttpHost().$this->getBaseUrl().$path;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -50,15 +50,27 @@ class RequestTest extends \PHPUnit_Framework_TestCase
|
||||
public function testCreate()
|
||||
{
|
||||
$request = Request::create('http://test.com/foo?bar=baz');
|
||||
$this->assertEquals('http://test.com:80/foo?bar=baz', $request->getUri());
|
||||
$this->assertEquals('http://test.com/foo?bar=baz', $request->getUri());
|
||||
$this->assertEquals('/foo', $request->getPathInfo());
|
||||
$this->assertEquals('bar=baz', $request->getQueryString());
|
||||
|
||||
$request = Request::create('https://test.com/foo?bar=baz');
|
||||
$this->assertEquals('https://test.com/foo?bar=baz', $request->getUri());
|
||||
$this->assertEquals('/foo', $request->getPathInfo());
|
||||
$this->assertEquals('bar=baz', $request->getQueryString());
|
||||
$this->assertEquals(443, $request->getPort());
|
||||
|
||||
$request = Request::create('test.com:90/foo');
|
||||
$this->assertEquals('http://test.com:90/foo', $request->getUri());
|
||||
$this->assertEquals('/foo', $request->getPathInfo());
|
||||
$this->assertEquals('test.com', $request->getHost());
|
||||
$this->assertEquals(90, $request->getPort());
|
||||
|
||||
$request = Request::create('https://test.com:90/foo');
|
||||
$this->assertEquals('https://test.com:90/foo', $request->getUri());
|
||||
$this->assertEquals('/foo', $request->getPathInfo());
|
||||
$this->assertEquals('test.com', $request->getHost());
|
||||
$this->assertEquals(90, $request->getPort());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -97,6 +109,192 @@ class RequestTest extends \PHPUnit_Framework_TestCase
|
||||
$this->assertEquals('js', $request->getFormat('text/javascript'), '->getFormat() returns correct format when format have multiple mime-type (last)');
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers Symfony\Component\HttpFoundation\Request::getUri
|
||||
*/
|
||||
public function testGetUri()
|
||||
{
|
||||
$server = array();
|
||||
|
||||
// Standard Request on non default PORT
|
||||
// http://hostname:8080/index.php/path/info?query=string
|
||||
|
||||
$server['HTTP_HOST'] = 'hostname:8080';
|
||||
$server['SERVER_NAME'] = 'hostname';
|
||||
$server['SERVER_PORT'] = '8080';
|
||||
|
||||
$server['QUERY_STRING'] = 'query=string';
|
||||
$server['REQUEST_URI'] = '/index.php/path/info?query=string';
|
||||
$server['SCRIPT_NAME'] = '/index.php';
|
||||
$server['PATH_INFO'] = '/path/info';
|
||||
$server['PATH_TRANSLATED'] = 'redirect:/index.php/path/info';
|
||||
$server['PHP_SELF'] = '/index_dev.php/path/info';
|
||||
$server['SCRIPT_FILENAME'] = '/some/where/index.php';
|
||||
|
||||
$request = new Request();
|
||||
|
||||
$request->initialize(null, null, null, null, null,$server);
|
||||
|
||||
$this->assertEquals('http://hostname:8080/index.php/path/info?query=string', $request->getUri(), '->getUri() with non default port');
|
||||
|
||||
// Use std port number
|
||||
$server['HTTP_HOST'] = 'hostname';
|
||||
$server['SERVER_NAME'] = 'hostname';
|
||||
$server['SERVER_PORT'] = '80';
|
||||
|
||||
$request->initialize(null, null, null, null, null, $server);
|
||||
|
||||
$this->assertEquals('http://hostname/index.php/path/info?query=string', $request->getUri(), '->getUri() with default port');
|
||||
|
||||
// Without HOST HEADER
|
||||
unset($server['HTTP_HOST']);
|
||||
$server['SERVER_NAME'] = 'hostname';
|
||||
$server['SERVER_PORT'] = '80';
|
||||
|
||||
$request->initialize(null, null, null, null, null, $server);
|
||||
|
||||
$this->assertEquals('http://hostname/index.php/path/info?query=string', $request->getUri(), '->getUri() with default port without HOST_HEADER');
|
||||
|
||||
// Request with URL REWRITING (hide index.php)
|
||||
// RewriteCond %{REQUEST_FILENAME} !-f
|
||||
// RewriteRule ^(.*)$ index.php [QSA,L]
|
||||
// http://hostname:8080/path/info?query=string
|
||||
$server = array();
|
||||
$server['HTTP_HOST'] = 'hostname:8080';
|
||||
$server['SERVER_NAME'] = 'hostname';
|
||||
$server['SERVER_PORT'] = '8080';
|
||||
|
||||
$server['REDIRECT_QUERY_STRING'] = 'query=string';
|
||||
$server['REDIRECT_URL'] = '/path/info';
|
||||
$server['SCRIPT_NAME'] = '/index.php';
|
||||
$server['QUERY_STRING'] = 'query=string';
|
||||
$server['REQUEST_URI'] = '/path/info?toto=test&1=1';
|
||||
$server['SCRIPT_NAME'] = '/index.php';
|
||||
$server['PHP_SELF'] = '/index.php';
|
||||
$server['SCRIPT_FILENAME'] = '/some/where/index.php';
|
||||
|
||||
$request->initialize(null, null, null, null, null, $server);
|
||||
$this->assertEquals('http://hostname:8080/path/info?query=string', $request->getUri(), '->getUri() with rewrite');
|
||||
|
||||
// Use std port number
|
||||
// http://hostname/path/info?query=string
|
||||
$server['HTTP_HOST'] = 'hostname';
|
||||
$server['SERVER_NAME'] = 'hostname';
|
||||
$server['SERVER_PORT'] = '80';
|
||||
|
||||
$request->initialize(null, null, null, null, null, $server);
|
||||
|
||||
$this->assertEquals('http://hostname/path/info?query=string', $request->getUri(), '->getUri() with rewrite and default port');
|
||||
|
||||
// Without HOST HEADER
|
||||
unset($server['HTTP_HOST']);
|
||||
$server['SERVER_NAME'] = 'hostname';
|
||||
$server['SERVER_PORT'] = '80';
|
||||
|
||||
$request->initialize(null, null, null, null, null, $server);
|
||||
|
||||
$this->assertEquals('http://hostname/path/info?query=string', $request->getUri(), '->getUri() with rewrite, default port without HOST_HEADER');
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers Symfony\Component\HttpFoundation\Request::getUriForPath
|
||||
*/
|
||||
public function testGetUriForPath()
|
||||
{
|
||||
$request = Request::create('http://test.com/foo?bar=baz');
|
||||
$this->assertEquals('http://test.com/some/path', $request->getUriForPath('/some/path'));
|
||||
|
||||
$request = Request::create('http://test.com:90/foo?bar=baz');
|
||||
$this->assertEquals('http://test.com:90/some/path', $request->getUriForPath('/some/path'));
|
||||
|
||||
$request = Request::create('https://test.com/foo?bar=baz');
|
||||
$this->assertEquals('https://test.com/some/path', $request->getUriForPath('/some/path'));
|
||||
|
||||
$request = Request::create('https://test.com:90/foo?bar=baz');
|
||||
$this->assertEquals('https://test.com:90/some/path', $request->getUriForPath('/some/path'));
|
||||
|
||||
$server = array();
|
||||
|
||||
// Standard Request on non default PORT
|
||||
// http://hostname:8080/index.php/path/info?query=string
|
||||
|
||||
$server['HTTP_HOST'] = 'hostname:8080';
|
||||
$server['SERVER_NAME'] = 'hostname';
|
||||
$server['SERVER_PORT'] = '8080';
|
||||
|
||||
$server['QUERY_STRING'] = 'query=string';
|
||||
$server['REQUEST_URI'] = '/index.php/path/info?query=string';
|
||||
$server['SCRIPT_NAME'] = '/index.php';
|
||||
$server['PATH_INFO'] = '/path/info';
|
||||
$server['PATH_TRANSLATED'] = 'redirect:/index.php/path/info';
|
||||
$server['PHP_SELF'] = '/index_dev.php/path/info';
|
||||
$server['SCRIPT_FILENAME'] = '/some/where/index.php';
|
||||
|
||||
$request = new Request();
|
||||
|
||||
$request->initialize(null, null, null, null, null,$server);
|
||||
|
||||
$this->assertEquals('http://hostname:8080/index.php/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with non default port');
|
||||
|
||||
// Use std port number
|
||||
$server['HTTP_HOST'] = 'hostname';
|
||||
$server['SERVER_NAME'] = 'hostname';
|
||||
$server['SERVER_PORT'] = '80';
|
||||
|
||||
$request->initialize(null, null, null, null, null, $server);
|
||||
|
||||
$this->assertEquals('http://hostname/index.php/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with default port');
|
||||
|
||||
// Without HOST HEADER
|
||||
unset($server['HTTP_HOST']);
|
||||
$server['SERVER_NAME'] = 'hostname';
|
||||
$server['SERVER_PORT'] = '80';
|
||||
|
||||
$request->initialize(null, null, null, null, null, $server);
|
||||
|
||||
$this->assertEquals('http://hostname/index.php/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with default port without HOST_HEADER');
|
||||
|
||||
// Request with URL REWRITING (hide index.php)
|
||||
// RewriteCond %{REQUEST_FILENAME} !-f
|
||||
// RewriteRule ^(.*)$ index.php [QSA,L]
|
||||
// http://hostname:8080/path/info?query=string
|
||||
$server = array();
|
||||
$server['HTTP_HOST'] = 'hostname:8080';
|
||||
$server['SERVER_NAME'] = 'hostname';
|
||||
$server['SERVER_PORT'] = '8080';
|
||||
|
||||
$server['REDIRECT_QUERY_STRING'] = 'query=string';
|
||||
$server['REDIRECT_URL'] = '/path/info';
|
||||
$server['SCRIPT_NAME'] = '/index.php';
|
||||
$server['QUERY_STRING'] = 'query=string';
|
||||
$server['REQUEST_URI'] = '/path/info?toto=test&1=1';
|
||||
$server['SCRIPT_NAME'] = '/index.php';
|
||||
$server['PHP_SELF'] = '/index.php';
|
||||
$server['SCRIPT_FILENAME'] = '/some/where/index.php';
|
||||
|
||||
$request->initialize(null, null, null, null, null, $server);
|
||||
$this->assertEquals('http://hostname:8080/some/path', $request->getUriForPath('/some/path'), '->getUri() with rewrite');
|
||||
|
||||
// Use std port number
|
||||
// http://hostname/path/info?query=string
|
||||
$server['HTTP_HOST'] = 'hostname';
|
||||
$server['SERVER_NAME'] = 'hostname';
|
||||
$server['SERVER_PORT'] = '80';
|
||||
|
||||
$request->initialize(null, null, null, null, null, $server);
|
||||
|
||||
$this->assertEquals('http://hostname/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with rewrite and default port');
|
||||
|
||||
// Without HOST HEADER
|
||||
unset($server['HTTP_HOST']);
|
||||
$server['SERVER_NAME'] = 'hostname';
|
||||
$server['SERVER_PORT'] = '80';
|
||||
|
||||
$request->initialize(null, null, null, null, null, $server);
|
||||
|
||||
$this->assertEquals('http://hostname/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with rewrite, default port without HOST_HEADER');
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers Symfony\Component\HttpFoundation\Request::getQueryString
|
||||
*/
|
||||
|
@ -593,7 +593,7 @@ class CacheTest extends CacheTestCase
|
||||
$tmp = unserialize($values[0]);
|
||||
$time = \DateTime::createFromFormat('U', time());
|
||||
$tmp[0][1]['expires'] = $time->format(DATE_RFC2822);
|
||||
$this->store->save('md'.sha1('http://localhost:80/'), serialize($tmp));
|
||||
$this->store->save('md'.sha1('http://localhost/'), serialize($tmp));
|
||||
|
||||
// build subsequent request; should be found but miss due to freshness
|
||||
$this->request('GET', '/');
|
||||
|
Reference in New Issue
Block a user