annotate roundup/cgi/cgitb.py @ 7965:6763813d9d34

issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py Fix change in pydoc.html.header() signature. It dropped foreground and background color arguments in 3.11 and newer. Also enable test code for the html function.
author John Rouillard <rouilj@ieee.org>
date Tue, 14 May 2024 21:27:28 -0400
parents 6c5f8da9fca7
children 9c3ec0a5c7fc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 #
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 # This module was written by Ka-Ping Yee, <ping@lfw.org>.
2426
cafdf8b7cc69 use templating translation service instead of commandline-oriented gettext()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2005
diff changeset
3 #
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1947
diff changeset
5 """Extended CGI traceback handler by Ka-Ping Yee, <ping@lfw.org>.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 """
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4570
diff changeset
7 from __future__ import print_function
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1947
diff changeset
8 __docformat__ = 'restructuredtext'
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
10 import inspect
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
11 import keyword
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
12 import linecache
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
13 import os
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
14 import pydoc
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
15 import sys
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
16 import tokenize
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
17 import traceback
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18
5837
883c9e90b403 Fix problem with cgi.escape being depricated a different way. This way
John Rouillard <rouilj@ieee.org>
parents: 5800
diff changeset
19 from roundup.anypy.html import html_escape
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
20 from roundup.anypy.strings import s2b
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
21 from roundup.cgi import TranslationService
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
22
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
23
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
24 def get_translator(i18n=None):
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
25 """Return message translation function (gettext)
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
26
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
27 Parameters:
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
28 i18n - translation service, such as roundup.i18n module
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
29 or TranslationService object.
2426
cafdf8b7cc69 use templating translation service instead of commandline-oriented gettext()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2005
diff changeset
30
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
31 Return ``gettext`` attribute of the ``i18n`` object, if available
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
32 (must be a message translation function with one argument).
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
33 If ``gettext`` cannot be obtained from ``i18n``, take default
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
34 TranslationService.
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
35
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
36 """
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
37 try:
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
38 return i18n.gettext
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
39 except AttributeError:
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
40 return TranslationService.get_translation().gettext
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
42
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 def breaker():
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 return ('<body bgcolor="white">' +
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 '<font color="white" size="-5"> > </font> ' +
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 '</table>' * 5)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
48
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
49 def niceDict(indent, dict):
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
50 l = []
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
51 for k in sorted(dict):
4264
b1e614c6759f Improve error reporting.
Stefan Seefeld <stefan@seefeld.name>
parents: 2564
diff changeset
52 v = dict[k]
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
53 l.append('<tr><td><strong>%s</strong></td><td>%s</td></tr>' % (
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
54 k, html_escape(repr(v))))
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
55 return '\n'.join(l)
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
56
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
57
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
58 def pt_html(context=5, i18n=None):
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
59 _ = get_translator(i18n)
5800
1a835db41674 Call cgi.escape only on python 2. Replace with html.escapeif it can be
John Rouillard <rouilj@ieee.org>
parents: 5436
diff changeset
60 esc = html_escape
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
61 exc_info = [esc(str(value)) for value in sys.exc_info()[:2]]
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
62 l = [_('<h1>Templating Error</h1>\n'
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
63 '<p><b>%(exc_type)s</b>: %(exc_value)s</p>\n'
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
64 '<p class="help">Debugging information follows</p>'
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
65 ) % {'exc_type': exc_info[0], 'exc_value': exc_info[1]},
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
66 '<ol>', ]
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
67 from roundup.cgi.PageTemplates.Expressions import TraversalError
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1136
diff changeset
68 t = inspect.trace(context)
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1136
diff changeset
69 t.reverse()
7300
57f34b0b912c flake8 fixes
John Rouillard <rouilj@ieee.org>
parents: 6983
diff changeset
70 for frame, _file, _lnum, _func, _lines, _index in t:
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
71 args, varargs, varkw, locals = inspect.getargvalues(frame)
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
72 if '__traceback_info__' in locals:
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
73 ti = locals['__traceback_info__']
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
74 if isinstance(ti, TraversalError):
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
75 s = []
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
76 for name, info in ti.path:
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
77 s.append(_('<li>"%(name)s" (%(info)s)</li>')
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
78 % {'name': name, 'info': esc(repr(info))})
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
79 s = '\n'.join(s)
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
80 l.append(_(
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
81 '<li>Looking for "%(name)s", '
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
82 'current path:<ol>%(path)s</ol></li>'
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
83 ) % {'name': ti.name, 'path': s})
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
84 else:
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
85 l.append(_('<li>In %s</li>') % esc(str(ti)))
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
86 if '__traceback_supplement__' in locals:
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
87 ts = locals['__traceback_supplement__']
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
88 if len(ts) == 2:
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
89 supp, context = ts
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
90 s = _('A problem occurred in your template "%s".') \
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
91 % str(context.id)
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1136
diff changeset
92 if context._v_errors:
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1136
diff changeset
93 s = s + '<br>' + '<br>'.join(
1396
cce5b4309005 extra info in template error report
Richard Jones <richard@users.sourceforge.net>
parents: 1204
diff changeset
94 [esc(x) for x in context._v_errors])
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
95 l.append('<li>%s</li>' % s)
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
96 elif len(ts) == 3:
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
97 supp, context, info = ts
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
98 l.append(_('''
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
99 <li>While evaluating the %(info)r expression on line %(line)d
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
100 <table class="otherinfo" style="font-size: 90%%">
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
101 <tr><th colspan="2" class="header">Current variables:</th></tr>
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
102 %(globals)s
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
103 %(locals)s
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
104 </table></li>
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
105 ''') % {
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
106 'info': info,
7808
6c5f8da9fca7 fix: cgitb crashes if there is no line number set.
John Rouillard <rouilj@ieee.org>
parents: 7300
diff changeset
107 'line': context.position[0] or -1,
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
108 'globals': niceDict(' ', context.global_vars),
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
109 'locals': niceDict(' ', context.local_vars)
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
110 })
1079
04b44df7af1d removed some property name clashes
Richard Jones <richard@users.sourceforge.net>
parents: 1066
diff changeset
111
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
112 l.append('''
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
113 </ol>
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
114 <table style="font-size: 80%%; color: gray">
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
115 <tr><th class="header" align="left">%s</th></tr>
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
116 <tr><td><pre>%s</pre></td></tr>
5800
1a835db41674 Call cgi.escape only on python 2. Replace with html.escapeif it can be
John Rouillard <rouilj@ieee.org>
parents: 5436
diff changeset
117 </table>''' % (_('Full traceback:'), html_escape(''.join(
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
118 traceback.format_exception(*sys.exc_info())
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
119 ))))
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
120 l.append('<p>&nbsp;</p>')
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
121 return '\n'.join(l)
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
122
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
123
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
124 def html(context=5, i18n=None):
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
125 _ = get_translator(i18n)
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
126 etype, evalue = sys.exc_info()[0], sys.exc_info()[1]
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
127 if type(etype) is type:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 etype = etype.__name__
5433
86b6cea7a975 Python 3 preparation: avoid string.split().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5420
diff changeset
129 pyver = 'Python ' + sys.version.split()[0] + '<br>' + sys.executable
7965
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
130
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
131 if sys.version_info[0:2] >= (3,11):
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
132 head = pydoc.html.heading(
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
133 _('<font size=+1><strong>%(exc_type)s</strong>: '
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
134 '%(exc_value)s</font>')
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
135 % {'exc_type': etype, 'exc_value': evalue}, pyver)
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
136 else:
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
137 head = pydoc.html.heading(
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
138 _('<font size=+1><strong>%(exc_type)s</strong>: '
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
139 '%(exc_value)s</font>')
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
140 % {'exc_type': etype, 'exc_value': evalue},
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
141 '#ffffff', '#777777', pyver)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 head = head + (_('<p>A problem occurred while running a Python script. '
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
144 'Here is the sequence of function calls leading up to '
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
145 'the error, with the most recent (innermost) call first. '
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
146 'The exception attributes are:'))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148 indent = '<tt><small>%s</small>&nbsp;</tt>' % ('&nbsp;' * 5)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 traceback = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
150 for frame, file, lnum, func, lines, index in inspect.trace(context):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
151 if file is None:
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
152 link = _("&lt;file is None - probably inside <tt>eval</tt> "
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
153 "or <tt>exec</tt>&gt;")
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
154 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155 file = os.path.abspath(file)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156 link = '<a href="file:%s">%s</a>' % (file, pydoc.html.escape(file))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157 args, varargs, varkw, locals = inspect.getargvalues(frame)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158 if func == '?':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 call = ''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160 else:
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
161 call = _('in <strong>%s</strong>') % \
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
162 func + inspect.formatargvalues(
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
163 args, varargs, varkw, locals,
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
164 formatvalue=lambda value: '=' + pydoc.html.repr(value))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
165
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
166 level = '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167 <table width="100%%" bgcolor="#dddddd" cellspacing=0 cellpadding=2 border=0>
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
168 <tr><td>%s %s</td></tr></table>''' % (link, call)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170 if index is None or file is None:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 traceback.append('<p>' + level)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172 continue
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
174 # do a file inspection
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 names = []
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
176
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177 def tokeneater(type, token, start, end, line, names=names):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178 if type == tokenize.NAME and token not in keyword.kwlist:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179 if token not in names:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180 names.append(token)
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
181 if type == tokenize.NEWLINE: raise IndexError # noqa: E701
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
182
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
183 def linereader(file=file, lnum=[lnum]):
5436
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
184 line = s2b(linecache.getline(file, lnum[0]))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
185 lnum[0] = lnum[0] + 1
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
186 return line
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
187
5436
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
188 # The interface that is tokenize.tokenize in Python 3 is
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
189 # called tokenize.generate_tokens in Python 2. However,
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
190 # Python 2 has tokenize.tokenize with a different interface,
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
191 # and Python 3 has an undocumented generate_tokens function,
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
192 # also with a different interface, so a version check is
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
193 # needed instead of checking for which functions exist.
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
194 if sys.version_info[0] > 2:
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
195 tokenize_fn = tokenize.tokenize
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
196 else:
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
197 tokenize_fn = tokenize.generate_tokens
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198 try:
5436
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
199 for t in tokenize_fn(linereader):
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
200 tokeneater(*t)
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
201 except IndexError:
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
202 pass
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203 lvals = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204 for name in names:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 if name in frame.f_code.co_varnames:
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
206 if name in locals:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207 value = pydoc.html.repr(locals[name])
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
209 value = _('<em>undefined</em>')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 name = '<strong>%s</strong>' % name
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
211 else:
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
212 if name in frame.f_globals:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
213 value = pydoc.html.repr(frame.f_globals[name])
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
214 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215 value = _('<em>undefined</em>')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
216 name = '<em>global</em> <strong>%s</strong>' % name
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
217 lvals.append('%s&nbsp;= %s' % (name, value))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
218 if lvals:
5434
1ab2c81a64df Python 3 preparation: avoid string.join().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5433
diff changeset
219 lvals = ', '.join(lvals)
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
220 lvals = indent + '<small><font color="#909090">%s'\
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
221 '</font></small><br>' % lvals
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
222 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223 lvals = ''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
225 excerpt = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
226 i = lnum - index
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227 for line in lines:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
228 number = '&nbsp;' * (5-len(str(i))) + str(i)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
229 number = '<small><font color="#909090">%s</font></small>' % number
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
230 line = '<tt>%s&nbsp;%s</tt>' % (number, pydoc.html.preformat(line))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
231 if i == lnum:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
232 line = '''
1947
0e19e99075e3 fix #white in cgitb
Richard Jones <richard@users.sourceforge.net>
parents: 1396
diff changeset
233 <table width="100%%" bgcolor="white" cellspacing=0 cellpadding=0 border=0>
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
234 <tr><td>%s</td></tr></table>''' % line
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
235 excerpt.append('\n' + line)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
236 if i == lnum:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
237 excerpt.append(lvals)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
238 i = i + 1
5434
1ab2c81a64df Python 3 preparation: avoid string.join().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5433
diff changeset
239 traceback.append('<p>' + level + '\n'.join(excerpt))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
241 traceback.reverse()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
243 exception = '<p><strong>%s</strong>: %s' % (str(etype), str(evalue))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244 attribs = []
5420
7172c201dec2 Python 3 preparation: avoid obsolete types.*Type names.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
245 for name in dir(evalue):
7172c201dec2 Python 3 preparation: avoid obsolete types.*Type names.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
246 value = pydoc.html.repr(getattr(evalue, name))
7172c201dec2 Python 3 preparation: avoid obsolete types.*Type names.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
247 attribs.append('<br>%s%s&nbsp;= %s' % (indent, name, value))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248
5434
1ab2c81a64df Python 3 preparation: avoid string.join().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5433
diff changeset
249 return head + ' '.join(attribs) + ' '.join(traceback) + '<p>&nbsp;</p>'
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
250
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
251
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252 def handler():
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4570
diff changeset
253 print(breaker())
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4570
diff changeset
254 print(html())
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
255
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
256 # vim: set filetype=python ts=4 sw=4 et si :

Roundup Issue Tracker: http://roundup-tracker.org/