X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=python%2Fashd%2Fscgi.py;h=95325f215417e83c064cf94fa6be15589ceebb76;hb=8bb0e3c1a8831f79c263850d87c06195d85b9a0f;hp=9357e9d1b317e829bacc7d77f12884b5a0e18e50;hpb=c06db49a3a4bfbf14b1661b667e1ed1cbab2bcd0;p=ashd.git diff --git a/python/ashd/scgi.py b/python/ashd/scgi.py index 9357e9d..95325f2 100644 --- a/python/ashd/scgi.py +++ b/python/ashd/scgi.py @@ -4,6 +4,10 @@ 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: @@ -74,20 +78,29 @@ def wrapwsgi(handler): resp = [] respsent = [] - def write(data): - if not data: - return + 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") - sk.write(data) - sk.flush() + try: + sk.write("Status: %s\n" % status) + for nm, val in headers: + sk.write("%s: %s\n" % (nm, val)) + sk.write("\n") + except IOError: + raise closed() + + def write(data): + if not data: + return + flushreq() + try: + sk.write(data) + sk.flush() + except IOError: + raise closed() def startreq(status, headers, exc_info = None): if resp: @@ -104,9 +117,13 @@ def wrapwsgi(handler): respiter = handler(env, startreq) try: - for data in respiter: - write(data) - write("") + try: + for data in respiter: + write(data) + if resp: + flushreq() + except closed: + pass finally: if hasattr(respiter, "close"): respiter.close()