Select Git revision
LegacyHelper.php 6.32 KiB
<?php
namespace App\Helper;
use App\Curl\CurlRequest;
use Exception;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class LegacyHelper
{
private const MIME_TYPES = [
'txt' => 'text/plain',
'htm' => 'text/html',
'html' => 'text/html',
'php' => 'text/html',
'css' => 'text/css',
'js' => 'application/javascript',
'json' => 'application/json',
'xml' => 'application/xml',
'swf' => 'application/x-shockwave-flash',
'flv' => 'video/x-flv',
// images
'png' => 'image/png',
'jpe' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'gif' => 'image/gif',
'bmp' => 'image/bmp',
'ico' => 'image/vnd.microsoft.icon',
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'svg' => 'image/svg+xml',
'svgz' => 'image/svg+xml',
// archives
'zip' => 'application/zip',
'rar' => 'application/x-rar-compressed',
'exe' => 'application/x-msdownload',
'msi' => 'application/x-msdownload',
'cab' => 'application/vnd.ms-cab-compressed',
// audio/video
'mp3' => 'audio/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
// adobe
'pdf' => 'application/pdf',
'psd' => 'image/vnd.adobe.photoshop',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
// ms office
'doc' => 'application/msword',
'rtf' => 'application/rtf',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'docx' => 'application/msword',
'xlsx' => 'application/vnd.ms-excel',
'pptx' => 'application/vnd.ms-powerpoint',
// open office
'odt' => 'application/vnd.oasis.opendocument.text',
'ods' => 'application/vnd.oasis.opendocument.spreadsheet'
];
public static function transferToLegacy(
Request $request,
string $legacy_external_prefix,
string $legacy_url
): Response {
$originalController = preg_replace(
"@^$legacy_external_prefix@",
'',
$request->getPathInfo()
);
if (null === $originalController) {
throw new Exception('Original controller not found');
}
$originalQueryString = $request->getQueryString();
//@TODO : delete on linux server
// $originalController = str_replace("/", "\\", $originalController); //windows
$extension = strrchr($originalController, '.');
if ($extension != '.html' && $extension != '.php' && $extension != false) {
$file_path = "{$originalController}";
try {
$mime = self::getMime($file_path, $extension);
$response = new BinaryFileResponse($file_path);
$response->headers->set('Content-Type', $mime ?: 'application/octet-stream');
return $response;
} catch (FileNotFoundException $e) {
// try normal access by url
}
}
$separator = '';
if (!$extension) {
$separator = '/';
}
$url = "{$legacy_url}{$originalController}{$separator}?{$originalQueryString}";
$curl_handler = new CurlRequest();
try {
$options_array = [
CURLOPT_URL => $url,
CURLOPT_HEADER => false,
CURLOPT_VERBOSE => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_COOKIESESSION => false,
CURLOPT_COOKIEFILE => 'cookies.txt',
CURLOPT_COOKIEJAR => 'cookies.txt'
];
$curl_handler->setOptions($options_array);
if ($request->getMethod() == 'POST') {
$postParameters = $request->request->all();
if (!is_array($postParameters)) {
throw new Exception();
}
// upload file to transfer
if (isset($_FILES['fileToUpload'])) {
$data = [
'fileToUpload' => curl_file_create(
$_FILES['fileToUpload']['tmp_name'],
$_FILES['fileToUpload']['type'],
$_FILES['fileToUpload']['name']
)
];
$postParameters = array_merge($postParameters, $data);
$curl_handler->setOptions([CURLOPT_HEADER => true]);
}
$curl_handler->setOptions([
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postParameters
]);
}
$result = $curl_handler->execute();
if (!is_string($result)) {
throw new NotFoundHttpException(
(int)$curl_handler->getInfo(CURLINFO_HTTP_CODE) .
$curl_handler->getErrorMessage()
);
}
$response = new Response($result);
$contentType = $curl_handler->getInfo(CURLINFO_CONTENT_TYPE);
$response->headers->set('Content-Type', $contentType);
return $response;
} finally {
$curl_handler->close();
}
}
public static function getMime(?string $filepath, string $extension): ?string
{
if (null === $filepath) {
throw new \InvalidArgumentException('File cannot be null.');
}
$extension_without_dot = strtolower(str_replace('.', '', $extension));
if (array_key_exists($extension_without_dot, self::MIME_TYPES)) {
return self::MIME_TYPES[$extension_without_dot];
}
$file = new File($filepath, true);
if (! $file->isReadable()) {
throw new FileException('File must be readable.');
}
return $file->getMimeType();
}
}