Ticket #2039: pyisapie.py

File pyisapie.py, 5.7 KB (added by pjs, 8 years ago)

IIS ISAPI handler for django.core.handlers

Line 
1# https://pyisapie.svn.sourceforge.net/svnroot/pyisapie/Tags/1.0.121/PyISAPIe/Python/Examples/Django/pyisapie.py
2# 91 2008-01-10 23:53:59 -0800 (Thu, 10 Jan 2008)
3# (C)2008 Phillip Sitbon <phillip@sitbon.net>
4#
5"""Custom request handler for PyISAPIe.
6"""
7
8from django.core.handlers.base import BaseHandler
9from django.core import signals
10from django.dispatch import dispatcher
11from django.utils import datastructures
12from django import http
13import os
14
15from Http import *
16
17class PyISAPIeRequest(http.HttpRequest):
18    def __init__(This):
19        This.method = Env.REQUEST_METHOD.upper()
20        This.path = Env.URL
21        # aren't list comprehensions fun?!
22        This._headers_in = \
23          dict((N.lower(), V) for N, V in [Item.split(': ',1) for Item in Env.ALL_RAW.split('\r\n') if Item])
24
25    def get_full_path(This):
26        Qs = Env.QUERY_STRING
27        return '%s%s' % (This.path, Qs and ('?' + Qs) or '')
28
29    def _load_post_and_files(This):
30        "Populates This._post and This._files"
31        Ctype = Env.HTTP_CONTENT_TYPE or ''
32        if Ctype.startswith('multipart'):
33          This._post, This._files = http.parse_file_upload(This._headers_in, This.raw_post_data)
34        else:
35          This._post, This._files = http.QueryDict(This.raw_post_data), datastructures.MultiValueDict()
36       
37    def _get_request(This):
38        if not hasattr(This, '_request'):
39           This._request = datastructures.MergeDict(This.POST, This.GET)
40        return This._request
41
42    def _get_get(This):
43        if not hasattr(This, '_get'):
44            This._get = http.QueryDict(Env.QUERY_STRING)
45        return This._get
46
47    def _set_get(This, get):
48        This._get = get
49
50    def _get_post(This):
51        if not hasattr(This, '_post'):
52            This._load_post_and_files()
53        return This._post
54
55    def _set_post(This, post):
56        This._post = post
57
58    def _get_cookies(This):
59        if not hasattr(This, '_cookies'):
60            This._cookies = http.parse_cookie(This._headers_in.get('cookie', ''))
61        return This._cookies
62
63    def _set_cookies(This, cookies):
64        This._cookies = cookies
65
66    def _get_files(This):
67        if not hasattr(This, '_files'):
68            This._load_post_and_files()
69        return This._files
70
71    def _get_meta(This):
72        "Lazy loader that returns This.META dictionary"
73        if not hasattr(This, '_meta'):
74            This._meta = {
75                'AUTH_TYPE':         Env.AUTH_TYPE,
76                'CONTENT_LENGTH':    Env.CONTENT_LENGTH,
77                'CONTENT_TYPE':      Env.CONTENT_TYPE,
78                'GATEWAY_INTERFACE': Env.GATEWAY_INTERFACE,
79                'PATH_INFO':         Env.PATH_INFO,
80                'PATH_TRANSLATED':   Env.PATH_TRANSLATED,
81                'QUERY_STRING':      Env.QUERY_STRING,
82                'REMOTE_ADDR':       Env.REMOTE_ADDR,
83                'REMOTE_HOST':       Env.REMOTE_HOST,
84                'REMOTE_IDENT':      None,
85                'REMOTE_USER':       Env.REMOTE_USER,
86                'REQUEST_METHOD':    Env.REQUEST_METHOD,
87                'SCRIPT_NAME':       Env.SCRIPT_NAME,
88                'SERVER_NAME':       Env.SERVER_NAME,
89                'SERVER_PORT':       Env.SERVER_PORT,
90                'SERVER_PROTOCOL':   Env.SERVER_PROTOCOL,
91                'SERVER_SOFTWARE':   Env.SERVER_SOFTWARE
92            }
93            for key, value in This._headers_in.items():
94                key = 'HTTP_' + key.upper().replace('-', '_')
95                This._meta[key] = value
96        return This._meta
97
98    def _get_raw_post_data(This):
99        try:
100            return This._raw_post_data
101        except AttributeError:
102            This._raw_post_data = Read()
103            return This._raw_post_data
104
105    def _get_user(This):
106        if not hasattr(This, '_user'):
107            from django.models.auth import users
108            try:
109                user_id = This.session[users.SESSION_KEY]
110                if not user_id:
111                    raise ValueError
112                This._user = users.get_object(pk=user_id)
113            except (AttributeError, KeyError, ValueError, users.UserDoesNotExist):
114                from django.parts.auth import anonymoususers
115                This._user = anonymoususers.AnonymousUser()
116        return This._user
117
118    def _set_user(This, user):
119        This._user = user
120
121    GET = property(_get_get, _set_get)
122    POST = property(_get_post, _set_post)
123    COOKIES = property(_get_cookies, _set_cookies)
124    FILES = property(_get_files)
125    META = property(_get_meta)
126    REQUEST = property(_get_request)
127    raw_post_data = property(_get_raw_post_data)
128    user = property(_get_user, _set_user)
129
130class PyISAPIeHandler(BaseHandler):
131    def __call__(This):
132        from django.conf import settings
133
134
135        if This._request_middleware is None:
136            This.load_middleware()
137
138        dispatcher.send(signal=signals.request_started)
139
140        try:
141            request = PyISAPIeRequest()
142            response = This.get_response(request)
143
144            # Apply response middleware
145            for middleware_method in This._response_middleware:
146                response = middleware_method(request, response)
147
148        finally:
149            dispatcher.send(signal=signals.request_finished)
150
151
152        process_response(response)
153
154def process_response(http_response):
155    from django.conf import settings
156    for itm in http_response.items():
157      Header("%s: %s" % itm)
158    for c in http_response.cookies.values():
159      Header('Set-Cookie: ' + c.output(header=''))
160    Header(Status = http_response.status_code)
161    for chunk in http_response:
162        Write(chunk)
163
Back to Top