def handler(req): options = req.get_options() if options.has_key('TracLocale'): locale.setlocale(locale.LC_ALL, options['TracLocale']) else: locale.setlocale(locale.LC_ALL, '') # Allow specifying the python eggs cache directory using SetEnv if req.subprocess_env.has_key('PYTHON_EGG_CACHE'): os.environ['PYTHON_EGG_CACHE'] = req.subprocess_env['PYTHON_EGG_CACHE'] mpr = ModPythonRequest(req, options) project_opts = dict_translate(options, ('TracEnv', 'TRAC_ENV'), ('TracEnvParentDir', 'TRAC_ENV_PARENT_DIR'), ('TracEnvIndexTemplate', 'TRAC_ENV_INDEX_TEMPLATE'), ('TracTemplateVars', 'TRAC_TEMPLATE_VARS')) env = get_environment(mpr, project_opts) if not env: send_project_index(mpr, project_opts) return apache.OK req.content_type = 'text/html' try: dispatch_request(mpr.path_info, mpr, env) except Exception, e: send_pretty_error(e, env, mpr)
def run(): try: # Make FreeBSD use blocking I/O like other platforms import fcntl for stream in [sys.stdin, sys.stdout]: fd = stream.fileno() flags = fcntl.fcntl(fd, fcntl.F_GETFL) fcntl.fcntl(fd, fcntl.F_SETFL, flags & ~os.O_NONBLOCK) except ImportError: pass try: # Use binary I/O on Windows import msvcrt msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) except ImportError: pass locale.setlocale(locale.LC_ALL, '') req = CGIRequest() env = get_environment(req, os.environ, threaded=False) if not env: send_project_index(req, os.environ) return try: dispatch_request(req.path_info, req, env) except Exception, e: send_pretty_error(e, env, req)
def _handler(_req): req = CGIRequest(_req.params, _req.stdin, _req.stdout) env = get_environment(req, os.environ) if not env: send_project_index(req, os.environ) return try: dispatch_request(req.path_info, req, env) except Exception, e: send_pretty_error(e, env, req)
def run(): locale.setlocale(locale.LC_ALL, '') req = CGIRequest() env = get_environment(req, os.environ, threaded=False) if not env: send_project_index(req, os.environ) return try: dispatch_request(req.path_info, req, env) except Exception, e: send_pretty_error(e, env, req)
def open_environment(self, environ, start_response): env_path = environ.get('trac.env_path') if env_path: environ['trac.env_name'] = os.path.basename(env_path) else: env_parent_dir = environ.get('trac.env_parent_dir') env_paths = environ.get('trac.env_paths') if env_parent_dir or env_paths: # The first component of the path is the base name of the # environment path_info = environ.get('PATH_INFO', '').lstrip('/').split('/') env_name = path_info.pop(0) if not env_name: # No specific environment requested, so render an environment # index page send_project_index(environ, start_response, env_parent_dir, env_paths) raise RequestDone environ['trac.env_name'] = env_name errmsg = None # To make the matching patterns of request handlers work, we append # the environment name to the `SCRIPT_NAME` variable, and keep only # the remaining path in the `PATH_INFO` variable. script_name = environ.get('SCRIPT_NAME', '') try: script_name = unicode(script_name, 'utf-8') # (as Href expects unicode parameters) environ['SCRIPT_NAME'] = Href(script_name)(env_name) environ['PATH_INFO'] = '/' + '/'.join(path_info) if env_parent_dir: env_path = os.path.join(env_parent_dir, env_name) else: env_path = get_environments(environ).get(env_name) if not env_path or not os.path.isdir(env_path): errmsg = 'Environment not found' except UnicodeDecodeError: errmsg = 'Invalid URL encoding (was %r)' % script_name if errmsg: write = start_response('404 Not Found', [('Content-Type', 'text/plain'), ('Content-Length', str(len(errmsg)))]) write(errmsg) raise RequestDone if not env_path: raise EnvironmentError('The environment options "TRAC_ENV" or ' '"TRAC_ENV_PARENT_DIR" or the mod_python ' 'options "TracEnv" or "TracEnvParentDir" are ' 'missing. Trac requires one of these options ' 'to locate the Trac environment(s).') run_once = environ['wsgi.run_once'] env = None self.global_env = global_env = None try: self.global_env = global_env = open_environment(env_path, use_cache=not run_once) factory = environment_factory(global_env) factory_env = factory().open_environment(environ, env_path, global_env, use_cache=not run_once) if factory \ else None env = factory_env if factory_env else global_env except Exception: raise return env
def send_project_index(self, req): if self.env_parent_dir: return send_project_index(req, self.get_env_opts()) else: return send_project_index(req, os.environ, self.projects.values())