from typing import Optional, Mapping, cast, Any, List
from pathlib import Path
import datetime as dt
+import asyncio
from falcon.asgi import App, Request, Response
from nominatim.api import NominatimAPIAsync
import nominatim.api.v1 as api_impl
+import nominatim.api.logging as loglib
from nominatim.config import Configuration
class HTTPNominatimError(Exception):
per exception info.
"""
resp.status = 503
- resp.text = "Query took too long to process."
- resp.content_type = 'text/plain; charset=utf-8'
+
+ loglib.log().comment('Aborted: Query took too long to process.')
+ logdata = loglib.get_and_disable()
+ if logdata:
+ resp.text = logdata
+ resp.content_type = 'text/html; charset=utf-8'
+ else:
+ resp.text = "Query took too long to process."
+ resp.content_type = 'text/plain; charset=utf-8'
class ParamWrapper(api_impl.ASGIAdaptor):
resource: Optional[EndpointWrapper],
req_succeeded: bool) -> None:
""" Callback after requests writes to the logfile. It only
- writes logs for sucessful requests for search, reverse and lookup.
+ writes logs for successful requests for search, reverse and lookup.
"""
if not req_succeeded or resource is None or resp.status != 200\
or resource.name not in ('reverse', 'search', 'lookup', 'details'):
middleware=middleware)
app.add_error_handler(HTTPNominatimError, nominatim_error_handler)
app.add_error_handler(TimeoutError, timeout_error_handler)
+ # different from TimeoutError in Python <= 3.10
+ app.add_error_handler(asyncio.TimeoutError, timeout_error_handler)
legacy_urls = api.config.get_bool('SERVE_LEGACY_URLS')
for name, func in api_impl.ROUTES: