# from string import split from mercurial.hgweb.hgweb_mod import hgweb from mercurial.hgweb.request import wsgiapplication import os class ModPythonInputWrapper(object): def __init__(self, req): self.req = req def read(self, size=-1): return self.req.read(size) def readline(self): return self.req.readline() def readlines(self, hint=-1): return self.req.readlines(hint) def __iter__(self): return iter(self.req.readlines()) import sys from wsgiref.handlers import BaseCGIHandler class ModPyHandler(BaseCGIHandler): def __init__(self, req): from mod_python import apache options = req.get_options() try: q = apache.mpm_query except AttributeError: # Threading and forking threaded = options.get('multithread', '') forked = options.get('multiprocess', '') if not (threaded and forked): raise ValueError("You must provide 'multithread' and " "'multiprocess' PythonOptions when " "running mod_python < 3.1") threaded = threaded.lower() in ('on', 't', 'true', '1') forked = forked.lower() in ('on', 't', 'true', '1') else: threaded = q(apache.AP_MPMQ_IS_THREADED) forked = q(apache.AP_MPMQ_IS_FORKED) req.add_common_vars() env = req.subprocess_env.copy() if req.path_info: env["SCRIPT_NAME"] = req.uri[:-len(req.path_info)] else: env["SCRIPT_NAME"] = req.uri env["GATEWAY_INTERFACE"] = "Python-CGI/1.1" if req.headers_in.has_key("authorization"): env["HTTP_AUTHORIZATION"] = req.headers_in["authorization"] BaseCGIHandler.__init__(self, stdin=ModPythonInputWrapper(req), stdout=None, stderr=sys.stderr, environ=env, multiprocess=forked, multithread=threaded ) self.request = req self._write = req.write config = req.get_config() self.tool_name = split(req.uri, '/')[1] options = req.get_options() self.path = os.path.join(options['BASE_HG_PATH'], self.tool_name, 'repository') def run_app(self): def make_web_app(): return hgweb(self.path, self.tool_name + " repository") self.run(wsgiapplication(make_web_app)) return 0 # = apache.OK def _flush(self): pass def send_headers(self): self.cleanup_headers() self.headers_sent = True self.request.status = int(self.status[:3]) for key, val in self.headers.items(): self.request.headers_out[key] = str(val) def handler(req): handler = ModPyHandler(req) return handler.run_app() # # PythonHandler wsgiref.handlers::ModPyHandler.run_app # PythonOption application myproggie.startup::get_wsgi_app # # These options are required if you're using a version of mod_python < 3.1 # # multithread = On # # multiprocess = Off #