]> git.openstreetmap.org Git - nominatim.git/blobdiff - nominatim/server/falcon/server.py
CLI: get valid --format values via autodiscover
[nominatim.git] / nominatim / server / falcon / server.py
index 5ec418a6f3b4aa5ad4c1f287506cb843b3b03504..bdae350744e6774ff927f8bec597da8b05ee90e6 100644 (file)
@@ -10,11 +10,13 @@ Server implementation using the falcon webserver framework.
 from typing import Optional, Mapping, cast, Any, List
 from pathlib import Path
 import datetime as dt
 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
 
 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):
 from nominatim.config import Configuration
 
 class HTTPNominatimError(Exception):
@@ -44,8 +46,15 @@ async def timeout_error_handler(req: Request, resp: Response, #pylint: disable=u
         per exception info.
     """
     resp.status = 503
         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):
 
 
 class ParamWrapper(api_impl.ASGIAdaptor):
@@ -119,7 +128,7 @@ class FileLoggingMiddleware:
                                resource: Optional[EndpointWrapper],
                                req_succeeded: bool) -> None:
         """ Callback after requests writes to the logfile. It only
                                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'):
         """
         if not req_succeeded or resource is None or resp.status != 200\
             or resource.name not in ('reverse', 'search', 'lookup', 'details'):
@@ -164,6 +173,8 @@ def get_application(project_dir: Path,
               middleware=middleware)
     app.add_error_handler(HTTPNominatimError, nominatim_error_handler)
     app.add_error_handler(TimeoutError, timeout_error_handler)
               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:
 
     legacy_urls = api.config.get_bool('SERVE_LEGACY_URLS')
     for name, func in api_impl.ROUTES: