annotate roundup/cgi/cgitb.py @ 8580:5cba36e42b8f

chore: refactor replace urlparse with urlsplit and use urllib_ Python docs recommend use of urlsplit() rather than urlparse(). urlsplit() is a little faster and doesn't try to split the path into path and params using the rules from an obsolete RFC. actions.py, demo.py, rest.py, client.py Replace urlparse() with urlsplit() actions.py urlsplit() produces a named tuple with one fewer elements (no .param). So fixup calls to urlunparse() so they have the proper number of elements in the tuple. also merge url filtering for param and path. demo.py, rest.py: Replace imports from urlparse/urllib.parse with roundup.anypy.urllib_ so we use the same interface throughout the code base. test/test_cgi.py: Since actions.py filtering for invali urls not split by path/param, fix tests for improperly quoted url's.
author John Rouillard <rouilj@ieee.org>
date Sun, 19 Apr 2026 22:58:59 -0400
parents 9c3ec0a5c7fc
children
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 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1947
diff changeset
7 __docformat__ = 'restructuredtext'
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
9 import inspect
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
10 import keyword
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
11 import linecache
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
12 import os
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
13 import pydoc
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
14 import sys
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
15 import tokenize
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
16 import traceback
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17
5837
883c9e90b403 Fix problem with cgi.escape being depricated a different way. This way
John Rouillard <rouilj@ieee.org>
parents: 5800
diff changeset
18 from roundup.anypy.html import html_escape
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
19 from roundup.anypy.strings import s2b
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
20 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
21
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
22
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
23 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
24 """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
25
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
26 Parameters:
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
27 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
28 or TranslationService object.
2426
cafdf8b7cc69 use templating translation service instead of commandline-oriented gettext()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2005
diff changeset
29
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
30 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
31 (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
32 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
33 TranslationService.
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
34
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 try:
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
37 return i18n.gettext
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
38 except AttributeError:
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
39 return TranslationService.get_translation().gettext
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
41
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 def breaker():
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 return ('<body bgcolor="white">' +
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 '<font color="white" size="-5"> > </font> ' +
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 '</table>' * 5)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
47
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
48 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
49 l = []
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
50 for k in sorted(dict):
4264
b1e614c6759f Improve error reporting.
Stefan Seefeld <stefan@seefeld.name>
parents: 2564
diff changeset
51 v = dict[k]
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
52 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
53 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
54 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
55
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
56
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
57 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
58 _ = 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
59 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
60 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
61 l = [_('<h1>Templating Error</h1>\n'
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
62 '<p><b>%(exc_type)s</b>: %(exc_value)s</p>\n'
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
63 '<p class="help">Debugging information follows</p>'
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
64 ) % {'exc_type': exc_info[0], 'exc_value': exc_info[1]},
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
65 '<ol>', ]
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
66 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
67 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
68 t.reverse()
7300
57f34b0b912c flake8 fixes
John Rouillard <rouilj@ieee.org>
parents: 6983
diff changeset
69 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
70 args, varargs, varkw, locals = inspect.getargvalues(frame)
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
71 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
72 ti = locals['__traceback_info__']
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
73 if isinstance(ti, TraversalError):
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
74 s = []
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
75 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
76 s.append(_('<li>"%(name)s" (%(info)s)</li>')
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
77 % {'name': name, 'info': esc(repr(info))})
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
78 s = '\n'.join(s)
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
79 l.append(_(
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
80 '<li>Looking for "%(name)s", '
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
81 'current path:<ol>%(path)s</ol></li>'
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
82 ) % {'name': ti.name, 'path': s})
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
83 else:
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
84 l.append(_('<li>In %s</li>') % esc(str(ti)))
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
85 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
86 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
87 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
88 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
89 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
90 % 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
91 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
92 s = s + '<br>' + '<br>'.join(
1396
cce5b4309005 extra info in template error report
Richard Jones <richard@users.sourceforge.net>
parents: 1204
diff changeset
93 [esc(x) for x in context._v_errors])
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
94 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
95 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
96 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
97 l.append(_('''
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
98 <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
99 <table class="otherinfo" style="font-size: 90%%">
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
100 <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
101 %(globals)s
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
102 %(locals)s
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
103 </table></li>
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
104 ''') % {
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
105 'info': info,
7808
6c5f8da9fca7 fix: cgitb crashes if there is no line number set.
John Rouillard <rouilj@ieee.org>
parents: 7300
diff changeset
106 '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
107 '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
108 'locals': niceDict(' ', context.local_vars)
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
109 })
1079
04b44df7af1d removed some property name clashes
Richard Jones <richard@users.sourceforge.net>
parents: 1066
diff changeset
110
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
111 l.append('''
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
112 </ol>
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
113 <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
114 <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
115 <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
116 </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
117 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
118 ))))
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
119 l.append('<p>&nbsp;</p>')
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
120 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
121
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
122
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
123 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
124 _ = get_translator(i18n)
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
125 etype, evalue = sys.exc_info()[0], sys.exc_info()[1]
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
126 if type(etype) is type:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127 etype = etype.__name__
5433
86b6cea7a975 Python 3 preparation: avoid string.split().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5420
diff changeset
128 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
129
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
130 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
131 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
132 _('<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
133 '%(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
134 % {'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
135 else:
6763813d9d34 issue2551350 - Python changes for 3.12 with roundup 2.3.0 cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 7808
diff changeset
136 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
137 _('<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
138 '%(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
139 % {'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
140 '#ffffff', '#777777', pyver)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142 head = head + (_('<p>A problem occurred while running a Python script. '
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
143 'Here is the sequence of function calls leading up to '
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
144 'the error, with the most recent (innermost) call first. '
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
145 'The exception attributes are:'))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
146
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147 indent = '<tt><small>%s</small>&nbsp;</tt>' % ('&nbsp;' * 5)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148 traceback = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 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
150 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
151 link = _("&lt;file is None - probably inside <tt>eval</tt> "
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
152 "or <tt>exec</tt>&gt;")
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
153 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
154 file = os.path.abspath(file)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155 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
156 args, varargs, varkw, locals = inspect.getargvalues(frame)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157 if func == '?':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158 call = ''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 else:
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
160 call = _('in <strong>%s</strong>') % \
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
161 func + inspect.formatargvalues(
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
162 args, varargs, varkw, locals,
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
163 formatvalue=lambda value: '=' + pydoc.html.repr(value))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
164
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
165 level = '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
166 <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
167 <tr><td>%s %s</td></tr></table>''' % (link, call)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
168
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169 if index is None or file is None:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170 traceback.append('<p>' + level)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 continue
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
173 # do a file inspection
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
174 names = []
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
175
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
176 def tokeneater(type, token, start, end, line, names=names):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177 if type == tokenize.NAME and token not in keyword.kwlist:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178 if token not in names:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179 names.append(token)
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
180 if type == tokenize.NEWLINE: raise IndexError # noqa: E701
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
181
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
182 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
183 line = s2b(linecache.getline(file, lnum[0]))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
184 lnum[0] = lnum[0] + 1
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
185 return line
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
186
5436
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
187 # 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
188 # 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
189 # 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
190 # 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
191 # 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
192 # 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
193 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
194 tokenize_fn = tokenize.tokenize
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
195 else:
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
196 tokenize_fn = tokenize.generate_tokens
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 try:
5436
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
198 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
199 tokeneater(*t)
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
200 except IndexError:
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
201 pass
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202 lvals = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203 for name in names:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204 if name in frame.f_code.co_varnames:
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
205 if name in locals:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206 value = pydoc.html.repr(locals[name])
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208 value = _('<em>undefined</em>')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
209 name = '<strong>%s</strong>' % name
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 else:
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
211 if name in frame.f_globals:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
212 value = pydoc.html.repr(frame.f_globals[name])
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
213 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
214 value = _('<em>undefined</em>')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215 name = '<em>global</em> <strong>%s</strong>' % name
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
216 lvals.append('%s&nbsp;= %s' % (name, value))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
217 if lvals:
5434
1ab2c81a64df Python 3 preparation: avoid string.join().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5433
diff changeset
218 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
219 lvals = indent + '<small><font color="#909090">%s'\
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
220 '</font></small><br>' % lvals
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
221 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
222 lvals = ''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224 excerpt = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
225 i = lnum - index
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
226 for line in lines:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227 number = '&nbsp;' * (5-len(str(i))) + str(i)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
228 number = '<small><font color="#909090">%s</font></small>' % number
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
229 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
230 if i == lnum:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
231 line = '''
1947
0e19e99075e3 fix #white in cgitb
Richard Jones <richard@users.sourceforge.net>
parents: 1396
diff changeset
232 <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
233 <tr><td>%s</td></tr></table>''' % line
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
234 excerpt.append('\n' + line)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
235 if i == lnum:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
236 excerpt.append(lvals)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
237 i = i + 1
5434
1ab2c81a64df Python 3 preparation: avoid string.join().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5433
diff changeset
238 traceback.append('<p>' + level + '\n'.join(excerpt))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
239
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240 traceback.reverse()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
241
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242 exception = '<p><strong>%s</strong>: %s' % (str(etype), str(evalue))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
243 attribs = []
5420
7172c201dec2 Python 3 preparation: avoid obsolete types.*Type names.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
244 for name in dir(evalue):
7172c201dec2 Python 3 preparation: avoid obsolete types.*Type names.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
245 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
246 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
247
5434
1ab2c81a64df Python 3 preparation: avoid string.join().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5433
diff changeset
248 return head + ' '.join(attribs) + ' '.join(traceback) + '<p>&nbsp;</p>'
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
249
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
250
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
251 def handler():
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4570
diff changeset
252 print(breaker())
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4570
diff changeset
253 print(html())
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
255 # vim: set filetype=python ts=4 sw=4 et si :

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