Mercurial > p > roundup > code
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 |
