Mercurial > p > roundup > code
comparison roundup/cgi/apache.py @ 2552:41fbe26aa2df
mod_python interface for Roundup Issue Tracker
| author | Alexander Smishlajev <a1s@users.sourceforge.net> |
|---|---|
| date | Tue, 06 Jul 2004 10:25:42 +0000 |
| parents | |
| children | d45f1669599c |
comparison
equal
deleted
inserted
replaced
| 2551:89cde746a699 | 2552:41fbe26aa2df |
|---|---|
| 1 # mod_python 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 # This module provides Roundup Web User Interface | |
| 7 # using mod_python Apache module. Initially written | |
| 8 # with python 2.3.3, mod_python 3.1.3, roundup 0.7.0. | |
| 9 # | |
| 10 # This module operates with only one tracker | |
| 11 # and must be placed in the tracker directory. | |
| 12 # | |
| 13 # History (most recent first): | |
| 14 # 04-jul-2004 [als] tracker lookup moved from module global to request handler; | |
| 15 # use PythonOption TrackerHome (configured in apache) | |
| 16 # to open the tracker | |
| 17 # 06-may-2004 [als] use cgi.FieldStorage from Python library | |
| 18 # instead of mod_python FieldStorage | |
| 19 # 29-apr-2004 [als] created | |
| 20 | |
| 21 __version__ = "$Revision: 1.1 $"[11:-2] | |
| 22 __date__ = "$Date: 2004-07-06 10:25:42 $"[7:-2] | |
| 23 | |
| 24 import cgi | |
| 25 import os | |
| 26 | |
| 27 from mod_python import apache | |
| 28 | |
| 29 import roundup.instance | |
| 30 | |
| 31 class Headers(dict): | |
| 32 | |
| 33 """HTTP headers wrapper""" | |
| 34 | |
| 35 def __init__(self, headers): | |
| 36 """Initialize with `apache.table`""" | |
| 37 super(Headers, self).__init__(headers) | |
| 38 self.getheader = self.get | |
| 39 | |
| 40 class Request(object): | |
| 41 | |
| 42 """`apache.Request` object wrapper providing roundup client interface""" | |
| 43 | |
| 44 def __init__(self, request): | |
| 45 """Initialize with `apache.Request` object""" | |
| 46 self._req = request | |
| 47 # .headers.getheader() | |
| 48 self.headers = Headers(request.headers_in) | |
| 49 # .wfile.write() | |
| 50 self.wfile = self._req | |
| 51 | |
| 52 def send_response(self, response_code): | |
| 53 """Set HTTP response code""" | |
| 54 self._req.status = response_code | |
| 55 | |
| 56 def send_header(self, name, value): | |
| 57 """Set output header""" | |
| 58 # value may be an instance of roundup.cgi.exceptions.HTTPException | |
| 59 value = str(value) | |
| 60 # XXX default content_type is "text/plain", | |
| 61 # and ain't overrided by "Content-Type" header | |
| 62 if name == "Content-Type": | |
| 63 self._req.content_type = value | |
| 64 else: | |
| 65 self._req.headers_out.add(name, value) | |
| 66 | |
| 67 def end_headers(self): | |
| 68 """NOOP. There aint no such thing as 'end_headers' in mod_python""" | |
| 69 pass | |
| 70 | |
| 71 def handler(req): | |
| 72 """HTTP request handler""" | |
| 73 _options = req.get_options() | |
| 74 _home = _options.get("TrackerHome") | |
| 75 if not (_home and os.path.isdir(_home)): | |
| 76 apache.log_error( | |
| 77 "PythonOption TrackerHome missing or invalid for %(uri)s" | |
| 78 % {'uri': req.uri}) | |
| 79 return apache.HTTP_INTERNAL_SERVER_ERROR | |
| 80 _tracker = roundup.instance.open(_home) | |
| 81 # create environment | |
| 82 # Note: cookies are read from HTTP variables, so we need all HTTP vars | |
| 83 req.add_common_vars() | |
| 84 _env = dict(req.subprocess_env) | |
| 85 # XXX classname must be the first item in PATH_INFO. roundup.cgi does: | |
| 86 # path = string.split(os.environ.get('PATH_INFO', '/'), '/') | |
| 87 # os.environ['PATH_INFO'] = string.join(path[2:], '/') | |
| 88 # we just remove the first character ('/') | |
| 89 _env["PATH_INFO"] = req.path_info[1:] | |
| 90 _form = cgi.FieldStorage(req, environ=_env) | |
| 91 _client = _tracker.Client(_tracker, Request(req), _env, _form) | |
| 92 _client.main() | |
| 93 return apache.OK | |
| 94 | |
| 95 # vim: set et sts=4 sw=4 : |
