Issues (902)

framework/web/JsonParser.php (1 issue)

Labels
Severity
1
<?php
2
/**
3
 * @link https://www.yiiframework.com/
4
 * @copyright Copyright (c) 2008 Yii Software LLC
5
 * @license https://www.yiiframework.com/license/
6
 */
7
8
namespace yii\web;
9
10
use yii\base\InvalidArgumentException;
11
use yii\helpers\Json;
12
13
/**
14
 * Parses a raw HTTP request using [[\yii\helpers\Json::decode()]].
15
 *
16
 * To enable parsing for JSON requests you can configure [[Request::parsers]] using this class:
17
 *
18
 * ```php
19
 * 'request' => [
20
 *     'parsers' => [
21
 *         'application/json' => 'yii\web\JsonParser',
22
 *     ]
23
 * ]
24
 * ```
25
 *
26
 * @author Dan Schmidt <[email protected]>
27
 * @since 2.0
28
 */
29
class JsonParser implements RequestParserInterface
30
{
31
    /**
32
     * @var bool whether to return objects in terms of associative arrays.
33
     */
34
    public $asArray = true;
35
    /**
36
     * @var bool whether to throw a [[BadRequestHttpException]] if the body is invalid JSON
37
     */
38
    public $throwException = true;
39
40
41
    /**
42
     * Parses a HTTP request body.
43
     * @param string $rawBody the raw HTTP request body.
44
     * @param string $contentType the content type specified for the request body.
45
     * @return array|\stdClass parameters parsed from the request body
46
     * @throws BadRequestHttpException if the body contains invalid json and [[throwException]] is `true`.
47
     */
48 2
    public function parse($rawBody, $contentType)
49
    {
50
        // converts JSONP to JSON
51 2
        if (strpos($contentType, 'application/javascript') !== false) {
52 1
            $rawBody = preg_filter('/(^[^{]+|[^}]+$)/', '', $rawBody);
53
        }
54
55
        try {
56 2
            $parameters = Json::decode($rawBody, $this->asArray);
0 ignored issues
show
It seems like $rawBody can also be of type array; however, parameter $json of yii\helpers\BaseJson::decode() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

56
            $parameters = Json::decode(/** @scrutinizer ignore-type */ $rawBody, $this->asArray);
Loading history...
57 2
            return $parameters === null ? [] : $parameters;
58
        } catch (InvalidArgumentException $e) {
59
            if ($this->throwException) {
60
                throw new BadRequestHttpException('Invalid JSON data in request body: ' . $e->getMessage());
61
            }
62
63
            return [];
64
        }
65
    }
66
}
67