Currently calling Connection.sendall can cause a loop which re-sends data because __iowait will keep calling _connection.sendall with the same buffer, even if part of it has already been sent.
The fix, I believe, is to have a custom implementation of sendall which loops calling send, something like this:
def sendall(self, buf, flags=0):
while buf:
sent = self.send(buf, flags)
buf = buf[sent:]
(albeit with the extra fiddly bits to make sure it works correctly for memoryview and buffer objects)
Currently calling
Connection.sendall
can cause a loop which re-sends data because__iowait
will keep calling_connection.sendall
with the same buffer, even if part of it has already been sent.The fix, I believe, is to have a custom implementation of
sendall
which loops callingsend
, something like this:(albeit with the extra fiddly bits to make sure it works correctly for
memoryview
andbuffer
objects)See also: https://github.com/gevent/gevent/issues/736