headerVerbs::post()   A
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 18
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 11
c 0
b 0
f 0
nc 2
nop 0
dl 0
loc 18
rs 9.9
1
<?php
2
/**
3
 * ==================================
4
 * Responsible PHP API
5
 * ==================================
6
 *
7
 * @link Git https://github.com/vince-scarpa/responsibleAPI.git
8
 *
9
 * @api Responible API
10
 * @package responsible\core\headers
11
 *
12
 * @author Vince scarpa <[email protected]>
13
 *
14
 */
15
namespace responsible\core\headers;
16
17
use responsible\core\helpers\help as helper;
18
19
class headerVerbs extends header
20
{
21
    /**
22
     * [$contentType Requested content type]
23
     * @var array
24
     */
25
    private static $contentType = [
26
        'name' => '',
27
        'type' => ''
28
    ];
29
30
    /**
31
     * [__construct]
32
     */
33
    public function __construct()
34
    {
35
        self::setContentType();
36
    }
37
38
    /**
39
     * [get GET request method]
40
     * @return array
41
     */
42
    public function get(): array
43
    {
44
        $_GET = ($_GET) ?? [];
45
        return [
46
            'method' => 'get',
47
            'data' => $_GET,
48
        ];
49
    }
50
51
    /**
52
     * [post POST request method]
53
     * @return array
54
     */
55
    public function post(): array
56
    {
57
        $_postData = ($_POST) ?? [];
58
59
        $jsonData = json_decode(file_get_contents("php://input"));
60
61
        if (is_object($jsonData) || is_array($jsonData)) {
62
            $_postData = json_decode(file_get_contents("php://input"), true);
63
        }
64
        $_POST = array_merge($_REQUEST, $_POST);
65
        $_REQUEST = array_merge($_POST, $_postData);
66
67
        $_GET = $this->get()['data'];
68
        $_REQUEST = array_merge($_GET, $_REQUEST);
69
70
        return [
71
            'method' => 'post',
72
            'data' => $_REQUEST,
73
        ];
74
    }
75
76
    /**
77
     * [options OPTIONS CORS request]
78
     * @return array
79
     */
80
    public function options(): array
81
    {
82
        return $this->post();
83
    }
84
85
    /**
86
     * [post PUT request method]
87
     * @return array
88
     */
89
    public function put(): array
90
    {
91
        $_PUT = [];
92
93
        if (self::getContentType()['type'] === 'json') {
0 ignored issues
show
Bug Best Practice introduced by
The method responsible\core\headers...Verbs::getContentType() is not static, but was called statically. ( Ignorable by Annotation )

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

93
        if (self::/** @scrutinizer ignore-call */ getContentType()['type'] === 'json') {
Loading history...
94
            $putfp = fopen('php://input', 'r');
95
            $putdata = '';
96
            while ($data = fread($putfp, 1024)) {
97
                $putdata .= $data;
98
            }
99
            fclose($putfp);
100
101
            if (!empty($putdata)) {
102
                $_PUT = json_decode($putdata, true);
103
                if (json_last_error() !== 0) {
104
                    $_PUT = [];
105
                }
106
            }
107
108
        } else {
109
            parse_str(file_get_contents("php://input"), $_PUT);
110
            foreach ($_PUT as $key => $value) {
111
                unset($_PUT[$key]);
112
                $_PUT[str_replace('amp;', '', $key)] = $value;
113
            }
114
        }
115
116
        // [TODO]
117
        if (self::getContentType()['name'] === 'multipart/form-data') {
118
119
        }
120
        if (self::getContentType()['type'] === 'x-www-form-urlencoded') {
121
122
        }
123
124
        $_REQUEST = array_merge($_REQUEST, $_PUT);
125
        $_REQUEST = array_merge($_POST, $this->post()['data']);
126
        $_REQUEST = array_merge($this->get()['data'], $_REQUEST);
127
128
        return [
129
            'method' => 'put',
130
            'data' => $_REQUEST,
131
        ];
132
    }
133
134
    /**
135
     * [post DELETE request method]
136
     * @return array
137
     */
138
    public function delete()
139
    {
140
        return ['method' => 'delete', 'data' => $this->get()['data']];
141
    }
142
143
    /**
144
     * [post PATCH request method]
145
     * @return array
146
     */
147
    public function patch()
148
    {
149
        return ['method' => 'patch', 'data' => $this->put()['data']];
150
    }
151
152
    /**
153
     * [getRequestVerb Get the requested method/ verb]
154
     * @return string
155
     */
156
    public static function getRequestVerb():string
157
    {
158
        $helper = new helper;
159
        $method = $helper->checkVal(@$_SERVER, 'REQUEST_METHOD', '' );
160
        $method = $helper->checkVal(@$_SERVER, 'HTTP_X_HTTP_METHOD', $method );
161
162
        return strtolower($method);
163
    }
164
165
    /**
166
     * [setContentType Set content type]
167
     * @return void
168
     */
169
    public static function setContentType()
170
    {
171
        $helper = new helper;
172
        $contentType = $helper->checkVal(@$_SERVER, 'CONTENT_TYPE', '');
173
        $contentType = $helper->checkVal(@$_SERVER, 'HTTP_CONTENT_TYPE', $contentType);
174
        $contentType = $helper->checkVal(@$_SERVER, 'HTTP_X_CONTENT_TYPE', $contentType);
175
176
        if (empty($contentType)) {
177
            return '';
0 ignored issues
show
Bug Best Practice introduced by
The expression return '' returns the type string which is incompatible with the documented return type void.
Loading history...
178
        }
179
180
        if (preg_match('@multipart/form-data@', $contentType)) {
181
            self::$contentType = [
182
                'name' => 'multipart/form-data',
183
                'type' => 'form-data',
184
            ];
185
            return;
186
        }
187
188
        $contentTypeName = explode('/', $contentType);
189
        $contentTypeName = ($contentTypeName[1]) ?? '';
190
191
        self::$contentType = [
192
            'name' => $contentType,
193
            'type' => $contentTypeName,
194
        ];
195
    }
196
197
    /**
198
     * [getContentType Get the requested content type]
199
     * @return array
200
     */
201
    public function getContentType(): array
202
    {
203
        return self::$contentType;
204
    }
205
}
206