Only set disconnected time when it is not already set (#237)

Fixes a memory leak where the time would never expire, as well as an additional case where send is called on an already-cleaned-up instance.
This commit is contained in:
Kyle Agronick 2018-11-27 15:20:27 -05:00 committed by Andrew Godwin
parent de15dcb4d1
commit c4125c66d4

View File

@ -176,7 +176,11 @@ class Server(object):
def protocol_disconnected(self, protocol): def protocol_disconnected(self, protocol):
# Set its disconnected time (the loops will come and clean it up) # Set its disconnected time (the loops will come and clean it up)
self.connections[protocol]["disconnected"] = time.time() # Do not set it if it is already set. Overwriting it might
# cause it to never be cleaned up.
# See https://github.com/django/channels/issues/1181
if "disconnected" not in self.connections[protocol]:
self.connections[protocol]["disconnected"] = time.time()
### Internal event/message handling ### Internal event/message handling
@ -208,8 +212,10 @@ class Server(object):
""" """
Coroutine that jumps the reply message from asyncio to Twisted Coroutine that jumps the reply message from asyncio to Twisted
""" """
# Don't do anything if the connection is closed # Don't do anything if the connection is closed or does not exist
if self.connections[protocol].get("disconnected", None): if protocol not in self.connections or self.connections[protocol].get(
"disconnected", None
):
return return
self.check_headers_type(message) self.check_headers_type(message)
# Let the protocol handle it # Let the protocol handle it