[Checkins] SVN: Sandbox/J1m/resumelb/src/zc/resumelb/lb.py Take a little more care to make sure reader queue is cleaned up when a

Jim Fulton jim at zope.com
Sun Feb 5 21:10:37 UTC 2012


Log message for revision 124308:
  Take a little more care to make sure reader queue is cleaned up when a
  request ends in an unusual way.
  

Changed:
  U   Sandbox/J1m/resumelb/src/zc/resumelb/lb.py

-=-
Modified: Sandbox/J1m/resumelb/src/zc/resumelb/lb.py
===================================================================
--- Sandbox/J1m/resumelb/src/zc/resumelb/lb.py	2012-02-05 20:58:09 UTC (rev 124307)
+++ Sandbox/J1m/resumelb/src/zc/resumelb/lb.py	2012-02-05 21:10:36 UTC (rev 124308)
@@ -283,37 +283,43 @@
         rno = self.nrequest + 1
         self.nrequest = rno % self.maxrno
         get = self.start(rno)
+        try:
+            self.put((rno, env))
+            content_length = int(env.get('CONTENT_LENGTH', 0))
+            while content_length > 0:
+                data = input.read(min(content_length, block_size))
+                if not data:
+                    # Browser disconnected, cancel the request
+                    self.put((rno, None))
+                    self.end(rno)
+                    return
+                content_length -= len(data)
+                self.put((rno, data))
+            self.put((rno, ''))
 
-        self.put((rno, env))
-        content_length = int(env.get('CONTENT_LENGTH', 0))
-        while content_length > 0:
-            data = input.read(min(content_length, block_size))
-            if not data:
-                # Browser disconnected, cancel the request
-                self.put((rno, None))
-                self.end(rno)
-                return
-            content_length -= len(data)
-            self.put((rno, data))
-        self.put((rno, ''))
+            data = get()
+            if data is None:
+                raise zc.resumelb.util.Disconnected()
+            logger.debug('start_response %r', data)
+            start_response(*data)
+        except:
+            # not using finally here, because we only want to end on error
+            self.end(rno)
+            raise
 
-        data = get()
-        if data is None:
-            raise zc.resumelb.util.Disconnected()
-        logger.debug('start_response %r', data)
-        start_response(*data)
-
         def content():
-            while 1:
-                data = get()
-                if data:
-                    logger.debug('yield %r', data)
-                    yield data
-                elif data is None:
-                    raise zc.resumelb.util.Disconnected()
-                else:
-                    self.end(rno)
-                    break
+            try:
+                while 1:
+                    data = get()
+                    if data:
+                        logger.debug('yield %r', data)
+                        yield data
+                    elif data is None:
+                        raise zc.resumelb.util.Disconnected()
+                    else:
+                        break
+            finally:
+                self.end(rno)
 
         return content()
 



More information about the checkins mailing list