server proxy error pages from the Hub

This commit is contained in:
Min RK
2016-04-27 14:06:29 +02:00
parent 14a00e67b4
commit 1f861b2c90
4 changed files with 44 additions and 1 deletions

View File

@@ -937,6 +937,7 @@ class JupyterHub(Application):
'--api-ip', self.proxy.api_server.ip, '--api-ip', self.proxy.api_server.ip,
'--api-port', str(self.proxy.api_server.port), '--api-port', str(self.proxy.api_server.port),
'--default-target', self.hub.server.host, '--default-target', self.hub.server.host,
'--error-target', url_path_join(self.hub.server.url, 'error'),
] ]
if self.subdomain_host: if self.subdomain_host:
cmd.append('--host-routing') cmd.append('--host-routing')

View File

@@ -410,6 +410,7 @@ class BaseHandler(RequestHandler):
"""render custom error pages""" """render custom error pages"""
exc_info = kwargs.get('exc_info') exc_info = kwargs.get('exc_info')
message = '' message = ''
exception = None
status_message = responses.get(status_code, 'Unknown HTTP Error') status_message = responses.get(status_code, 'Unknown HTTP Error')
if exc_info: if exc_info:
exception = exc_info[1] exception = exc_info[1]

View File

@@ -3,12 +3,14 @@
# Copyright (c) Jupyter Development Team. # Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License. # Distributed under the terms of the Modified BSD License.
from http.client import responses
from jinja2 import TemplateNotFound
from tornado import web, gen from tornado import web, gen
from .. import orm from .. import orm
from ..utils import admin_only, url_path_join from ..utils import admin_only, url_path_join
from .base import BaseHandler from .base import BaseHandler
from urllib.parse import quote
class RootHandler(BaseHandler): class RootHandler(BaseHandler):
@@ -160,9 +162,43 @@ class AdminHandler(BaseHandler):
self.finish(html) self.finish(html)
class ProxyErrorHandler(BaseHandler):
"""Handler for rendering proxy error pages"""
def get(self, status_code_s):
status_code = int(status_code_s)
status_message = responses.get(status_code, 'Unknown HTTP Error')
# build template namespace
hub_home = url_path_join(self.hub.server.base_url, 'home')
message_html = ''
if status_code == 503:
message_html = ' '.join([
"Your server appears to be down.",
"Try restarting it <a href='%s'>from the hub</a>" % hub_home
])
ns = dict(
status_code=status_code,
status_message=status_message,
message_html=message_html,
logo_url=hub_home,
)
self.set_header('Content-Type', 'text/html')
# render the template
try:
html = self.render_template('%s.html' % status_code, **ns)
except TemplateNotFound:
self.log.debug("No template for %d", status_code)
html = self.render_template('error.html', **ns)
self.write(html)
default_handlers = [ default_handlers = [
(r'/', RootHandler), (r'/', RootHandler),
(r'/home', HomeHandler), (r'/home', HomeHandler),
(r'/admin', AdminHandler), (r'/admin', AdminHandler),
(r'/spawn', SpawnHandler), (r'/spawn', SpawnHandler),
(r'/error/(\d+)', ProxyErrorHandler),
] ]

View File

@@ -17,6 +17,11 @@
{{message}} {{message}}
</p> </p>
{% endif %} {% endif %}
{% if message_html %}
<p>
{{message_html | safe}}
</p>
{% endif %}
{% endblock error_detail %} {% endblock error_detail %}
</div> </div>