Fixed asyncio crash when sending buffered data after connection was terminated.

This commit is contained in:
Dominik Picheta 2013-10-24 19:02:13 +01:00
commit 09b6b94509

View file

@ -213,6 +213,7 @@ proc asyncSockHandleRead(h: PObject) =
else: else:
PAsyncSocket(h).handleAccept(PAsyncSocket(h)) PAsyncSocket(h).handleAccept(PAsyncSocket(h))
proc close*(sock: PAsyncSocket)
proc asyncSockHandleWrite(h: PObject) = proc asyncSockHandleWrite(h: PObject) =
when defined(ssl): when defined(ssl):
if PAsyncSocket(h).socket.isSSL and not if PAsyncSocket(h).socket.isSSL and not
@ -230,15 +231,19 @@ proc asyncSockHandleWrite(h: PObject) =
else: else:
if PAsyncSocket(h).sendBuffer != "": if PAsyncSocket(h).sendBuffer != "":
let sock = PAsyncSocket(h) let sock = PAsyncSocket(h)
let bytesSent = sock.socket.sendAsync(sock.sendBuffer) try:
assert bytesSent > 0 let bytesSent = sock.socket.sendAsync(sock.sendBuffer)
if bytesSent != sock.sendBuffer.len: assert bytesSent > 0
sock.sendBuffer = sock.sendBuffer[bytesSent .. -1] if bytesSent != sock.sendBuffer.len:
elif bytesSent == sock.sendBuffer.len: sock.sendBuffer = sock.sendBuffer[bytesSent .. -1]
sock.sendBuffer = "" elif bytesSent == sock.sendBuffer.len:
sock.sendBuffer = ""
if PAsyncSocket(h).handleWrite != nil:
PAsyncSocket(h).handleWrite(PAsyncSocket(h)) if PAsyncSocket(h).handleWrite != nil:
PAsyncSocket(h).handleWrite(PAsyncSocket(h))
except EOS, ESSL:
# Most likely the socket closed before the full buffer could be sent to it.
sock.close() # TODO: Provide a handleError for users?
else: else:
if PAsyncSocket(h).handleWrite != nil: if PAsyncSocket(h).handleWrite != nil:
PAsyncSocket(h).handleWrite(PAsyncSocket(h)) PAsyncSocket(h).handleWrite(PAsyncSocket(h))