Return an HTML page, containing a pretty error response. status should be an int or a str. kwargs will be interpolated into the page template.
(status, **kwargs)
| 473 | |
| 474 | |
| 475 | def get_error_page(status, **kwargs): |
| 476 | """Return an HTML page, containing a pretty error response. |
| 477 | |
| 478 | status should be an int or a str. kwargs will be interpolated into |
| 479 | the page template. |
| 480 | """ |
| 481 | try: |
| 482 | code, reason, message = _httputil.valid_status(status) |
| 483 | except ValueError: |
| 484 | raise cherrypy.HTTPError(500, _exc_info()[1].args[0]) |
| 485 | |
| 486 | # We can't use setdefault here, because some |
| 487 | # callers send None for kwarg values. |
| 488 | if kwargs.get('status') is None: |
| 489 | kwargs['status'] = '%s %s' % (code, reason) |
| 490 | if kwargs.get('message') is None: |
| 491 | kwargs['message'] = message |
| 492 | if kwargs.get('traceback') is None: |
| 493 | kwargs['traceback'] = '' |
| 494 | if kwargs.get('version') is None: |
| 495 | kwargs['version'] = cherrypy.__version__ |
| 496 | |
| 497 | for k, v in kwargs.items(): |
| 498 | if v is None: |
| 499 | kwargs[k] = '' |
| 500 | else: |
| 501 | kwargs[k] = html.escape(kwargs[k], quote=False) |
| 502 | |
| 503 | # Use a custom template or callable for the error page? |
| 504 | pages = cherrypy.serving.request.error_page |
| 505 | error_page = pages.get(code) or pages.get('default') |
| 506 | |
| 507 | # Default template, can be overridden below. |
| 508 | template = _HTTPErrorTemplate |
| 509 | if error_page: |
| 510 | try: |
| 511 | if hasattr(error_page, '__call__'): |
| 512 | # The caller function may be setting headers manually, |
| 513 | # so we delegate to it completely. We may be returning |
| 514 | # an iterator as well as a string here. |
| 515 | # |
| 516 | # We *must* make sure any content is not unicode. |
| 517 | result = error_page(**kwargs) |
| 518 | if cherrypy.lib.is_iterator(result): |
| 519 | from cherrypy.lib.encoding import UTF8StreamEncoder |
| 520 | return UTF8StreamEncoder(result) |
| 521 | elif isinstance(result, str): |
| 522 | return result.encode('utf-8') |
| 523 | else: |
| 524 | if not isinstance(result, bytes): |
| 525 | raise ValueError( |
| 526 | 'error page function did not ' |
| 527 | 'return a bytestring, str or an ' |
| 528 | 'iterator - returned object of type %s.' |
| 529 | % (type(result).__name__)) |
| 530 | return result |
| 531 | else: |
| 532 | # Load the template from this path. |
no test coverage detected
searching dependent graphs…