Ticket #1468: wiki-exporter.diff
| File wiki-exporter.diff, 9.3 KB (added by Alec Thomas <alec@…>, 6 years ago) |
|---|
-
trac/web/standalone.py
21 21 22 22 from trac import util, __version__ 23 23 from trac.env import open_environment 24 from trac.web.api import Request 25 from trac.web.cgi_frontend import TracFieldStorage 24 from trac.web.api import Request, FieldStorage 26 25 from trac.web.main import dispatch_request, get_environment, \ 27 send_pretty_error, send_project_index 26 send_pretty_error, send_ugly_error, \ 27 send_project_index 28 28 from trac.util import md5crypt 29 29 30 30 import os … … 282 282 self.server.send_project_index(req) 283 283 return 284 284 285 env = get_environment(req, opts) 285 try: 286 env = get_environment(req, opts) 287 except Exception, e: 288 send_ugly_error(e, None, req) 289 return 290 286 291 if not env: 287 292 self.server.send_project_index(req) 288 293 return … … 342 347 headers = self.__handler.headers 343 348 if self.method in ('GET', 'HEAD'): 344 349 headers = None 345 self.args = TracFieldStorage(self.__handler.rfile, environ=environ,350 self.args = FieldStorage(self.__handler.rfile, environ=environ, 346 351 headers=headers, keep_blank_values=1) 347 352 348 353 def read(self, size=None): -
trac/web/api.py
18 18 import mimetypes 19 19 import os 20 20 import urlparse 21 import cgi 21 22 22 23 from trac.core import Interface 23 24 from trac.util import http_date … … 220 221 """Write the given data to the response body.""" 221 222 raise NotImplementedError 222 223 224 class FieldStorage(cgi.FieldStorage): 225 """ 226 FieldStorage class with a few more functions to make it behave a bit 227 more like a dictionary 228 """ 229 get = cgi.FieldStorage.getvalue 223 230 231 def __init__(self, *args, **kwargs): 232 cgi.FieldStorage.__init__(self, *args, **kwargs) 233 if not self.list: 234 self.list = [] 235 236 def __setitem__(self, name, value): 237 if self.has_key(name): 238 del self[name] 239 self.list.append(cgi.MiniFieldStorage(name, value)) 240 241 def __delitem__(self, name): 242 if not self.has_key(name): 243 raise KeyError(name) 244 self.list = filter(lambda x, name=name: x.name != name, self.list) 245 246 def read_single(self): 247 pass 248 224 249 class IAuthenticator(Interface): 225 250 """Extension point interface for components that can provide the name 226 251 of the remote user.""" -
trac/web/modpython_frontend.py
20 20 import mimetypes 21 21 import os 22 22 import re 23 import sys 23 24 24 25 try: 25 26 from cStringIO import StringIO … … 29 30 from mod_python import apache, util 30 31 31 32 from trac.util import http_date 32 from trac.web.api import Request, RequestDone 33 from trac.web.api import Request, RequestDone, FieldStorage 33 34 from trac.web.main import dispatch_request, get_environment, \ 34 send_pretty_error, send_project_index 35 send_pretty_error, send_project_index, \ 36 send_ugly_error 35 37 36 38 37 39 class ModPythonRequest(Request): … … 53 55 self.scheme = 'https' 54 56 if self.req.headers_in.has_key('Cookie'): 55 57 self.incookie.load(self.req.headers_in['Cookie']) 56 self.args = FieldStorageWrapper(self.req)57 58 59 # Fake normal CGI environment for cgi.FieldStorage 60 sys.argv = ['mod_python'] 61 env = dict(self.req.subprocess_env.iteritems()) 62 if 'Content-Type' in self.req.headers_in: 63 env['CONTENT_TYPE'] = self.req.headers_in['Content-Type'] 64 if 'Content-Length' in self.req.headers_in: 65 env['CONTENT_LENGTH'] = self.req.headers_in['Content-Length'] 66 self.args = FieldStorage(self.req, environ=env, keep_blank_values=1) 67 58 68 # The root uri sometimes has to be explicitly specified because apache 59 69 # sometimes get req.path_info wrong if many <alias> and <location> directives 60 70 # are used. … … 196 206 ('TracEnvParentDir', 'TRAC_ENV_PARENT_DIR'), 197 207 ('TracEnvIndexTemplate', 'TRAC_ENV_INDEX_TEMPLATE'), 198 208 ('TracTemplateVars', 'TRAC_TEMPLATE_VARS')) 199 env = get_environment(mpr, project_opts) 209 try: 210 env = get_environment(mpr, project_opts) 211 except Exception, e: 212 send_ugly_error(e, None, mpr) 213 return apache.OK 214 200 215 if not env: 201 216 send_project_index(mpr, project_opts) 202 217 return apache.OK -
trac/web/cgi_frontend.py
16 16 # Author: Christopher Lenz <cmlenz@gmx.de> 17 17 # Matthew Good <trac@matt-good.net> 18 18 19 import cgi20 19 import locale 21 20 import os 22 21 import re 23 22 import sys 24 23 25 from trac.web.api import Request 24 from trac.web.api import Request, FieldStorage 26 25 from trac.web.main import dispatch_request, get_environment, \ 27 send_pretty_error, send_project_index 26 send_pretty_error, send_ugly_error, \ 27 send_project_index 28 28 29 29 30 30 class CGIRequest(Request): … … 61 61 62 62 63 63 def _getFieldStorage(self): 64 return TracFieldStorage(self.__input, environ=self.__environ,64 return FieldStorage(self.__input, environ=self.__environ, 65 65 keep_blank_values=1) 66 66 67 67 def read(self, len): … … 83 83 self.write('\r\n') 84 84 85 85 86 class TracFieldStorage(cgi.FieldStorage):87 """88 FieldStorage class with a few more functions to make it behave a bit89 more like a dictionary90 """91 get = cgi.FieldStorage.getvalue92 93 def __setitem__(self, name, value):94 if self.has_key(name):95 del self[name]96 self.list.append(cgi.MiniFieldStorage(name, value))97 98 def __delitem__(self, name):99 if not self.has_key(name):100 raise KeyError(name)101 self.list = filter(lambda x, name=name: x.name != name, self.list)102 103 104 86 def run(): 105 87 try: # Make FreeBSD use blocking I/O like other platforms 106 88 import fcntl … … 121 103 locale.setlocale(locale.LC_ALL, '') 122 104 123 105 req = CGIRequest() 124 env = get_environment(req, os.environ, threaded=False) 106 try: 107 env = get_environment(req, os.environ, threaded=False) 108 except Exception, e: 109 send_ugly_error(e, None, req) 110 return 125 111 126 112 if not env: 127 113 send_project_index(req, os.environ) -
trac/web/main.py
193 193 else: 194 194 hdf['args.%s' % arg] = req.args[arg].value 195 195 196 def send_ugly_error(e, env, req, tb = None): 197 if not tb: 198 import traceback 199 import StringIO 200 tb = StringIO.StringIO() 201 traceback.print_exc(file=tb) 202 203 try: 204 req.send_response(500) 205 req.send_header('Content-Type', 'text/plain') 206 req.end_headers() 207 req.write('Oops...\n\nTrac detected an internal error:\n\n') 208 req.write(str(e)) 209 req.write('\n') 210 req.write(tb.getvalue()) 211 except IOError: 212 # Cannot send response, but the error has hopefully been logged 213 pass 214 196 215 def send_pretty_error(e, env, req=None): 197 216 """Send a "pretty" HTML error page to the client.""" 198 217 import traceback … … 243 262 if env and env.log: 244 263 env.log.error('Failed to render pretty error page: %s', e2, 245 264 exc_info=True) 246 try: 247 req.send_response(500) 248 req.send_header('Content-Type', 'text/plain') 249 req.end_headers() 250 req.write('Oops...\n\nTrac detected an internal error:\n\n') 251 req.write(str(e)) 252 req.write('\n') 253 req.write(tb.getvalue()) 254 except IOError: 255 # Cannot send response, but the error has hopefully been logged 256 pass 265 send_ugly_error(e, env, req, tb) 257 266 258 267 def send_project_index(req, options, env_paths=None): 259 268 from trac.web.clearsilver import HDFWrapper -
trac/web/fcgi_frontend.py
30 30 31 31 def _handler(_req): 32 32 req = CGIRequest(_req.params, _req.stdin, _req.stdout) 33 env = get_environment(req, os.environ) 33 try: 34 env = get_environment(req, os.environ) 35 except Exception, e: 36 send_ugly_error(e, None, req) 37 return _fcgi.FCGI_REQUEST_COMPLETE, 0 34 38 35 39 if not env: 36 40 send_project_index(req, os.environ) 37 41 return _fcgi.FCGI_REQUEST_COMPLETE, 0 38 42 39 try: 43 try: 40 44 dispatch_request(req.path_info, req, env) 41 45 except Exception, e: 42 46 send_pretty_error(e, env, req)
