error.py
109 lines
| 3.7 KiB
| text/x-python
|
PythonLexer
r819 | # -*- coding: utf-8 -*- | |||
r1206 | # This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | ||||
# the Free Software Foundation, either version 3 of the License, or | ||||
# (at your option) any later version. | ||||
r1203 | # | |||
r819 | # This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
# GNU General Public License for more details. | ||||
r1203 | # | |||
r819 | # You should have received a copy of the GNU General Public License | |||
r1206 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
|
r4116 | """ | ||
rhodecode.controllers.error | ||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
RhodeCode error controller | ||||
:created_on: Dec 8, 2010 | ||||
:author: marcink | ||||
:copyright: (c) 2013 RhodeCode GmbH. | ||||
:license: GPLv3, see LICENSE for more details. | ||||
""" | ||||
r819 | import os | |||
r547 | import cgi | |||
r819 | import logging | |||
r547 | import paste.fileapp | |||
r819 | ||||
r1212 | from pylons import tmpl_context as c, request, config, url | |||
r547 | from pylons.i18n.translation import _ | |||
r819 | from pylons.middleware import media_path | |||
r547 | from rhodecode.lib.base import BaseController, render | |||
r819 | ||||
r547 | log = logging.getLogger(__name__) | |||
r1212 | ||||
r547 | class ErrorController(BaseController): | |||
r819 | """Generates error documents as and when they are required. | |||
r547 | ||||
The ErrorDocuments middleware forwards to ErrorController when error | ||||
related status codes are returned from the application. | ||||
r819 | This behavior can be altered by changing the parameters to the | |||
r547 | ErrorDocuments middleware in your config/middleware.py file. | |||
""" | ||||
r819 | ||||
r547 | def __before__(self): | |||
r1212 | #disable all base actions since we don't need them here | |||
pass | ||||
r819 | ||||
r547 | def document(self): | |||
resp = request.environ.get('pylons.original_response') | ||||
r986 | c.rhodecode_name = config.get('rhodecode_title') | |||
r819 | ||||
r1976 | log.debug('### %s ###' % resp.status) | |||
r547 | ||||
e = request.environ | ||||
r1212 | c.serv_p = r'%(protocol)s://%(host)s/' \ | |||
% {'protocol': e.get('wsgi.url_scheme'), | ||||
'host': e.get('HTTP_HOST'), } | ||||
r819 | ||||
r547 | c.error_message = cgi.escape(request.GET.get('code', str(resp.status))) | |||
c.error_explanation = self.get_error_explanation(resp.status_int) | ||||
r1212 | # redirect to when error with given seconds | |||
r547 | c.redirect_time = 0 | |||
r1212 | c.redirect_module = _('Home page') | |||
r547 | c.url_redirect = "/" | |||
return render('/errors/error_document.html') | ||||
def img(self, id): | ||||
"""Serve Pylons' stock images""" | ||||
return self._serve_file(os.path.join(media_path, 'img', id)) | ||||
def style(self, id): | ||||
"""Serve Pylons' stock stylesheets""" | ||||
return self._serve_file(os.path.join(media_path, 'style', id)) | ||||
def _serve_file(self, path): | ||||
"""Call Paste's FileApp (a WSGI application) to serve the file | ||||
at the specified path | ||||
""" | ||||
fapp = paste.fileapp.FileApp(path) | ||||
return fapp(request.environ, self.start_response) | ||||
def get_error_explanation(self, code): | ||||
r3886 | """ get the error explanations of int codes | |||
[400, 401, 403, 404, 500]""" | ||||
r547 | try: | |||
code = int(code) | ||||
r3631 | except Exception: | |||
r547 | code = 500 | |||
if code == 400: | ||||
r1212 | return _('The request could not be understood by the server' | |||
' due to malformed syntax.') | ||||
r547 | if code == 401: | |||
r819 | return _('Unauthorized access to resource') | |||
r547 | if code == 403: | |||
return _("You don't have permission to view this page") | ||||
if code == 404: | ||||
return _('The resource could not be found') | ||||
if code == 500: | ||||
r1212 | return _('The server encountered an unexpected condition' | |||
' which prevented it from fulfilling the request.') | ||||