summaryrefslogtreecommitdiff
path: root/repoze/bfg/router.py
blob: fde50b5280d2ecdb512c77de570a632a64419836 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from zope.component import queryMultiAdapter
from zope.interface import directlyProvides

from webob import Request
from webob.exc import HTTPNotFound

from repoze.bfg.interfaces import IWSGIApplicationFactory
from repoze.bfg.interfaces import IWebObRequest

class Router:
    def __init__(self, root_policy, traversal_policy, security_policy):
        self.root_policy = root_policy
        self.traversal_policy = traversal_policy
        self.security_policy = security_policy

    def __call__(self, environ, start_response):
        root = self.root_policy(environ)
        context, name, subpath = self.traversal_policy(environ, root)
        app = self.security_policy(environ, context, name)
        if app is None:
            environ['repoze.bfg.subpath'] = subpath
            request = Request(environ)
            directlyProvides(request, IWebObRequest)
            app = queryMultiAdapter((context, request),
                                    IWSGIApplicationFactory, name=name)
            if app is None:
                app = HTTPNotFound(request.url)
        return app(environ, start_response)