X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/c55c3657c32e1c11f0aa7811b6720d4a711f9abb..78c19bc006d5957f183968d086226be4b2b65fe3:/nominatim/server/starlette/server.py diff --git a/nominatim/server/starlette/server.py b/nominatim/server/starlette/server.py index 33ab22c7..c9828991 100644 --- a/nominatim/server/starlette/server.py +++ b/nominatim/server/starlette/server.py @@ -10,11 +10,12 @@ Server implementation using the starlette webserver framework. from typing import Any, Optional, Mapping, Callable, cast, Coroutine, Dict, Awaitable from pathlib import Path import datetime as dt +import asyncio from starlette.applications import Starlette from starlette.routing import Route from starlette.exceptions import HTTPException -from starlette.responses import Response, PlainTextResponse +from starlette.responses import Response, PlainTextResponse, HTMLResponse from starlette.requests import Request from starlette.middleware import Middleware from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint @@ -22,6 +23,7 @@ from starlette.middleware.cors import CORSMiddleware from nominatim.api import NominatimAPIAsync import nominatim.api.v1 as api_impl +import nominatim.api.logging as loglib from nominatim.config import Configuration class ParamWrapper(api_impl.ASGIAdaptor): @@ -114,6 +116,12 @@ async def timeout_error(request: Request, #pylint: disable=unused-argument _: Exception) -> Response: """ Error handler for query timeouts. """ + loglib.log().comment('Aborted: Query took too long to process.') + logdata = loglib.get_and_disable() + + if logdata: + return HTMLResponse(logdata) + return PlainTextResponse("Query took too long to process.", status_code=503) @@ -144,7 +152,8 @@ def get_application(project_dir: Path, middleware.append(Middleware(FileLoggingMiddleware, file_name=log_file)) exceptions: Dict[Any, Callable[[Request, Exception], Awaitable[Response]]] = { - TimeoutError: timeout_error + TimeoutError: timeout_error, + asyncio.TimeoutError: timeout_error } async def _shutdown() -> None: