]> git.openstreetmap.org Git - nominatim.git/blobdiff - nominatim/server/falcon/server.py
print any collected debug output when returning a timeout error
[nominatim.git] / nominatim / server / falcon / server.py
index b1859db6835f5554db83da17840b24b342557f65..1551c06257ff405aeca53a1b822ad2577c67ce7e 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):
@@ -122,7 +131,7 @@ class FileLoggingMiddleware:
             writes logs for sucessful requests for search, reverse and lookup.
         """
         if not req_succeeded or resource is None or resp.status != 200\
             writes logs for sucessful 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'):
+            or resource.name not in ('reverse', 'search', 'lookup', 'details'):
             return
 
         finish = dt.datetime.now(tz=dt.timezone.utc)
             return
 
         finish = dt.datetime.now(tz=dt.timezone.utc)
@@ -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: