aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/fatcat_web/routes.py30
-rw-r--r--python/fatcat_web/templates/api_error.html20
2 files changed, 50 insertions, 0 deletions
diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py
index 77b5dc55..a6634292 100644
--- a/python/fatcat_web/routes.py
+++ b/python/fatcat_web/routes.py
@@ -1005,6 +1005,36 @@ def page_server_error(e):
def page_server_down(e):
return render_template('503.html'), 503
+@app.errorhandler(ApiException)
+def page_fatcat_api_error(ae):
+ """
+ Generic error handler for fatcat API problems. With this error handler,
+ don't need to explicitly catch API exceptions: they should get caught and
+ routed correctly here.
+ """
+ if ae.status == 404:
+ return page_not_found(ae)
+ elif ae.status in [401, 403]:
+ return page_not_authorized(ae)
+ elif ae.status in [405]:
+ return page_method_not_allowed(ae)
+ elif ae.status in [409]:
+ return page_edit_conflict(ae)
+ try:
+ json_body = json.loads(ae.body)
+ ae.error_name = json_body.get('error')
+ ae.message = json_body.get('message')
+ except ValueError:
+ pass
+ return render_template('api_error.html', api_error=ae), ae.status
+
+@app.errorhandler(ApiValueError)
+def page_fatcat_api_value_error(ae):
+ ae.status = 400
+ ae.error_name = "ValueError"
+ ae.message = str(ae)
+ return render_template('api_error.html', api_error=ae), 400
+
@app.errorhandler(CSRFError)
def page_csrf_error(e):
return render_template('csrf_error.html', reason=e.description), 400
diff --git a/python/fatcat_web/templates/api_error.html b/python/fatcat_web/templates/api_error.html
new file mode 100644
index 00000000..1a44f610
--- /dev/null
+++ b/python/fatcat_web/templates/api_error.html
@@ -0,0 +1,20 @@
+{% extends "base.html" %}
+{% block body %}
+
+<center>
+<div style="font-size: 8em;">{{ api_error.status or "" }}</div>
+<div style="font-size: 3em;">{{ api_error.reason or "" }}</div>
+</center>
+
+<div class="ui icon error message">
+ <i class="ban icon"></i>
+ <div class="content">
+ <div class="header">
+ API Error: {{ api_error.error_name or "" }}
+ </div>
+ <p>{{ api_error.message or "" }}
+ </div>
+</div>
+
+
+{% endblock %}