summaryrefslogtreecommitdiff
path: root/repoze/bfg/wsgiadapter.py
blob: d114dd67e1f146981bdecc498cbe825afd9a062b (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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from zope.component import queryMultiAdapter
from zope.component import queryUtility
from zope.interface import classProvides
from zope.interface import implements
from zope.interface import Interface

from repoze.bfg.interfaces import IWSGIApplicationFactory
from repoze.bfg.interfaces import IWSGIApplication
from repoze.bfg.interfaces import ISecurityPolicy
from repoze.bfg.mapply import mapply

def isResponse(ob):
    if ( hasattr(ob, 'app_iter') and hasattr(ob, 'headerlist') and
         hasattr(ob, 'status') ):
        if ( hasattr(ob.app_iter, '__iter__') and
             hasattr(ob.headerlist, '__iter__') and
             isinstance(ob.status, basestring) ) :
            return True

class NaiveWSGIViewAdapter:
    classProvides(IWSGIApplicationFactory)
    implements(IWSGIApplication)

    def __init__(self, context, request, view):
        self.context = context
        self.request = request
        self.view = view

    def __call__(self, environ, start_response):
        context = self.context
        request = self.request
        view = self.view

        catch_response = []
        def replace_start_response(status, headers):
            catch_response[:] = (status, headers)
        kwdict = {
            'request':self.request,
            'environ':environ,
            'start_response':start_response,
            }

        if isResponse(view):
            response = view
        else:
            response =  mapply(view, positional = (), keyword = kwdict)
        if not isResponse(response):
            raise ValueError('response was not IResponse: %s' % response)
        if not catch_response:
            catch_response = (response.status, response.headerlist)
        start_response(*catch_response)
        return response.app_iter