Joywork/engine/classes/DealProxy.php
2026-05-24 19:35:05 +03:00

108 lines
3.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Proxy class for forwarding Deal API requests.
* Compatible with PHP 5.6.
*/
class DealProxy
{
/** Path to log file */
private $logFile;
public function __construct()
{
$this->logFile = __DIR__ . '/proxy.log';
}
/** Simple logger */
private function logMessage($message)
{
$date = date('Y-m-d H:i:s');
file_put_contents($this->logFile, "[$date] $message\n", FILE_APPEND);
}
/** Build the target URL based on incoming request */
private function buildTargetUrl()
{
$path = isset($_GET['path']) ? $_GET['path'] : '';
unset($_GET['path']);
$query = http_build_query($_GET);
$apiUrl = "https://llar.joyworkdev.ru/api/" . ltrim($path, '/');
if ($query) {
$apiUrl .= '?' . $query;
}
return $apiUrl;
}
/** Build headers for the forwarded request */
private function buildHeaders()
{
$headers = array(
'Accept: application/json',
);
// Preserve original Content-Type if present
$originalContentType = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '';
if ($originalContentType) {
$headers[] = 'Content-Type: ' . $originalContentType;
$this->logMessage("Incoming Content-Type: '$originalContentType'");
} else {
$this->logMessage('WARNING: Incoming Content-Type not detected');
}
// Pass session cookie if exists
if (!empty($_COOKIE['PHPSESSID'])) {
$headers[] = 'Cookie: PHPSESSID=' . $_COOKIE['PHPSESSID'];
}
// Pass custom header from Vue if present
if (!empty($_SERVER['HTTP_X_SESSION_ID'])) {
$headers[] = 'X-Session-ID: ' . $_SERVER['HTTP_X_SESSION_ID'];
}
return $headers;
}
/** Forward the request using cURL and output the response */
private function forwardRequest($targetUrl, $headers, $method, $body)
{
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => $targetUrl,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_HEADER => false,
));
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
if ($curlError) {
$this->logMessage('cURL Error: ' . $curlError);
}
curl_close($ch);
http_response_code($httpCode);
echo $response;
}
/** Main handler called from index.php */
public function handle()
{
// CORS headers must be sent before any output
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Accept, Content-Type, X-Requested-With, Authorization');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(204);
exit;
}
$targetUrl = $this->buildTargetUrl();
$headers = $this->buildHeaders();
$method = $_SERVER['REQUEST_METHOD'];
$body = file_get_contents('php://input');
$this->logMessage('Forwarding request to ' . $targetUrl);
$this->forwardRequest($targetUrl, $headers, $method, $body);
}
}