X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=python%2Fashd%2Fscgi.py;h=1f0c5abb7004e64703435176fce269cb70b4b677;hb=bcad6b0c48d516ddc920b52f06083ceaa242e1ca;hp=4583fa73769e0ec6f94f5f71bf511e878d9d32d8;hpb=1b16086880096c31abd31fa2dae40e5b36789162;p=ashd.git diff --git a/python/ashd/scgi.py b/python/ashd/scgi.py index 4583fa7..1f0c5ab 100644 --- a/python/ashd/scgi.py +++ b/python/ashd/scgi.py @@ -1,13 +1,6 @@ -import sys -import threading - class protoerr(Exception): pass -class closed(IOError): - def __init__(self): - super(closed, self).__init__("The client has closed the connection.") - def readns(sk): hln = 0 while True: @@ -33,92 +26,3 @@ def readhead(sk): ret[parts[i]] = parts[i + 1] i += 2 return ret - -class reqthread(threading.Thread): - def __init__(self, sk, handler): - super(reqthread, self).__init__(name = "SCGI request handler") - self.sk = sk.dup().makefile("r+") - self.handler = handler - - def run(self): - try: - head = readhead(self.sk) - self.handler(head, self.sk) - finally: - self.sk.close() - -def handlescgi(sk, handler): - t = reqthread(sk, handler) - t.start() - -def servescgi(socket, handler): - while True: - nsk, addr = socket.accept() - try: - handlescgi(nsk, handler) - finally: - nsk.close() - -def wrapwsgi(handler): - def handle(head, sk): - env = dict(head) - env["wsgi.version"] = 1, 0 - if "HTTP_X_ASH_PROTOCOL" in env: - env["wsgi.url_scheme"] = env["HTTP_X_ASH_PROTOCOL"] - elif "HTTPS" in env: - env["wsgi.url_scheme"] = "https" - else: - env["wsgi.url_scheme"] = "http" - env["wsgi.input"] = sk - env["wsgi.errors"] = sys.stderr - env["wsgi.multithread"] = True - env["wsgi.multiprocess"] = False - env["wsgi.run_once"] = False - - resp = [] - respsent = [] - - def flushreq(): - if not respsent: - if not resp: - raise Exception, "Trying to write data before starting response." - status, headers = resp - respsent[:] = [True] - sk.write("Status: %s\n" % status) - for nm, val in headers: - sk.write("%s: %s\n" % (nm, val)) - sk.write("\n") - - def write(data): - if not data: - return - try: - flushreq() - sk.write(data) - sk.flush() - except IOError: - raise closed() - - def startreq(status, headers, exc_info = None): - if resp: - if exc_info: # Interesting, this... - try: - if respsent: - raise exc_info[0], exc_info[1], exc_info[2] - finally: - exc_info = None # CPython GC bug? - else: - raise Exception, "Can only start responding once." - resp[:] = status, headers - return write - - respiter = handler(env, startreq) - try: - for data in respiter: - write(data) - if resp: - flushreq() - finally: - if hasattr(respiter, "close"): - respiter.close() - return handle