1: <?php defined('_JOOS_CORE') or exit();
2:
3: /**
4: * Библиотека работы со входящими пользовательскими данными и информацией
5: *
6: * @version 1.0
7: * @package Core\Libraries
8: * @subpackage Request
9: * @category Libraries
10: * @author Joostina Team <info@joostina.ru>
11: * @copyright (C) 2007-2012 Joostina Team
12: * @license MIT License http://www.opensource.org/licenses/mit-license.php
13: * Информация об авторах и лицензиях стороннего кода в составе Joostina CMS: docs/copyrights
14: *
15: * @todo в mosGetParams была очистка данных. Может, стоит и сюда прикрутить?
16: * joosInputFilter::instance()->process($return)
17: *
18: * */
19: class joosRequest
20: {
21: /**
22: * Получение параметра
23: *
24: * @param string $name название параметра
25: * @param string $default значение для параметра по умолчани
26: * @param array $vars массив переменных из которого необходимо получить параметр $name, по умолчанию используется суперглобальный $_REQUEST
27: *
28: * @return mixed результат, массив или строка
29: *
30: * @todo проанализировать необходимоть проверки наличия с empty (isset($vars[$name]) && !empty( $vars[$name] ) )
31: */
32: public static function param($name, $default = null, $vars = false)
33: {
34: $vars = $vars ? $vars : $_REQUEST;
35:
36: return (isset($vars[$name])) ? $vars[$name] : $default;
37: }
38:
39: /**
40: * Получение параметров из суперглобального массива $_GET
41: *
42: * @param string $name название параметра $name
43: * @param string $default значение для параметра, используемое по умолчанию
44: *
45: * @return mixed результат, массив или строка
46: */
47: public static function get($name, $default = null)
48: {
49: return self::param($name, $default, $_GET);
50: }
51:
52: /**
53: * Получение параметров из суперглобального массива $_POST
54: *
55: * @param string $name название параметра $name
56: * @param string $default значение для параметра, используемое по умолчанию
57: *
58: * @return mixed результат, массив или строка
59: */
60: public static function post($name, $default = null)
61: {
62: return self::param($name, $default, $_POST);
63: }
64:
65: /**
66: * Получение параметров из суперглобального массива $_REQUEST
67: *
68: * @param string $name название параметра $name
69: * @param string $default значение для параметра, используемое по умолчанию
70: *
71: * @return mixed результат, массив или строка
72: */
73: public static function request($name, $default = null)
74: {
75: return self::param($name, $default, $_REQUEST);
76: }
77:
78: /**
79: * Получение параметров загруженного файла из суперглобального массива $_FILES
80: *
81: * @param string $name название параметра $name
82: *
83: * @return mixed массив с информацией о файле, либо FALSE в случае отсутствия данных
84: */
85: public static function file($name)
86: {
87: return self::param($name, false, $_FILES);
88: }
89:
90: /**
91: * Получение параметров из суперглобального массива $_SERVER
92: *
93: * @param string $name название параметра $name
94: * @param string $default значение для параметра, используемое по умолчанию
95: *
96: * @return mixed результат, массив или строка
97: */
98: public static function server($name, $default = null)
99: {
100: return self::param($name, $default, $_SERVER);
101: }
102:
103: /**
104: * Получение параметров из суперглобального массива $_ENV
105: *
106: * @param string $name название параметра $name
107: * @param string $default значение для параметра, используемое по умолчанию
108: *
109: * @return mixed результат, массив или строка
110: */
111: public static function env($name, $default = null)
112: {
113: return self::param($name, $default, $_ENV);
114: }
115:
116: /**
117: * Получение параметров из суперглобального массива $_SESSION
118: *
119: * @param string $name название параметра $name
120: * @param string $default значение для параметра, используемое по умолчанию
121: *
122: * @return mixed результат, массив или строка
123: */
124: public static function session($name, $default = null)
125: {
126: return self::param($name, $default, $_SESSION);
127: }
128:
129: /**
130: * Получение параметров из суперглобального массива $_COOKIE
131: *
132: * @param string $name название параметра $name
133: * @param string $default значение для параметра, используемое по умолчанию
134: *
135: * @return mixed результат, массив или строка
136: */
137: public static function cookies($name, $default = null)
138: {
139: return self::param($name, $default, $_COOKIE);
140: }
141:
142: /**
143: * Получение параметра из заголовков сервера или клиенского браузера
144: *
145: * @param string $name название параметра
146: * @param string $default значение для параметра, используемое по умолчанию
147: *
148: * @return mixed результат, массив или строка, либо false если параметр не обнаружен ( по умолчанию )
149: */
150: public static function header($name, $default = false)
151: {
152: $name_ = 'HTTP_' . strtoupper(str_replace('-', '_', $name));
153: if (isset($_SERVER[$name_])) {
154: return $_SERVER[$name_];
155: }
156:
157: if (function_exists('apache_request_headers')) {
158: $headers = apache_request_headers();
159: if (isset($headers[$name])) {
160: return $headers[$name];
161: }
162: }
163:
164: return $default;
165: }
166:
167: /**
168: * Получение параметра с принудительным приведением к цельночисленному (йифровому) варианту
169: *
170: * @param string $name название параметра
171: * @param string $default значение для параметра по умолчани
172: * @param array $vars массив переменных из которого необходимо получить параметр $name, по умолчанию используется суперглобальный $_REQUEST
173: *
174: * @return mixed результат, массив или строка
175: */
176: public static function int($name = null, $default = null, $vars = null)
177: {
178: return (int) self::param($name, $default, $vars);
179: }
180:
181: /**
182: * Получение массива параметров
183: *
184: * @param string $name название параметра
185: * @param string $default значение для параметра по умолчани
186: * @param array $vars массив переменных из которого необходимо получить параметр $name, по умолчанию используется суперглобальный $_REQUEST
187: *
188: * @return array результат, массив или строка
189: */
190: public static function array_param($name = null, array $default = null, $vars = null)
191: {
192: return (array) self::param($name, $default, $vars);
193: }
194:
195: /**
196: * Получение протокола активного соединения, http или https в случае защищенного соединения
197: * @return string http или https
198: */
199: public static function protocol()
200: {
201: return ('on' == self::server('HTTPS') || 443 == self::server('SERVER_PORT')) ? 'https' : 'http';
202: }
203:
204: /**
205: * Проверка на работу методом GET
206: * @return bool результат проверки
207: */
208: public static function is_get()
209: {
210: return 'GET' === strtoupper(self::server('REQUEST_METHOD'));
211: }
212:
213: /**
214: * Проверка на работу методом POST
215: * @return bool результат проверки
216: */
217: public static function is_post()
218: {
219: return 'POST' == strtoupper(self::server('REQUEST_METHOD'));
220: }
221:
222: /**
223: * Проверка на работу методом PUT
224: * @return bool результат проверки
225: */
226: public static function is_put()
227: {
228: return 'PUT' == strtoupper(self::server('REQUEST_METHOD'));
229: }
230:
231: /**
232: * Проверка на работу методом DELETE
233: * @return bool результат проверки
234: */
235: public static function is_delete()
236: {
237: return 'DELETE' == strtoupper(self::server('REQUEST_METHOD'));
238: }
239:
240: /**
241: * Проверка работы через Ajax-соединение
242: * @return bool результат проверки
243: */
244: public static function is_ajax()
245: {
246: return 'xmlhttprequest' == strtolower(self::header('X_REQUESTED_WITH'));
247: }
248:
249: /**
250: * Проверка работы через через безопасное https соединение
251: * @return bool результат проверки
252: */
253: public static function is_https()
254: {
255: return 'https' == self::protocol();
256: }
257:
258: /**
259: * Получение IP адреса активного пользователя
260: * @return string IP адрес пользователя, либо FALSE в случае если IP адрес не получен
261: */
262: public static function user_ip()
263: {
264: $keys = array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'REMOTE_ADDR');
265:
266: foreach ($keys as $key) {
267: if (!isset($_SERVER[$key])) {
268: continue;
269: }
270: $ips = explode(',', $_SERVER[$key], 1);
271: $ip = $ips[0];
272: if (false != ip2long($ip) && long2ip(ip2long($ip) === $ip)) {
273: return $ips[0];
274: }
275: }
276:
277: return false;
278: }
279:
280: /**
281: * Отправка HTTP заголовков
282: *
283: * @static
284: * @param $code_string
285: */
286: public static function send_headers($code_string)
287: {
288: header($code_string);
289: }
290:
291: /**
292: * Установка кода HTTP ответа в заголовок страницы
293: *
294: * @tutorial joosRequest::send_headers_by_code(200);
295: * @tutorial joosRequest::send_headers_by_code(301);
296: * @tutorial joosRequest::send_headers_by_code(404);
297: * @tutorial joosRequest::send_headers_by_code(504);
298: *
299: * @param int $code_num номер кода
300: */
301: public static function send_headers_by_code($code_num = 200)
302: {
303: $code_array = array(// Информационные 1xx
304: 100 => 'Continue', 101 => 'Switching Protocols', // Успешный 2xx
305: 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', // Редиректы 3xx
306: 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', // 1.1
307: 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', // 306 зарезервирован
308: 307 => 'Temporary Redirect', // ошибки клиента 4xx
309: 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', // ошибки сервера 5xx
310: 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 509 => 'Bandwidth Limit Exceeded');
311:
312: // проверяем наличие кода ошибки
313: if (isset($code_array[$code_num])) {
314:
315: $code_message = $code_array[$code_num];
316: } else {
317:
318: throw new joosException('Код :code не поддерживается протоколом HTTP', array(':code' => $code_num));
319: }
320:
321: // версия HTTP протокола
322: if (isset($_SERVER['SERVER_PROTOCOL'])) {
323: $protocol = $_SERVER['SERVER_PROTOCOL'];
324: } else {
325: $protocol = 'HTTP/1.1';
326: }
327:
328: $code_string = sprintf('%s %s %s', $protocol, $code_num, $code_message);
329:
330: self::send_headers($code_string);
331: }
332:
333: /**
334: * Проверка на запуск скрипта через консаоль
335: *
336: * @return bool
337: */
338: public static function is_console()
339: {
340: return PHP_SAPI === 'cli';
341: }
342:
343: }
344: