# src/app_helpers.py import base64 import logging import os from fastapi import HTTPException from fastapi.responses import HTMLResponse from starlette.requests import Request logger = logging.getLogger(__name__) def read_if_exists(path: str) -> str: """Read file if it exists, return empty string otherwise.""" try: with open(path, "r", encoding="utf-8") as f: return f.read().strip() except Exception: return "" def file_to_data_url(path: str, mime: str) -> str: """Convert file to data URL.""" with open(path, "rb") as f: b64 = base64.b64encode(f.read()).decode("ascii") return f"data:{mime};base64,{b64}" def abs_join(base_dir: str, rel: str) -> str: """Join paths and return absolute path.""" return os.path.abspath(os.path.join(base_dir, rel)) def serve_html_with_nonce(request: Request, file_path: str) -> HTMLResponse: """Read an app-bundled HTML page and inject the CSP nonce into inline