$code, 'message' => $message], $extra), $status); } public static function file(string $path, string $contentType, int $maxAgeSeconds = 0): void { if (!is_file($path)) { self::error('not_found', 'File not found', 404); } header('Content-Type: ' . $contentType); header('Content-Length: ' . filesize($path)); if ($maxAgeSeconds > 0) { header(sprintf('Cache-Control: public, max-age=%d, must-revalidate', $maxAgeSeconds)); header('ETag: "' . md5_file($path) . '"'); } else { header('Cache-Control: no-store'); } readfile($path); exit; } }