fix: renvoie un 404 sur une URL d'API inconnue

L'API et l'interface partagent le même port, et la route attrape-tout qui
sert le SPA passait avant le 404 : n'importe quelle URL /api/* erronée
repartait en index.html avec un 200. Côté client, une faute de frappe
dans une URL ne ressemblait pas à une erreur mais à une réponse vide, et
le vrai motif n'apparaissait qu'en inspectant le corps de la réponse.

Les URL commençant par /api/ sont désormais exclues de l'attrape-tout et
retombent sur un 404 JSON. Les routes de l'interface restent servies par
index.html.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-26 09:57:06 +02:00
parent 49e060e6e4
commit 5a132b1258
2 changed files with 49 additions and 1 deletions

View File

@@ -3,7 +3,7 @@
import mimetypes
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi import FastAPI, HTTPException
from fastapi.responses import FileResponse
from fastapi.staticfiles import StaticFiles
@@ -87,6 +87,13 @@ if FRONTEND_DIST.exists():
@app.get("/{full_path:path}", include_in_schema=False)
async def serve_spa(full_path: str):
"""Serve the SPA for all non-API routes."""
# Une URL d'API inconnue doit se dire inconnue. Sans cette garde, elle
# tomberait dans le catch-all et repartirait en index.html avec un 200 :
# côté client, une faute de frappe dans une URL ne ressemblerait plus à
# une erreur mais à une réponse vide.
if full_path == "api" or full_path.startswith("api/"):
raise HTTPException(status_code=404, detail="Endpoint inconnu")
# If requesting a file that exists (and stays within dist), serve it
file_path = (FRONTEND_DIST / full_path).resolve()
if file_path.is_file() and file_path.is_relative_to(_dist_root):