From e5a2953a80453bba99bdd3781796d0b4c3be317a Mon Sep 17 00:00:00 2001 From: rene Date: Thu, 4 Jun 2026 20:35:06 +0200 Subject: [PATCH] =?UTF-8?q?Tile-Server:=20HEAD-Support=20f=C3=BCr=20/tiles?= =?UTF-8?q?=20(Dateigr=C3=B6=C3=9Fe-Probe=20ohne=20405)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/main.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/main.py b/backend/main.py index eb41d18..4d22f8f 100644 --- a/backend/main.py +++ b/backend/main.py @@ -380,7 +380,7 @@ app.mount("/img", StaticFiles(directory=f"{STATIC_DIR}/img"), name="img") # (Range nativ, keine App-CPU) — siehe docs/TILE_SERVER_HANDOVER.md, Entscheidung #2. _TILES_DIR = os.getenv("TILES_DIR", "/data/tiles") -@app.get("/tiles/{filename}") +@app.api_route("/tiles/{filename}", methods=["GET", "HEAD"]) async def serve_tile(filename: str, request: Request): # Kein Path-Traversal if "/" in filename or "\\" in filename or ".." in filename: @@ -390,6 +390,11 @@ async def serve_tile(filename: str, request: Request): return Response(status_code=404) file_size = os.path.getsize(path) base_headers = {"Accept-Ranges": "bytes", "Cache-Control": "public, max-age=86400"} + if request.method == "HEAD": + return Response( + status_code=200, media_type="application/octet-stream", + headers={**base_headers, "Content-Length": str(file_size)}, + ) range_header = request.headers.get("range") if range_header and range_header.startswith("bytes="): rng = range_header[6:].split(",")[0] # nur erster Range (pmtiles nutzt single-range)