From e00c0a426ad03ba3246bed6e244e99fdd37d6677 Mon Sep 17 00:00:00 2001 From: Steven Conaway Date: Thu, 14 Aug 2025 18:48:30 -0700 Subject: [PATCH] Show tracebacks on errors --- meshview/templates/error.html | 10 ++++++ meshview/web.py | 63 ++++++++++++++++++++++++----------- 2 files changed, 53 insertions(+), 20 deletions(-) diff --git a/meshview/templates/error.html b/meshview/templates/error.html index 4408d6c..a847e55 100644 --- a/meshview/templates/error.html +++ b/meshview/templates/error.html @@ -4,6 +4,16 @@

Error

{{ error_message }}

+ + {% if error_details %} +
+ Error Details + +
{{error_details}}
+
+
+ {% endif %} +
{% endblock %} diff --git a/meshview/web.py b/meshview/web.py index a302658..782843d 100644 --- a/meshview/web.py +++ b/meshview/web.py @@ -271,17 +271,25 @@ async def packet_list(request): template = env.get_template("error.html") rendered = template.render( error_message="Invalid or missing node ID", + error_details=None, site_config=CONFIG, SOFTWARE_RELEASE=SOFTWARE_RELEASE, ) - return web.Response(text=rendered, content_type="text/html") + return web.Response(text=rendered, status=400, content_type="text/html") # Parse and validate portnum (optional) portnum = request.query.get("portnum") try: portnum = int(portnum) if portnum else None except ValueError: - return web.Response(status=400, text="Invalid portnum value") + template = env.get_template("error.html") + rendered = template.render( + error_message="Invalid portnum value", + error_details=None, + site_config=CONFIG, + SOFTWARE_RELEASE=SOFTWARE_RELEASE, + ) + return web.Response(text=rendered, status=400, content_type="text/html") # Run tasks concurrently async with asyncio.TaskGroup() as tg: @@ -302,10 +310,11 @@ async def packet_list(request): template = env.get_template("error.html") rendered = template.render( error_message="Node not found", + error_details=None, site_config=CONFIG, SOFTWARE_RELEASE=SOFTWARE_RELEASE, ) - return web.Response(text=rendered, content_type="text/html") + return web.Response(text=rendered, status=404, content_type="text/html") # Render template template = env.get_template("node.html") @@ -333,6 +342,7 @@ async def packet_list(request): template = env.get_template("error.html") rendered = template.render( error_message="Internal server error", + error_details=traceback.format_exc(), site_config=CONFIG, SOFTWARE_RELEASE=SOFTWARE_RELEASE, ) @@ -1057,12 +1067,14 @@ async def nodelist(request): content_type="text/html", ) except Exception as e: - - return web.Response( - text="An error occurred while processing your request.", - status=500, - content_type="text/plain", + template = env.get_template("error.html") + rendered = template.render( + error_message="An error occurred while processing your request.", + error_details=traceback.format_exc(), + site_config=CONFIG, + SOFTWARE_RELEASE=SOFTWARE_RELEASE, ) + return web.Response(text=rendered, status=500, content_type="text/html") @routes.get("/api/nodes") async def api_nodes(request): @@ -1166,11 +1178,14 @@ async def net(request): except Exception as e: print("Error processing net request") - return web.Response( - text="An internal server error occurred.", - status=500, - content_type="text/plain", + template = env.get_template("error.html") + rendered = template.render( + error_message="An internal server error occurred.", + error_details=traceback.format_exc(), + site_config=CONFIG, + SOFTWARE_RELEASE=SOFTWARE_RELEASE, ) + return web.Response(text=rendered, status=500, content_type="text/html") @routes.get("/map") @@ -1250,11 +1265,15 @@ async def top(request): content_type="text/html", ) except Exception as e: - return web.Response( - text=f"An error occurred: {str(e)}", - status=500, - content_type="text/plain", + print("Error in /top:", e) + template = env.get_template("error.html") + rendered = template.render( + error_message="An error occurred in /top", + error_details=traceback.format_exc(), + site_config=CONFIG, + SOFTWARE_RELEASE=SOFTWARE_RELEASE, ) + return web.Response(text=rendered, status=500, content_type="text/html") @routes.get("/chat") async def chat(request): @@ -1278,11 +1297,15 @@ async def chat(request): ) except Exception as e: print("Error in /chat:", e) - return web.Response( - text="An error occurred while processing your request.", - status=500, - content_type="text/plain", + template = env.get_template("error.html") + rendered = template.render( + error_message="An error occurred while processing your request.", + error_details=traceback.format_exc(), + site_config=CONFIG, + SOFTWARE_RELEASE=SOFTWARE_RELEASE, ) + return web.Response(text=rendered, status=500, content_type="text/html") + @routes.get("/chat/updates") async def chat_updates(request): try: