summaryrefslogtreecommitdiffstats
path: root/library/Icinga/Web/Request.php
blob: 064ce6335a797fa3aa5bdbe23bce45977ee6f7e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?php
/* Icinga Web 2 | (c) 2013 Icinga Development Team | GPLv2+ */

namespace Icinga\Web;

use Icinga\Util\Json;
use Zend_Controller_Request_Http;
use Icinga\Application\Icinga;
use Icinga\User;

/**
 * A request
 */
class Request extends Zend_Controller_Request_Http
{
    /**
     * Response
     *
     * @var Response
     */
    protected $response;

    /**
     * Unique identifier
     *
     * @var string
     */
    protected $uniqueId;

    /**
     * Request URL
     *
     * @var Url
     */
    protected $url;

    /**
     * User if authenticated
     *
     * @var User|null
     */
    protected $user;

    /**
     * Get the response
     *
     * @return Response
     */
    public function getResponse()
    {
        if ($this->response === null) {
            $this->response = Icinga::app()->getResponse();
        }

        return $this->response;
    }

    /**
     * Get the request URL
     *
     * @return Url
     */
    public function getUrl()
    {
        if ($this->url === null) {
            $this->url = Url::fromRequest($this);
        }
        return $this->url;
    }

    /**
     * Get the user if authenticated
     *
     * @return User|null
     */
    public function getUser()
    {
        return $this->user;
    }

    /**
     * Set the authenticated user
     *
     * @param   User $user
     *
     * @return  $this
     */
    public function setUser(User $user)
    {
        $this->user = $user;
        return $this;
    }

    /**
     * Get whether the request seems to be an API request
     *
     * @return bool
     */
    public function isApiRequest()
    {
        return $this->getHeader('Accept') === 'application/json';
    }

    /**
     * Makes an ID unique to this request, to prevent id collisions in different containers
     *
     * Call this whenever an ID might show up multiple times in different containers. This function is useful
     * for ensuring unique ids on sites, even if we combine the HTML of different requests into one site,
     * while still being able to reference elements uniquely in the same request.
     *
     * @param   string  $id
     *
     * @return  string  The id suffixed w/ an identifier unique to this request
     */
    public function protectId($id)
    {
        return $id . '-' . Window::getInstance()->getContainerId();
    }

    public function getPost($key = null, $default = null)
    {
        if ($key === null && $this->extractMediaType($this->getHeader('Content-Type')) === 'application/json') {
            return Json::decode(file_get_contents('php://input'), true);
        }

        return parent::getPost($key, $default);
    }

    /**
     * Extract and return the media type from the given header value
     *
     * @param   string  $headerValue
     *
     * @return  string
     */
    protected function extractMediaType($headerValue)
    {
        // Pretty basic and does not care about parameters
        $parts = explode(';', $headerValue, 2);
        return strtolower(trim($parts[0]));
    }
}