def handle(self, env, startreq): if not "SCRIPT_FILENAME" in env: log.error("wsgidir called without SCRIPT_FILENAME set") return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "The server is erroneously configured.") path = env["SCRIPT_FILENAME"] if not os.access(path, os.R_OK): log.error("%s: not readable" % path) return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "The server is erroneously configured.") if "HTTP_X_ASH_PYTHON_HANDLER" in env: try: handler = self.resolve(env["HTTP_X_ASH_PYTHON_HANDLER"]) except Exception: log.error("could not load handler %s" % env["HTTP_X_ASH_PYTHON_HANDLER"], exc_info=sys.exc_info()) return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "The server is erroneously configured.") else: base = os.path.basename(path) p = base.rfind('.') if p < 0: log.error("wsgidir called with neither X-Ash-Python-Handler nor a file extension: %s" % path) return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "The server is erroneously configured.") ext = base[p + 1:] if not ext in self.exts: log.error("unregistered file extension: %s" % ext) return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "The server is erroneously configured.") handler = self.exts[ext] return handler(env, startreq)
def chain(env, startreq): """Chain-loading WSGI handler This handler loads requested files, compiles them and loads them into their own modules. The compiled modules are cached and reused until the file is modified, in which case the previous module is discarded and the new file contents are loaded into a new module in its place. When chaining such modules, an object named `wmain' is first looked for and called with no arguments if found. The object it returns is then used as the WSGI application object for that module, which is reused until the module is reloaded. If `wmain' is not found, an object named `application' is looked for instead. If found, it is used directly as the WSGI application object. """ path = env["SCRIPT_FILENAME"] try: mod = getmod(path) except Exception: log.error("Exception occurred when loading %s" % path, exc_info=sys.exc_info()) return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "Could not load WSGI handler.") entry = None if mod is not None: mod.lock.acquire() try: if hasattr(mod, "entry"): entry = mod.entry else: if hasattr(mod.mod, "wmain"): entry = mod.mod.wmain() elif hasattr(mod.mod, "application"): entry = mod.mod.application mod.entry = entry finally: mod.lock.release() if entry is not None: return entry(env, startreq) return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "Invalid WSGI handler.")