comparison roundup/cgi/wsgi_handler.py @ 3736:a2d22d0de0bc

WSGI support via roundup.cgi.wsgi_handler
author Richard Jones <richard@users.sourceforge.net>
date Thu, 09 Nov 2006 00:36:21 +0000
parents
children 0728808fdf5c
comparison
equal deleted inserted replaced
3735:e8d4ac23692f 3736:a2d22d0de0bc
1 # WSGI interface for Roundup Issue Tracker
2 #
3 # This module is free software, you may redistribute it
4 # and/or modify under the same terms as Python.
5 #
6
7 import os
8 import cgi
9 import weakref
10
11 import roundup.instance
12 from roundup.cgi import TranslationService
13 from BaseHTTPServer import BaseHTTPRequestHandler
14
15
16 class Writer(object):
17 '''Perform a start_response if need be when we start writing.'''
18 def __init__(self, request):
19 self.request = request #weakref.ref(request)
20 def write(self, data):
21 f = self.request.get_wfile()
22 self.write = f
23 return f(data)
24
25 class RequestDispatcher(object):
26 def __init__(self, home, debug=False, timing=False, lang=None):
27 assert os.path.isdir(home), '%r is not a directory'%(home,)
28 self.home = home
29 self.debug = debug
30 self.timing = timing
31 if lang:
32 self.translator = TranslationService.get_translation(lang,
33 tracker_home=home)
34 else:
35 self.translator = None
36
37 def __call__(self, environ, start_response):
38 """Initialize with `apache.Request` object"""
39 self.environ = environ
40 self.__start_response = start_response
41
42 self.wfile = Writer(self)
43 self.__wfile = None
44
45 tracker = roundup.instance.open(self.home, not self.debug)
46
47 # need to strip the leading '/'
48 environ["PATH_INFO"] = environ["PATH_INFO"][1:]
49 if self.timing:
50 environ["CGI_SHOW_TIMING"] = self.timing
51
52 form = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ)
53
54 client = tracker.Client(tracker, self, environ, form,
55 self.translator)
56 try:
57 client.main()
58 except roundup.cgi.client.NotFound:
59 self.start_response([('Content-Type', 'text/html')], 404)
60 self.wfile.write('Not found: %s'%client.path)
61
62 # all body data has been written using wfile
63 return []
64
65 def start_response(self, headers, response_code):
66 """Set HTTP response code"""
67 description = BaseHTTPRequestHandler.responses[response_code]
68 self.__wfile = self.__start_response('%d %s'%(response_code,
69 description), headers)
70
71 def get_wfile(self):
72 if self.__wfile is None:
73 raise ValueError, 'start_response() not called'
74 return self.__wfile
75

Roundup Issue Tracker: http://roundup-tracker.org/