summaryrefslogtreecommitdiff
path: root/repoze/bfg/router.py
blob: 626080bdc21c82909058672a061ad1a20a591d6d (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
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):
        self.root_policy = root_policy
        self.traversal_policy = traversal_policy

    def __call__(self, environ, start_response):
        root = self.root_policy(environ)
        context, name, subpath = self.traversal_policy(root, environ)
        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)