<?php
$method = $_SERVER['REQUEST_METHOD'];
//Всегда отвечаем 200 на HEAD
if ($method == "HEAD") {
http_response_code("200");
exit;
}
//Всегда отвечаем 404 на не GET
elseif ($method != "GET") {
http_response_code("404");
exit;
}
//Всегда отвечаем 404 на отстутсвие REQUEST_URI
if (!isset($_SERVER['REQUEST_URI'])) {
http_response_code("404");
exit;
}
//Корневой каталог
$docRoot = 'D:/Apache24/htdocs'; //$_SERVER['DOCUMENT_ROOT'];
//Каталог с дистрибутивами внутри корня
$tcDir = "thinclient";
//Ищем каталог, в котором лежит скрипт, отновительно корня. Можно и вручную прописать. Используется ниже
$curDir = str_replace($docRoot, "", $_SERVER['SCRIPT_FILENAME']);
$curDir = str_replace("/index.php", "", $curDir);
if ($curDir == "/") {
$curDir = "";
}
//Массив возможных IP и Имён сервера Apache для внутренних соединенй (Локалка)
//В дальнейшем будет проверяться в переменной SERVER_NAME функцией in_array для определения, откуда именно пришёл запрос
//Функция in_array чувствительна к регистру, потому всё приводим к нижнему.
$arrIntSrv = array(strtolower("myComputerName"), "192.168.0.102", "::1");
//Порт сервера Apache для внутренних соединенй (Локалка). Может быть не 80, потому в переменную.
$intPort = "80";
//Массив возможных IP и Имён сервера Apache для внешних соединенй (через Интернет)
//В дальнейшем будет проверяться в переменной SERVER_NAME функцией in_array для определения, откуда именно пришёл запрос
//Функция in_array чувствительна к регистру, потому всё приводим к нижнему.
$arrExtSrv = array(strtolower("alg-rt.shmg.ru"), "264.320.41.5");
//Порт сервера Apache для внешних соединенй (через Интернет), как прописано в роутере.
$extPort = "8083";
//Если нет $REQUEST_SCHEME - 404. Излишне, но пусть будет.
if (!isset($_SERVER['REQUEST_SCHEME'])) {
http_response_code("404");
exit;
}
$REQUEST_SCHEME = $_SERVER['REQUEST_SCHEME'];
//Если нет SERVER_NAME - 404
if (!isset($_SERVER['SERVER_NAME'])) {
http_response_code("404");
exit;
}
$SERVER_NAME = $_SERVER['SERVER_NAME'];
//Проверяем, откуда пришёл запрос
if (in_array(strtolower($SERVER_NAME), $arrIntSrv)) {
//Запрос из локалки
$port = $intPort;
}
elseif (in_array(strtolower($SERVER_NAME), $arrExtSrv)) {
//Запрос из интрнетов
$port = $extPort;
}
else {
//Не понятно, откуда пришёл запрос. 404. Да, спорное решение, но мне так захотелось.
http_response_code("404");
exit;
}
$REQUEST_URI = $_SERVER['REQUEST_URI'];
$parse_REQUEST_URI = parse_url($REQUEST_URI);
//Поле парсинга url проверяем на наличие query и path = $curDir . /WebDistributiveLocation/GetDistributiveInfo/, иначе 404.
if (!(isset($parse_REQUEST_URI['path']) && isset($parse_REQUEST_URI['query']) && $parse_REQUEST_URI['path'] == $curDir . '/WebDistributiveLocation/GetDistributiveInfo/')) {
http_response_code("404");
exit;
}
parse_str($parse_REQUEST_URI['query'], $arrayQuery);
//Поле парсинга строки query проверяем на наличие PackageType, Version и Arch, иначе 404. Это в целом избыточно, наверное, но пусть будет.
if (!(isset($arrayQuery['PackageType']) && isset($arrayQuery['Version']) && isset($arrayQuery['Arch']))) {
http_response_code("404");
exit;
}
$PackageType = $arrayQuery['PackageType'];
$Version = $arrayQuery['Version'];
$Arch = $arrayQuery['Arch'];
//Формируем имя файла
$tcLocalFilePath = $docRoot . '/' . $tcDir . '/' . $Version . '/' . $PackageType . '-' . $Arch . '.zip';
//Если файла нет, отвечаем 404
if (!file_exists($tcLocalFilePath)) {
http_response_code("404");
exit;
}
//Получаем размер
$tcSize = filesize($tcLocalFilePath);
//Формируем заголовки
header("Content-type: application/json; charset=utf-8");
header("Cache-Control: no-cache");
//формируем url файла
$tcFileURL = $REQUEST_SCHEME . '://' . $SERVER_NAME . ':' . $port . '/' . $tcDir . '/' . $Version . '/' . $PackageType . '-' . $Arch . '.zip';
//Формируем строку JSON
$data = '{"root" : {"size" : ' . $tcSize . ', "url" : "' . $tcFileURL . '"}}';
//Отвечаем 200
http_response_code("200");
//Отправляем строку JSON
echo $data;
//Для дебага
//$log = date('Y-m-d H:i:s') . ' ' . print_r($data, TRUE);
//file_put_contents(__DIR__ . '/log.txt', $log . PHP_EOL, FILE_APPEND);
?>