Browse Source

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

tags/2.0.0-beta
Qiang Xue 11 years ago
parent
commit
300c5a549a
  1. 21
      framework/web/Request.php

21
framework/web/Request.php

@ -347,11 +347,19 @@ class Request extends \yii\base\Request
public function getBodyParams()
{
if ($this->_bodyParams === null) {
$contentType = $this->getContentType();
if (isset($_POST[$this->methodParam])) {
if (isset($_POST[$this->methodParam]) || $this->getMethod() === 'POST') {
$this->_bodyParams = $_POST;
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]);
if (!($parser instanceof 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
throw new InvalidConfigException("The fallback request parser is invalid. It must implement the yii\\web\\RequestParserInterface.");
}
$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 {
$this->_bodyParams = [];
mb_parse_str($this->getRawBody(), $this->_bodyParams);
@ -976,8 +981,8 @@ class Request extends \yii\base\Request
{
if (isset($_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"];
}

Loading…
Cancel
Save