Edgewall Software

Ticket #1468: wiki-exporter.diff

File wiki-exporter.diff, 9.3 KB (added by Alec Thomas <alec@…>, 6 years ago)
  • trac/web/standalone.py

     
    2121 
    2222from trac import util, __version__ 
    2323from trac.env import open_environment 
    24 from trac.web.api import Request 
    25 from trac.web.cgi_frontend import TracFieldStorage 
     24from trac.web.api import Request, FieldStorage 
    2625from 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 
    2828from trac.util import md5crypt 
    2929 
    3030import os 
     
    282282            self.server.send_project_index(req) 
    283283            return 
    284284 
    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 
    286291        if not env: 
    287292            self.server.send_project_index(req) 
    288293            return 
     
    342347        headers = self.__handler.headers 
    343348        if self.method in ('GET', 'HEAD'): 
    344349            headers = None 
    345         self.args = TracFieldStorage(self.__handler.rfile, environ=environ, 
     350        self.args = FieldStorage(self.__handler.rfile, environ=environ, 
    346351                                     headers=headers, keep_blank_values=1) 
    347352 
    348353    def read(self, size=None): 
  • trac/web/api.py

     
    1818import mimetypes 
    1919import os 
    2020import urlparse 
     21import cgi 
    2122 
    2223from trac.core import Interface 
    2324from trac.util import http_date 
     
    220221        """Write the given data to the response body.""" 
    221222        raise NotImplementedError 
    222223 
     224class 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 
    223230 
     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 
    224249class IAuthenticator(Interface): 
    225250    """Extension point interface for components that can provide the name 
    226251    of the remote user.""" 
  • trac/web/modpython_frontend.py

     
    2020import mimetypes 
    2121import os 
    2222import re 
     23import sys 
    2324 
    2425try: 
    2526    from cStringIO import StringIO 
     
    2930from mod_python import apache, util 
    3031 
    3132from trac.util import http_date 
    32 from trac.web.api import Request, RequestDone 
     33from trac.web.api import Request, RequestDone, FieldStorage 
    3334from 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 
    3537 
    3638 
    3739class ModPythonRequest(Request): 
     
    5355            self.scheme = 'https' 
    5456        if self.req.headers_in.has_key('Cookie'): 
    5557            self.incookie.load(self.req.headers_in['Cookie']) 
    56         self.args = FieldStorageWrapper(self.req) 
    5758 
     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 
    5868        # The root uri sometimes has to be explicitly specified because apache 
    5969        # sometimes get req.path_info wrong if many <alias> and <location> directives 
    6070        # are used. 
     
    196206            ('TracEnvParentDir', 'TRAC_ENV_PARENT_DIR'), 
    197207            ('TracEnvIndexTemplate', 'TRAC_ENV_INDEX_TEMPLATE'), 
    198208            ('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 
    200215    if not env: 
    201216        send_project_index(mpr, project_opts) 
    202217        return apache.OK 
  • trac/web/cgi_frontend.py

     
    1616# Author: Christopher Lenz <cmlenz@gmx.de> 
    1717#         Matthew Good <trac@matt-good.net> 
    1818 
    19 import cgi 
    2019import locale 
    2120import os 
    2221import re 
    2322import sys 
    2423 
    25 from trac.web.api import Request 
     24from trac.web.api import Request, FieldStorage 
    2625from 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 
    2828 
    2929 
    3030class CGIRequest(Request): 
     
    6161 
    6262 
    6363    def _getFieldStorage(self): 
    64         return TracFieldStorage(self.__input, environ=self.__environ, 
     64        return FieldStorage(self.__input, environ=self.__environ, 
    6565                                keep_blank_values=1) 
    6666 
    6767    def read(self, len): 
     
    8383        self.write('\r\n') 
    8484 
    8585 
    86 class TracFieldStorage(cgi.FieldStorage): 
    87     """ 
    88     FieldStorage class with a few more functions to make it behave a bit 
    89     more like a dictionary 
    90     """ 
    91     get = cgi.FieldStorage.getvalue 
    92  
    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  
    10486def run(): 
    10587    try: # Make FreeBSD use blocking I/O like other platforms 
    10688        import fcntl 
     
    121103    locale.setlocale(locale.LC_ALL, '') 
    122104 
    123105    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 
    125111 
    126112    if not env: 
    127113        send_project_index(req, os.environ) 
  • trac/web/main.py

     
    193193            else: 
    194194                hdf['args.%s' % arg] = req.args[arg].value 
    195195 
     196def 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 
    196215def send_pretty_error(e, env, req=None): 
    197216    """Send a "pretty" HTML error page to the client.""" 
    198217    import traceback 
     
    243262        if env and env.log: 
    244263            env.log.error('Failed to render pretty error page: %s', e2, 
    245264                          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) 
    257266 
    258267def send_project_index(req, options, env_paths=None): 
    259268    from trac.web.clearsilver import HDFWrapper 
  • trac/web/fcgi_frontend.py

     
    3030 
    3131def _handler(_req): 
    3232    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 
    3438 
    3539    if not env: 
    3640        send_project_index(req, os.environ) 
    3741        return _fcgi.FCGI_REQUEST_COMPLETE, 0 
    3842 
    39     try:   
     43    try: 
    4044        dispatch_request(req.path_info, req, env) 
    4145    except Exception, e: 
    4246        send_pretty_error(e, env, req)