annotate roundup/cgi/cgitb.py @ 5418:55f09ca366c4

Python 3 preparation: StringIO. This generally arranges for StringIO and cStringIO references to use io.StringIO for Python 3 but io.BytesIO for Python 2, consistent with the string representations generally used in Roundup. A special FasterStringIO in the TAL code, which referenced internals of the old Python 2 StringIO module, is cut down so it doesn't actually do anything beyond the StringIO class it inherits from (it would also be reasonable to remove FasterStringIO completely). One place in roundup_server.py clearly needing binary I/O is made to use io.BytesIO unconditionally.
author Joseph Myers <jsm@polyomino.org.uk>
date Wed, 25 Jul 2018 09:08:29 +0000
parents 64b05e24dbd8
children 7172c201dec2
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
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
10 import sys, os, types, string, keyword, linecache, tokenize, inspect, cgi
1079
04b44df7af1d removed some property name clashes
Richard Jones <richard@users.sourceforge.net>
parents: 1066
diff changeset
11 import pydoc, traceback
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
13 from roundup.cgi import templating, TranslationService
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
14
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
15 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
16 """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
17
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
18 Parameters:
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
19 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
20 or TranslationService object.
2426
cafdf8b7cc69 use templating translation service instead of commandline-oriented gettext()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2005
diff changeset
21
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
22 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
23 (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
24 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
25 TranslationService.
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 """
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
28 try:
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
29 return i18n.gettext
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
30 except:
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
31 return TranslationService.get_translation().gettext
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 def breaker():
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 return ('<body bgcolor="white">' +
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 '<font color="white" size="-5"> > </font> ' +
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 '</table>' * 5)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
38 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
39 l = []
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
40 for k in sorted(dict):
4264
b1e614c6759f Improve error reporting.
Stefan Seefeld <stefan@seefeld.name>
parents: 2564
diff changeset
41 v = dict[k]
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
42 l.append('<tr><td><strong>%s</strong></td><td>%s</td></tr>'%(k,
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
43 cgi.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
44 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
45
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
46 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
47 _ = get_translator(i18n)
1396
cce5b4309005 extra info in template error report
Richard Jones <richard@users.sourceforge.net>
parents: 1204
diff changeset
48 esc = cgi.escape
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
49 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
50 l = [_('<h1>Templating Error</h1>\n'
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
51 '<p><b>%(exc_type)s</b>: %(exc_value)s</p>\n'
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
52 '<p class="help">Debugging information follows</p>'
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
53 ) % {'exc_type': exc_info[0], 'exc_value': exc_info[1]},
1396
cce5b4309005 extra info in template error report
Richard Jones <richard@users.sourceforge.net>
parents: 1204
diff changeset
54 '<ol>',]
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
55 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
56 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
57 t.reverse()
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1136
diff changeset
58 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
59 args, varargs, varkw, locals = inspect.getargvalues(frame)
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
60 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
61 ti = locals['__traceback_info__']
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
62 if isinstance(ti, TraversalError):
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
63 s = []
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
64 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
65 s.append(_('<li>"%(name)s" (%(info)s)</li>')
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
66 % {'name': name, 'info': esc(repr(info))})
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
67 s = '\n'.join(s)
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
68 l.append(_('<li>Looking for "%(name)s", '
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
69 'current path:<ol>%(path)s</ol></li>'
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
70 ) % {'name': ti.name, 'path': s})
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
71 else:
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
72 l.append(_('<li>In %s</li>') % esc(str(ti)))
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
73 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
74 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
75 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
76 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
77 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
78 % 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
79 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
80 s = s + '<br>' + '<br>'.join(
1396
cce5b4309005 extra info in template error report
Richard Jones <richard@users.sourceforge.net>
parents: 1204
diff changeset
81 [esc(x) for x in context._v_errors])
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1136
diff changeset
82 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
83 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
84 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
85 l.append(_('''
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
86 <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
87 <table class="otherinfo" style="font-size: 90%%">
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
88 <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
89 %(globals)s
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
90 %(locals)s
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
91 </table></li>
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
92 ''') % {
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
93 'info': info,
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
94 'line': context.position[0],
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
95 '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
96 'locals': niceDict(' ', context.local_vars)
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
97 })
1079
04b44df7af1d removed some property name clashes
Richard Jones <richard@users.sourceforge.net>
parents: 1066
diff changeset
98
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
99 l.append('''
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
100 </ol>
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
101 <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
102 <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
103 <tr><td><pre>%s</pre></td></tr>
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
104 </table>''' % (_('Full traceback:'), cgi.escape(''.join(
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
105 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
106 ))))
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
107 l.append('<p>&nbsp;</p>')
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
108 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
109
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
110 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
111 _ = get_translator(i18n)
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
112 etype, evalue = sys.exc_info()[0], sys.exc_info()[1]
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
113 if type(etype) is type:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114 etype = etype.__name__
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 pyver = 'Python ' + string.split(sys.version)[0] + '<br>' + sys.executable
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 head = pydoc.html.heading(
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
117 _('<font size=+1><strong>%(exc_type)s</strong>: %(exc_value)s</font>')
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
118 % {'exc_type': etype, 'exc_value': evalue},
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 '#ffffff', '#777777', pyver)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 head = head + (_('<p>A problem occurred while running a Python script. '
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 'Here is the sequence of function calls leading up to '
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 'the error, with the most recent (innermost) call first. '
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 'The exception attributes are:'))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 indent = '<tt><small>%s</small>&nbsp;</tt>' % ('&nbsp;' * 5)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127 traceback = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 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
129 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
130 link = _("&lt;file is None - probably inside <tt>eval</tt> "
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
131 "or <tt>exec</tt>&gt;")
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133 file = os.path.abspath(file)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 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
135 args, varargs, varkw, locals = inspect.getargvalues(frame)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 if func == '?':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137 call = ''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 else:
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
139 call = _('in <strong>%s</strong>') % func + inspect.formatargvalues(
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140 args, varargs, varkw, locals,
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 formatvalue=lambda value: '=' + pydoc.html.repr(value))
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 level = '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 <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
145 <tr><td>%s %s</td></tr></table>''' % (link, call)
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 if index is None or file is None:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148 traceback.append('<p>' + level)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 continue
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
150
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
151 # do a file inspection
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
152 names = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
153 def tokeneater(type, token, start, end, line, names=names):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
154 if type == tokenize.NAME and token not in keyword.kwlist:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155 if token not in names:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156 names.append(token)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157 if type == tokenize.NEWLINE: raise IndexError
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158 def linereader(file=file, lnum=[lnum]):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 line = linecache.getline(file, lnum[0])
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160 lnum[0] = lnum[0] + 1
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161 return line
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
163 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
164 tokenize.tokenize(linereader, tokeneater)
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
165 except IndexError:
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
166 pass
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167 lvals = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
168 for name in names:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169 if name in frame.f_code.co_varnames:
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
170 if name in locals:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 value = pydoc.html.repr(locals[name])
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173 value = _('<em>undefined</em>')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
174 name = '<strong>%s</strong>' % name
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 else:
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
176 if name in frame.f_globals:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177 value = pydoc.html.repr(frame.f_globals[name])
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179 value = _('<em>undefined</em>')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180 name = '<em>global</em> <strong>%s</strong>' % name
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
181 lvals.append('%s&nbsp;= %s'%(name, value))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
182 if lvals:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
183 lvals = string.join(lvals, ', ')
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
184 lvals = indent + '<small><font color="#909090">%s'\
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
185 '</font></small><br>'%lvals
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
186 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
187 lvals = ''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
188
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
189 excerpt = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
190 i = lnum - index
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
191 for line in lines:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
192 number = '&nbsp;' * (5-len(str(i))) + str(i)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
193 number = '<small><font color="#909090">%s</font></small>' % number
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
194 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
195 if i == lnum:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196 line = '''
1947
0e19e99075e3 fix #white in cgitb
Richard Jones <richard@users.sourceforge.net>
parents: 1396
diff changeset
197 <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
198 <tr><td>%s</td></tr></table>''' % line
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199 excerpt.append('\n' + line)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
200 if i == lnum:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201 excerpt.append(lvals)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202 i = i + 1
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203 traceback.append('<p>' + level + string.join(excerpt, '\n'))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 traceback.reverse()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207 exception = '<p><strong>%s</strong>: %s' % (str(etype), str(evalue))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208 attribs = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
209 if type(evalue) is types.InstanceType:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 for name in dir(evalue):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
211 value = pydoc.html.repr(getattr(evalue, name))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
212 attribs.append('<br>%s%s&nbsp;= %s' % (indent, name, value))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
213
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
214 return head + string.join(attribs) + string.join(traceback) + '<p>&nbsp;</p>'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
216 def handler():
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4570
diff changeset
217 print(breaker())
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4570
diff changeset
218 print(html())
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
219
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
220 # vim: set filetype=python ts=4 sw=4 et si :

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