python: Added some SCGI fixes apparently necessary for Jython.
[ashd.git] / python / ashd / scgi.py
index 0bc7a57..f7ba3a8 100644 (file)
@@ -37,7 +37,8 @@ def readhead(sk):
 class reqthread(threading.Thread):
     def __init__(self, sk, handler):
         super(reqthread, self).__init__(name = "SCGI request handler")
-        self.sk = sk.dup().makefile("r+")
+        self.bsk = sk.dup()
+        self.sk = self.bsk.makefile("r+")
         self.handler = handler
 
     def run(self):
@@ -46,6 +47,7 @@ class reqthread(threading.Thread):
             self.handler(head, self.sk)
         finally:
             self.sk.close()
+            self.bsk.close()
 
 def handlescgi(sk, handler):
     t = reqthread(sk, handler)
@@ -84,16 +86,19 @@ def wrapwsgi(handler):
                     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")
+                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:
-                flushreq()
                 sk.write(data)
                 sk.flush()
             except IOError:
@@ -114,10 +119,13 @@ def wrapwsgi(handler):
 
         respiter = handler(env, startreq)
         try:
-            for data in respiter:
-                write(data)
-            if resp:
-                flushresp()
+            try:
+                for data in respiter:
+                    write(data)
+                if resp:
+                    flushreq()
+            except closed:
+                pass
         finally:
             if hasattr(respiter, "close"):
                 respiter.close()