python: Handle client-abortion properly when writing the response iterator as well.
authorFredrik Tolf <fredrik@dolda2000.com>
Tue, 12 Apr 2011 07:26:19 +0000 (09:26 +0200)
committerFredrik Tolf <fredrik@dolda2000.com>
Tue, 12 Apr 2011 07:26:19 +0000 (09:26 +0200)
python/ashd-wsgi
python/ashd/scgi.py

index bfc4b42..79aad4f 100755 (executable)
@@ -126,16 +126,19 @@ def dowsgi(req):
                 raise Exception, "Trying to write data before starting response."
             status, headers = resp
             respsent[:] = [True]
-            req.sk.write("HTTP/1.1 %s\n" % status)
-            for nm, val in headers:
-                req.sk.write("%s: %s\n" % (nm, val))
-            req.sk.write("\n")
+            try:
+                req.sk.write("HTTP/1.1 %s\n" % status)
+                for nm, val in headers:
+                    req.sk.write("%s: %s\n" % (nm, val))
+                req.sk.write("\n")
+            except IOError:
+                raise closed()
 
     def write(data):
         if not data:
             return
+        flushreq()
         try:
-            flushreq()
             req.sk.write(data)
             req.sk.flush()
         except IOError:
@@ -156,10 +159,13 @@ def dowsgi(req):
 
     respiter = handler(env, startreq)
     try:
-        for data in respiter:
-            write(data)
-        if resp:
-            flushreq()
+        try:
+            for data in respiter:
+                write(data)
+            if resp:
+                flushreq()
+        except closed:
+            pass
     finally:
         if hasattr(respiter, "close"):
             respiter.close()
index 4583fa7..95325f2 100644 (file)
@@ -84,16 +84,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 +117,13 @@ def wrapwsgi(handler):
 
         respiter = handler(env, startreq)
         try:
-            for data in respiter:
-                write(data)
-            if resp:
-                flushreq()
+            try:
+                for data in respiter:
+                    write(data)
+                if resp:
+                    flushreq()
+            except closed:
+                pass
         finally:
             if hasattr(respiter, "close"):
                 respiter.close()