]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Freeze the iostream write buffer when send() returns 0.
authorBen Darnell <ben@bendarnell.com>
Sun, 15 May 2011 04:18:11 +0000 (21:18 -0700)
committerBen Darnell <ben@bendarnell.com>
Sun, 15 May 2011 04:18:11 +0000 (21:18 -0700)
tornado/iostream.py

index 812d5f6dcf5f763d236e0590ebfdb3c203207a42..3a9efcfef2a19dc0754d1d45f3c1e1d996cb2689 100644 (file)
@@ -357,21 +357,24 @@ class IOStream(object):
                     # with more than 128KB at a time.
                     _merge_prefix(self._write_buffer, 128 * 1024)
                 num_bytes = self.socket.send(self._write_buffer[0])
-                self._write_buffer_frozen = False
-                _merge_prefix(self._write_buffer, num_bytes)
-                self._write_buffer.popleft()
-            except socket.error, e:
-                if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN):
-                    # With OpenSSL, after send returns EWOULDBLOCK,
+                if num_bytes == 0:
+                    # With OpenSSL, if we couldn't write the entire buffer,
                     # the very same string object must be used on the
                     # next call to send.  Therefore we suppress
-                    # merging the write buffer after an EWOULDBLOCK.
+                    # merging the write buffer after an incomplete send.
                     # A cleaner solution would be to set
                     # SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER, but this is
                     # not yet accessible from python
                     # (http://bugs.python.org/issue8240)
                     self._write_buffer_frozen = True
                     break
+                self._write_buffer_frozen = False
+                _merge_prefix(self._write_buffer, num_bytes)
+                self._write_buffer.popleft()
+            except socket.error, e:
+                if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN):
+                    self._write_buffer_frozen = True
+                    break
                 else:
                     logging.warning("Write error on %d: %s",
                                     self.socket.fileno(), e)