Edgewall Software

Ticket #9111: flupify.diff

File flupify.diff, 2.9 KB (added by cboos, 23 months ago)

fcgi: make it possible to use the installed version of flup instead of builtin version (patch on r9930)

  • trac/web/fcgi_frontend.py

    # HG changeset patch
    # Parent 6663d4056caf4d5a1e79323adf12bc5e93ff735d
    # User cboos
    fcgi: make it possible to use the installed version of flup instead of builtin version.
    
    The environment varialbe TRAC_USE_FLUP needs to be set to `1` in order to force the use of flup.
    If `flup` is used, we need to insert some WSGI middleware in order to deal with URL encoding.
    
    diff -r 6663d4056caf trac/web/fcgi_frontend.py
    a b  
    1515# 
    1616# Author: Matthew Good <trac@matt-good.net> 
    1717 
     18import os 
    1819import pkg_resources 
     20import urllib 
    1921 
    2022from trac import __version__ as VERSION 
    2123from trac.web.main import dispatch_request 
    2224 
    23 import _fcgi 
     25use_flup = os.environ.get('TRAC_USE_FLUP', False) 
     26if use_flup in ('0', 'no', 'off'): 
     27    use_flup = False 
     28 
     29 
     30class FlupMiddleware(object): 
     31    """Flup doesn't URL unquote the PATH_INFO, so we need to do it.""" 
     32    def __init__(self, application): 
     33        self.application = application 
     34 
     35    def __call__(self, environ, start_response): 
     36        environ['PATH_INFO'] = urllib.unquote(environ.get('PATH_INFO', '')) 
     37        return self.application(environ, start_response) 
     38 
     39params = {} 
     40 
     41if use_flup: 
     42    try: 
     43        from flup.server.fcgi import WSGIServer 
     44        params['maxThreads'] = 15 
     45        dispatch_request = FlupMiddleware(dispatch_request) 
     46    except ImportError: 
     47        use_flup = False 
     48 
     49if not use_flup: 
     50    from _fcgi import WSGIServer 
    2451 
    2552def run(): 
    26     _fcgi.WSGIServer(dispatch_request).run() 
     53    WSGIServer(dispatch_request, **params).run() 
    2754 
    2855if __name__ == '__main__': 
    2956    pkg_resources.require('Trac==%s' % VERSION) 
  • trac/web/standalone.py

    diff -r 6663d4056caf trac/web/standalone.py
    a b  
    2323import os 
    2424import sys 
    2525from SocketServer import ThreadingMixIn 
    26 import urllib 
    2726 
    2827from trac import __version__ as VERSION 
    2928from trac.util import autoreload, daemon 
     
    7170        return self.application(environ, start_response) 
    7271 
    7372 
    74 class FlupMiddleware(object): 
    75  
    76     def __init__(self, application): 
    77         self.application = application 
    78  
    79     def __call__(self, environ, start_response): 
    80         environ['PATH_INFO'] = urllib.unquote(environ.get('PATH_INFO', '')) 
    81         return self.application(environ, start_response) 
    82  
    83  
    8473class TracEnvironMiddleware(object): 
    8574 
    8675    def __init__(self, application, env_parent_dir, env_paths, single_env): 
     
    272261                                    None, None, ['']).WSGIServer 
    273262            flup_app = wsgi_app 
    274263            if options.unquote: 
     264                from trac.web.fcgi_frontend import FlupMiddleware 
    275265                flup_app = FlupMiddleware(flup_app) 
    276266            ret = server_cls(flup_app, bindAddress=server_address).run() 
    277267            sys.exit(ret and 42 or 0) # if SIGHUP exit with status 42