Commit 300c5a54 by Qiang Xue

Fixes #2825: `Request::getBodyParams()` should correctly parse CONTENT TYPE.

parent 8053082e
...@@ -347,11 +347,19 @@ class Request extends \yii\base\Request ...@@ -347,11 +347,19 @@ class Request extends \yii\base\Request
public function getBodyParams() public function getBodyParams()
{ {
if ($this->_bodyParams === null) { if ($this->_bodyParams === null) {
$contentType = $this->getContentType(); if (isset($_POST[$this->methodParam]) || $this->getMethod() === 'POST') {
if (isset($_POST[$this->methodParam])) {
$this->_bodyParams = $_POST; $this->_bodyParams = $_POST;
unset($this->_bodyParams[$this->methodParam]); unset($this->_bodyParams[$this->methodParam]);
} elseif (isset($this->parsers[$contentType])) { return $this->_bodyParams;
}
$contentType = $this->getContentType();
if (($pos = strpos($contentType, ';')) !== false) {
// e.g. application/json; charset=UTF-8
$contentType = substr($contentType, 0, $pos);
}
if (isset($this->parsers[$contentType])) {
$parser = Yii::createObject($this->parsers[$contentType]); $parser = Yii::createObject($this->parsers[$contentType]);
if (!($parser instanceof RequestParserInterface)) { if (!($parser instanceof RequestParserInterface)) {
throw new InvalidConfigException("The '$contentType' request parser is invalid. It must implement the yii\\web\\RequestParserInterface."); throw new InvalidConfigException("The '$contentType' request parser is invalid. It must implement the yii\\web\\RequestParserInterface.");
...@@ -363,9 +371,6 @@ class Request extends \yii\base\Request ...@@ -363,9 +371,6 @@ class Request extends \yii\base\Request
throw new InvalidConfigException("The fallback request parser is invalid. It must implement the yii\\web\\RequestParserInterface."); throw new InvalidConfigException("The fallback request parser is invalid. It must implement the yii\\web\\RequestParserInterface.");
} }
$this->_bodyParams = $parser->parse($this->getRawBody(), $contentType); $this->_bodyParams = $parser->parse($this->getRawBody(), $contentType);
} elseif ($this->getMethod() === 'POST') {
// PHP has already parsed the body so we have all params in $_POST
$this->_bodyParams = $_POST;
} else { } else {
$this->_bodyParams = []; $this->_bodyParams = [];
mb_parse_str($this->getRawBody(), $this->_bodyParams); mb_parse_str($this->getRawBody(), $this->_bodyParams);
...@@ -976,8 +981,8 @@ class Request extends \yii\base\Request ...@@ -976,8 +981,8 @@ class Request extends \yii\base\Request
{ {
if (isset($_SERVER["CONTENT_TYPE"])) { if (isset($_SERVER["CONTENT_TYPE"])) {
return $_SERVER["CONTENT_TYPE"]; return $_SERVER["CONTENT_TYPE"];
} elseif (isset($_SERVER["HTTP_CONTENT_TYPE"])) { //fix bug https://bugs.php.net/bug.php?id=66606 } elseif (isset($_SERVER["HTTP_CONTENT_TYPE"])) {
//fix bug https://bugs.php.net/bug.php?id=66606
return $_SERVER["HTTP_CONTENT_TYPE"]; return $_SERVER["HTTP_CONTENT_TYPE"];
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment