Allow serving data from screenshots directory, and do deep lookup for indexes in virtual URLs.

This commit is contained in:
abdulmohsen
2024-05-19 15:47:24 +03:00
parent 6ea9bbc291
commit 91610dddeb

View File

@@ -36,6 +36,11 @@ final class ServeStatic
'/FAQ.md' => __DIR__ . '/../../FAQ.md',
];
private const array MD_IMAGES = [
'/screenshots' => __DIR__ . '/../../',
];
private array $looked = [];
public function __construct(private string|null $staticPath = null)
{
if (null === $this->staticPath) {
@@ -67,19 +72,32 @@ final class ServeStatic
return $this->serveFile($request, new SplFileInfo(self::MD_FILES[$requestPath]));
}
$filePath = $this->staticPath . $requestPath;
// -- check if the request path is in the MD_IMAGES array
foreach (self::MD_IMAGES as $key => $value) {
if (str_starts_with($requestPath, $key)) {
$this->staticPath = realpath($value);
break;
}
}
$filePath = fixPath($this->staticPath . $requestPath);
if (is_dir($filePath)) {
$filePath = $filePath . '/index.html';
}
$filePath = fixPath($filePath);
if (!file_exists($filePath)) {
$checkIndex = dirname($filePath) . '/index.html';
$checkIndex = $this->deepIndexLookup($this->staticPath, $requestPath);
if (!file_exists($checkIndex)) {
throw new NotFoundException(
message: r("File '{file}' is not found.", ['file' => $requestPath]),
message: r(
"File '{file}' is not found. {checkIndex} {looked}",
[
'file' => $requestPath,
'checkIndex' => $checkIndex,
'looked' => $this->looked,
]
),
code: HTTP_STATUS::HTTP_NOT_FOUND->value
);
}
@@ -159,4 +177,33 @@ final class ServeStatic
return false === $mime ? 'application/octet-stream' : $mime;
}
private function deepIndexLookup(string $base, string $path): string
{
// -- paths may look like /parent/id/child, do a deep lookup for index.html at each level
// return the first index.html found
$path = fixPath($path);
if ('/' === $path) {
return $path;
}
$paths = explode('/', $path);
$count = count($paths);
if ($count < 2) {
return $path;
}
$index = $count - 1;
for ($i = $index; $i > 0; $i--) {
$check = $base . implode('/', array_slice($paths, 0, $i)) . '/index.html';
$this->looked[] = $check;
if (file_exists($check)) {
return $check;
}
}
return $path;
}
}