X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/d5b6042118504e6419a557c99685381914161732..7205491b8495e48c62b28373d1746e77d475582b:/nominatim/server/starlette/server.py diff --git a/nominatim/server/starlette/server.py b/nominatim/server/starlette/server.py index 19a9943c..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): @@ -93,7 +95,7 @@ class FileLoggingMiddleware(BaseHTTPMiddleware): finish = dt.datetime.now(tz=dt.timezone.utc) - for endpoint in ('reverse', 'search', 'lookup'): + for endpoint in ('reverse', 'search', 'lookup', 'details'): if request.url.path.startswith('/' + endpoint): qtype = endpoint break @@ -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: