113 lines
3.6 KiB
PHP
113 lines
3.6 KiB
PHP
|
|
<?php
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Proxy class for forwarding Deal API requests.
|
|||
|
|
*
|
|||
|
|
* Handles CORS, builds request headers (including session cookies),
|
|||
|
|
* forwards the request to the legacy API and returns the response.
|
|||
|
|
*/
|
|||
|
|
class DealProxy
|
|||
|
|
{
|
|||
|
|
/** Path to log file */
|
|||
|
|
private $logFile;
|
|||
|
|
|
|||
|
|
public function __construct()
|
|||
|
|
{
|
|||
|
|
$this->logFile = __DIR__ . '/proxy.log';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** Simple logger */
|
|||
|
|
private function logMessage(string $message): void
|
|||
|
|
{
|
|||
|
|
$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(): string
|
|||
|
|
{
|
|||
|
|
$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(): array
|
|||
|
|
{
|
|||
|
|
$headers = [
|
|||
|
|
'Accept: application/json',
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
// Preserve original Content-Type if present
|
|||
|
|
$originalContentType = $_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(string $targetUrl, array $headers, string $method, string $body): void
|
|||
|
|
{
|
|||
|
|
$ch = curl_init();
|
|||
|
|
curl_setopt_array($ch, [
|
|||
|
|
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(): void
|
|||
|
|
{
|
|||
|
|
// CORS headers – keep them here to 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);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
?>
|