/
liquid-g
/
liquid-code
Обзор
Документация
Войти
/
liquid-g
/
liquid-code
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop-0.4
src/liquidcode/http/static.py
73 строки
3 KB
User
v0.4.17: рефакторинг статики и архитектура middleware
07 июл 2026, 12:05
07 июл 2026, 12:05
706b43e
Код
Авторство
О чём код?
""" Утилиты для работы с HTTP. Содержит вспомогательные функции для обработки запросов и ответов. """ import logging import mimetypes import os from typing import Optional, Tuple from .http_response import HttpResponse logger = logging.getLogger(__name__) def try_serve_static_file( path: str, static_dir: str = "public", static_prefix: str = "/static", ) -> Tuple[bool, Optional[HttpResponse]]: """ Пытается отдать статический файл напрямую, без обращения к ядру. Args: path: Путь запроса. static_dir: Директория со статическими файлами (по умолчанию 'public'). static_prefix: URL-префикс для статики (по умолчанию '/static'). Returns: Кортеж (success: bool, response: Optional[HttpResponse]) """ # Проверяем, начинается ли путь с префикса статики if not path.startswith(static_prefix + "/"): return False, None # Убираем префикс relative_path = path[len(static_prefix):].lstrip("/") if not relative_path: return False, None # Строим абсолютный путь full_static_dir = os.path.abspath(static_dir) file_path = os.path.join(full_static_dir, relative_path) # Проверяем, что файл внутри директории (безопасность) if not os.path.abspath(file_path).startswith(full_static_dir): logger.warning( f"Попытка доступа к файлу вне статической директории: {file_path}" ) return False, None # Проверяем, существует ли файл if not os.path.isfile(file_path): return False, None # Определяем MIME-тип mime_type, _ = mimetypes.guess_type(file_path) if mime_type is None: mime_type = "application/octet-stream" try: with open(file_path, "rb") as f: content = f.read() logger.info(f"Статика (напрямую): {path} → {file_path} ({mime_type})") response = HttpResponse( content, status=200, headers={"Content-Type": mime_type} ) return True, response except Exception as e: logger.error(f"Ошибка чтения статического файла {file_path}: {e}") return False, None