mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-02 13:02:24 +08:00
Fixes #10451: Check of existence of $_SERVER in \yii\web\Request before using it
This commit is contained in:
committed by
Alexander Makarov
parent
1ec972fbf7
commit
7b46bd1f7c
@ -4,6 +4,7 @@ Yii Framework 2 Change Log
|
||||
2.0.8 under development
|
||||
-----------------------
|
||||
|
||||
- Enh #10451: Check of existence of `$_SERVER` in `\yii\web\Request` before using it (quantum13)
|
||||
- Enh #10610: Added `BaseUrl::$urlManager` to be able to set URL manager used for creating URLs (samdark)
|
||||
- Enh #10764: `yii\helpers\Html::tag()` and `::beginTag()` return content without any HTML when the `$tag` attribute is `false` or `null` (pana1990)
|
||||
|
||||
|
||||
@ -42,7 +42,7 @@ use yii\helpers\StringHelper;
|
||||
* @property array $eTags The entity tags. This property is read-only.
|
||||
* @property HeaderCollection $headers The header collection. This property is read-only.
|
||||
* @property string $hostInfo Schema and hostname part (with port number if needed) of the request URL (e.g.
|
||||
* `http://www.yiiframework.com`).
|
||||
* `http://www.yiiframework.com`), null in case it can't be obtained from `$_SERVER` and wasn't set.
|
||||
* @property boolean $isAjax Whether this is an AJAX (XMLHttpRequest) request. This property is read-only.
|
||||
* @property boolean $isDelete Whether this is a DELETE request. This property is read-only.
|
||||
* @property boolean $isFlash Whether this is an Adobe Flash or Adobe Flex request. This property is
|
||||
@ -69,8 +69,8 @@ use yii\helpers\StringHelper;
|
||||
* @property string $scriptFile The entry script file path.
|
||||
* @property string $scriptUrl The relative URL of the entry script.
|
||||
* @property integer $securePort Port number for secure requests.
|
||||
* @property string $serverName Server name. This property is read-only.
|
||||
* @property integer $serverPort Server port number. This property is read-only.
|
||||
* @property string $serverName Server name, null if not available. This property is read-only.
|
||||
* @property integer $serverPort Server port number, null if not available. This property is read-only.
|
||||
* @property string $url The currently requested relative URL. Note that the URI returned is URL-encoded.
|
||||
* @property string $userAgent User agent, null if not present. This property is read-only.
|
||||
* @property string $userHost User host name, null if cannot be determined. This property is read-only.
|
||||
@ -526,7 +526,8 @@ class Request extends \yii\base\Request
|
||||
* The returned URL does not have an ending slash.
|
||||
* By default this is determined based on the user request information.
|
||||
* You may explicitly specify it by setting the [[setHostInfo()|hostInfo]] property.
|
||||
* @return string schema and hostname part (with port number if needed) of the request URL (e.g. `http://www.yiiframework.com`)
|
||||
* @return string schema and hostname part (with port number if needed) of the request URL (e.g. `http://www.yiiframework.com`),
|
||||
* null if can't be obtained from `$_SERVER` and wasn't set.
|
||||
* @see setHostInfo()
|
||||
*/
|
||||
public function getHostInfo()
|
||||
@ -536,7 +537,7 @@ class Request extends \yii\base\Request
|
||||
$http = $secure ? 'https' : 'http';
|
||||
if (isset($_SERVER['HTTP_HOST'])) {
|
||||
$this->_hostInfo = $http . '://' . $_SERVER['HTTP_HOST'];
|
||||
} else {
|
||||
} elseif (isset($_SERVER['SERVER_NAME'])) {
|
||||
$this->_hostInfo = $http . '://' . $_SERVER['SERVER_NAME'];
|
||||
$port = $secure ? $this->getSecurePort() : $this->getPort();
|
||||
if (($port !== 80 && !$secure) || ($port !== 443 && $secure)) {
|
||||
@ -601,13 +602,13 @@ class Request extends \yii\base\Request
|
||||
if ($this->_scriptUrl === null) {
|
||||
$scriptFile = $this->getScriptFile();
|
||||
$scriptName = basename($scriptFile);
|
||||
if (basename($_SERVER['SCRIPT_NAME']) === $scriptName) {
|
||||
if (isset($_SERVER['SCRIPT_NAME']) && basename($_SERVER['SCRIPT_NAME']) === $scriptName) {
|
||||
$this->_scriptUrl = $_SERVER['SCRIPT_NAME'];
|
||||
} elseif (basename($_SERVER['PHP_SELF']) === $scriptName) {
|
||||
} elseif (isset($_SERVER['PHP_SELF']) && basename($_SERVER['PHP_SELF']) === $scriptName) {
|
||||
$this->_scriptUrl = $_SERVER['PHP_SELF'];
|
||||
} elseif (isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $scriptName) {
|
||||
$this->_scriptUrl = $_SERVER['ORIG_SCRIPT_NAME'];
|
||||
} elseif (($pos = strpos($_SERVER['PHP_SELF'], '/' . $scriptName)) !== false) {
|
||||
} elseif (isset($_SERVER['PHP_SELF']) && ($pos = strpos($_SERVER['PHP_SELF'], '/' . $scriptName)) !== false) {
|
||||
$this->_scriptUrl = substr($_SERVER['SCRIPT_NAME'], 0, $pos) . '/' . $scriptName;
|
||||
} elseif (!empty($_SERVER['DOCUMENT_ROOT']) && strpos($scriptFile, $_SERVER['DOCUMENT_ROOT']) === 0) {
|
||||
$this->_scriptUrl = str_replace('\\', '/', str_replace($_SERVER['DOCUMENT_ROOT'], '', $scriptFile));
|
||||
@ -636,10 +637,17 @@ class Request extends \yii\base\Request
|
||||
* Returns the entry script file path.
|
||||
* The default implementation will simply return `$_SERVER['SCRIPT_FILENAME']`.
|
||||
* @return string the entry script file path
|
||||
* @throws InvalidConfigException
|
||||
*/
|
||||
public function getScriptFile()
|
||||
{
|
||||
return isset($this->_scriptFile) ? $this->_scriptFile : $_SERVER['SCRIPT_FILENAME'];
|
||||
if (isset($this->_scriptFile)) {
|
||||
return $this->_scriptFile;
|
||||
} elseif (isset($_SERVER['SCRIPT_FILENAME'])) {
|
||||
return $_SERVER['SCRIPT_FILENAME'];
|
||||
} else {
|
||||
throw new InvalidConfigException('Unable to determine the entry script file path.');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -825,25 +833,25 @@ class Request extends \yii\base\Request
|
||||
|
||||
/**
|
||||
* Returns the server name.
|
||||
* @return string server name
|
||||
* @return string server name, null if not available
|
||||
*/
|
||||
public function getServerName()
|
||||
{
|
||||
return $_SERVER['SERVER_NAME'];
|
||||
return isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the server port number.
|
||||
* @return integer server port number
|
||||
* @return integer server port number, null if not available
|
||||
*/
|
||||
public function getServerPort()
|
||||
{
|
||||
return (int) $_SERVER['SERVER_PORT'];
|
||||
return isset($_SERVER['SERVER_PORT']) ? (int) $_SERVER['SERVER_PORT'] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the URL referrer, null if not present
|
||||
* @return string URL referrer, null if not present
|
||||
* Returns the URL referrer.
|
||||
* @return string URL referrer, null if not available
|
||||
*/
|
||||
public function getReferrer()
|
||||
{
|
||||
@ -851,8 +859,8 @@ class Request extends \yii\base\Request
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the user agent, null if not present.
|
||||
* @return string user agent, null if not present
|
||||
* Returns the user agent.
|
||||
* @return string user agent, null if not available
|
||||
*/
|
||||
public function getUserAgent()
|
||||
{
|
||||
@ -861,7 +869,7 @@ class Request extends \yii\base\Request
|
||||
|
||||
/**
|
||||
* Returns the user IP address.
|
||||
* @return string user IP address. Null is returned if the user IP address cannot be detected.
|
||||
* @return string user IP address, null if not available
|
||||
*/
|
||||
public function getUserIP()
|
||||
{
|
||||
@ -869,8 +877,8 @@ class Request extends \yii\base\Request
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the user host name, null if it cannot be determined.
|
||||
* @return string user host name, null if cannot be determined
|
||||
* Returns the user host name.
|
||||
* @return string user host name, null if not available
|
||||
*/
|
||||
public function getUserHost()
|
||||
{
|
||||
|
||||
@ -146,4 +146,59 @@ class RequestTest extends TestCase
|
||||
$this->assertEquals(['post/view', ['id' => 21, 'token' => 'secret']], $result);
|
||||
$this->assertEquals($_GET, ['id' => 63]);
|
||||
}
|
||||
|
||||
public function testGetHostInfo()
|
||||
{
|
||||
$request = new Request();
|
||||
|
||||
unset($_SERVER['SERVER_NAME'], $_SERVER['HTTP_HOST']);
|
||||
$this->assertEquals(null, $request->getHostInfo());
|
||||
|
||||
$request->setHostInfo('http://servername.com:80');
|
||||
$this->assertEquals('http://servername.com:80', $request->getHostInfo());
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \yii\base\InvalidConfigException
|
||||
*/
|
||||
public function testGetScriptFileWithEmptyServer()
|
||||
{
|
||||
$request = new Request();
|
||||
$_SERVER = [];
|
||||
|
||||
$request->getScriptFile();
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \yii\base\InvalidConfigException
|
||||
*/
|
||||
public function testGetScriptUrlWithEmptyServer()
|
||||
{
|
||||
$request = new Request();
|
||||
$_SERVER = [];
|
||||
|
||||
$request->getScriptUrl();
|
||||
}
|
||||
|
||||
public function testGetServerName()
|
||||
{
|
||||
$request = new Request();
|
||||
|
||||
$_SERVER['SERVER_NAME'] = 'servername';
|
||||
$this->assertEquals('servername', $request->getServerName());
|
||||
|
||||
unset($_SERVER['SERVER_NAME']);
|
||||
$this->assertEquals(null, $request->getServerName());
|
||||
}
|
||||
|
||||
public function testGetServerPort()
|
||||
{
|
||||
$request = new Request();
|
||||
|
||||
$_SERVER['SERVER_PORT'] = 33;
|
||||
$this->assertEquals(33, $request->getServerPort());
|
||||
|
||||
unset($_SERVER['SERVER_PORT']);
|
||||
$this->assertEquals(null, $request->getServerPort());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user