mirror of
https://github.com/WerySkok/nativegallery.git
synced 2024-12-23 00:50:58 +03:00
195 lines
No EOL
6.3 KiB
PHP
195 lines
No EOL
6.3 KiB
PHP
<?php
|
||
|
||
namespace App\Services;
|
||
|
||
use \App\Core\Page;
|
||
|
||
class Router
|
||
{
|
||
|
||
|
||
|
||
public static function get($route, $path_to_include)
|
||
{
|
||
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
|
||
self::route($route, $path_to_include);
|
||
}
|
||
}
|
||
public static function post($route, $path_to_include)
|
||
{
|
||
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||
self::route($route, $path_to_include);
|
||
}
|
||
}
|
||
public static function put($route, $path_to_include)
|
||
{
|
||
if ($_SERVER['REQUEST_METHOD'] == 'PUT') {
|
||
self::route($route, $path_to_include);
|
||
}
|
||
}
|
||
public static function patch($route, $path_to_include)
|
||
{
|
||
if ($_SERVER['REQUEST_METHOD'] == 'PATCH') {
|
||
self::route($route, $path_to_include);
|
||
}
|
||
}
|
||
public static function delete($route, $path_to_include)
|
||
{
|
||
if ($_SERVER['REQUEST_METHOD'] == 'DELETE') {
|
||
self::route($route, $path_to_include);
|
||
}
|
||
}
|
||
public static function any($route, $path_to_include)
|
||
{
|
||
self::route($route, $path_to_include);
|
||
}
|
||
public static function route($route, $path_to_include)
|
||
{
|
||
// Определение корневой директории
|
||
$root = $_SERVER['DOCUMENT_ROOT'];
|
||
|
||
// Обработка случая, когда маршрут - 404
|
||
if ($route == "/404") {
|
||
self::includeControllerMethod($path_to_include);
|
||
exit();
|
||
}
|
||
|
||
// Получение URL-адреса запроса и разделение его на части
|
||
$request_url = strtok(filter_var($_SERVER['REQUEST_URI'], FILTER_SANITIZE_URL), '?');
|
||
$request_url_parts = explode('/', rtrim($request_url, '/'));
|
||
$route_parts = explode('/', $route);
|
||
array_shift($route_parts);
|
||
array_shift($request_url_parts);
|
||
|
||
// Обработка корневого маршрута
|
||
if ($route_parts[0] == '' && count($request_url_parts) == 0) {
|
||
self::includeControllerMethod($path_to_include);
|
||
$file_path = $root . '/app/Controllers/' . $controller . '.php';
|
||
$file_size = filesize($file_path);
|
||
header("Content-Length: $file_size");
|
||
exit();
|
||
}
|
||
|
||
// Проверка соответствия количества частей маршрута и запроса
|
||
if (count($route_parts) !== count($request_url_parts)) {
|
||
return;
|
||
}
|
||
|
||
// Обработка параметров маршрута
|
||
$parameters = [];
|
||
foreach ($route_parts as $index => $route_part) {
|
||
if (preg_match("/^[$]/", $route_part)) {
|
||
$route_part = ltrim($route_part, '$');
|
||
$parameters[] = $request_url_parts[$index];
|
||
$$route_part = $request_url_parts[$index];
|
||
global $$route_part;
|
||
} elseif ($route_part !== $request_url_parts[$index]) {
|
||
return;
|
||
}
|
||
}
|
||
|
||
// Включение контроллера и вызов метода
|
||
self::includeControllerMethod($path_to_include);
|
||
exit();
|
||
}
|
||
|
||
// Функция для включения контроллера и вызова метода
|
||
private static function includeControllerMethod($path_to_include)
|
||
{
|
||
list($controller, $method) = explode('@', $path_to_include);
|
||
$controller = '\App\Controllers\\' . $controller;
|
||
$objectController = new $controller;
|
||
$objectController->$method();
|
||
}
|
||
|
||
|
||
private static function out($text)
|
||
{
|
||
echo htmlspecialchars($text);
|
||
}
|
||
private static function set_csrf()
|
||
{
|
||
if (!isset($_SESSION["csrf"])) {
|
||
$_SESSION["csrf"] = bin2hex(random_bytes(50));
|
||
}
|
||
echo '<input type="hidden" name="csrf" value="' . $_SESSION["csrf"] . '">';
|
||
}
|
||
private static function is_csrf_valid()
|
||
{
|
||
if (!isset($_SESSION['csrf']) || !isset($_POST['csrf'])) {
|
||
return false;
|
||
}
|
||
if ($_SESSION['csrf'] != $_POST['csrf']) {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
|
||
private static function notfound()
|
||
{
|
||
Page::set('Errors/404');
|
||
}
|
||
|
||
public static function redirect($page)
|
||
{
|
||
header("Location: {$page}");
|
||
}
|
||
|
||
public static function method()
|
||
{
|
||
return $_SERVER['REQUEST_METHOD'];
|
||
}
|
||
|
||
public static function ip()
|
||
{
|
||
$fields = array(
|
||
'HTTP_CF_CONNECTING_IP',
|
||
'HTTP_X_SUCURI_CLIENTIP',
|
||
'HTTP_CLIENT_IP',
|
||
'HTTP_X_FORWARDED_FOR',
|
||
'HTTP_X_FORWARDED',
|
||
'HTTP_FORWARDED_FOR',
|
||
'HTTP_FORWARDED',
|
||
'REMOTE_ADDR',
|
||
// more custom fields
|
||
);
|
||
|
||
foreach ($fields as $ip_field) {
|
||
if (!empty($_SERVER[$ip_field])) {
|
||
return $_SERVER[$ip_field];
|
||
}
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
public static function checkCurl($url)
|
||
{
|
||
$user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0';
|
||
$options = array(
|
||
|
||
CURLOPT_CUSTOMREQUEST => "GET", //set request type post or get
|
||
CURLOPT_POST => false, //set to GET
|
||
CURLOPT_USERAGENT => $user_agent, //set user agent
|
||
CURLOPT_COOKIE => "BIRUXSESS_=1;KANDLESERVICETOKEN__779hfh908BNol8FHn7d9MNFOL8fjND8D9MNfdo=BIRUXSERVICE__TOKENYY", //set cookie file
|
||
CURLOPT_RETURNTRANSFER => true, // return web page
|
||
CURLOPT_HEADER => false, // don't return headers
|
||
CURLOPT_FOLLOWLOCATION => true, // follow redirects
|
||
CURLOPT_ENCODING => "", // handle all encodings
|
||
CURLOPT_AUTOREFERER => true, // set referer on redirect
|
||
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
|
||
CURLOPT_TIMEOUT => 120, // timeout on response
|
||
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
|
||
CURLOPT_RETURNTRANSFER => 1
|
||
);
|
||
|
||
$ch = curl_init($url);
|
||
curl_setopt_array($ch, $options);
|
||
$output = curl_exec($ch);
|
||
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||
curl_close($ch);
|
||
|
||
return $httpcode;
|
||
}
|
||
} |