Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

Ticket #559: middleware-2.patch

  • _cpwsgi.py

    old new  
    181181                   ) 
    182182        s.protocol = server.protocol_version 
    183183 
     184 
     185#                      WSGI configuration components                      # 
     186 
     187 
     188class WSGIMiddleware(object): 
     189    def __init__(self, middleware): 
     190        self.middleware = middleware 
     191 
     192    def __call__(self, app, **conf): 
     193        return self.middleware(app=app, **conf) 
     194 
     195 
     196class WSGIMiddlewareCollection(object): 
     197    pass 
     198 
     199default_wsgi_middleware_collection = WSGIMiddlewareCollection() 
     200 
  • __init__.py

    old new  
    1212tools = _cptools.default_toolbox 
    1313Tool = _cptools.Tool 
    1414 
     15from cherrypy import _cpwsgi 
     16wsgi = _cpwsgi.default_wsgi_middleware_collection 
     17WSGIMiddleware = _cpwsgi.WSGIMiddleware 
     18 
    1519from cherrypy import _cptree 
    1620tree = _cptree.Tree() 
    1721from cherrypy._cptree import Application 
  • _cptree.py

    old new  
     1import cherrypy 
    12from cherrypy import _cpconfig, _cplogging, _cpwsgi 
    23 
    34 
     
    2021     
    2122    def __init__(self, root, script_name="", conf=None): 
    2223        self.log = _cplogging.LogManager(id(self)) 
     24        self.wsgimap = {"middleware_pipeline": [], 
     25                        } 
    2326        self.root = root 
    2427        self.script_name = script_name 
    2528        self.namespaces = {"log": lambda k, v: setattr(self.log, k, v), 
     29                           "wsgi": self._set_wsgi, 
    2630                           } 
    2731        self.conf = {} 
    2832        if conf: 
    2933            self.merge(conf) 
    3034     
     35        self._setup_wsgiapp() 
     36 
     37    def _set_wsgi(self, k, v): 
     38        if k == "middleware_pipeline": 
     39            self.wsgimap[k] = v 
     40        else: 
     41            name, arg = k.split(".", 1) 
     42            bucket = self.wsgimap.setdefault(name, {}) 
     43            bucket[arg] = v 
     44 
     45    def _setup_wsgiapp(self): 
     46        wsgi = cherrypy.wsgi 
     47        wsgimap = self.wsgimap 
     48        wsgiapp = lambda e, s: _cpwsgi._wsgi_callable(e, s, app=self) 
     49        for name in reversed(wsgimap["middleware_pipeline"]): 
     50            middleware = getattr(wsgi, name) 
     51            middleware_conf = wsgimap.get(name, {}) 
     52            wsgiapp = middleware(wsgiapp, **middleware_conf) 
     53        self.wsgiapp = wsgiapp 
     54 
    3155    def _get_script_name(self): 
    3256        if self._script_name is None: 
    3357            # None signals that the script name should be pulled from WSGI environ. 
     
    7094        return scheme + host + self.script_name 
    7195     
    7296    def __call__(self, environ, start_response): 
    73         return _cpwsgi._wsgi_callable(environ, start_response, app=self
     97        return self.wsgiapp(environ, start_response
    7498 
    7599 
    76100class Tree(object): 

Hosted by WebFaction

Log in as guest/cpguest to create tickets