diff --git a/network/selectloop.py b/network/selectloop.py index 2808ca2418bc6cad39651a335bb987ea3ef0daae..9e3bdef2f6ac0b204d2eb140d0816ca9c64f6b1e 100644 --- a/network/selectloop.py +++ b/network/selectloop.py @@ -19,6 +19,8 @@ class SelectLoop(BaseThread): * select's on the sockets, closing and removing failed ones as necessary * dispatches on_read and on_write, accepts connections. if those calls throw ConnectionFailedException, they will be closed + if you are doing something THAT fancy that server socket accept() may fail (eg. SSL), you have + to throw ConnectionFailedException in your on_accept() if that happens - when terminated, invokes on_cleanup() - remaining client sockets are closed. Server socket is NOT CLOSED. @@ -45,7 +47,7 @@ class SelectLoop(BaseThread): @type sock: L{satella.network.socket.BaseSocket} descendants""" self.external_accepts.put(sock) - def on_accept(self, socket, addr): + def on_accept(self, server_socket): """ Override this. @param socket: raw socket object @@ -54,7 +56,7 @@ class SelectLoop(BaseThread): @return: new L{satella.network.socket.BaseSocket} or None, if socket is to be forgotten (it can be returned later by send_socket) """ - return BaseSocket(socket) + return BaseSocket(server_socket.accept()[0]) def on_startup(self): """Override this. Called before the loop starts iterating, in new thread-context""" @@ -122,9 +124,13 @@ class SelectLoop(BaseThread): for sock in rs: # analyze sockets ready to be read if sock == self.server_socket: # accepting - n_sock = self.on_accept(*sock.accept()) - if n_sock != None: # socket returned - self.client_sockets.append(n_sock) + try: + n_sock = self.on_accept(sock) + except ConnectionFailedException: + pass + else: + if n_sock != None: # socket returned + self.client_sockets.append(n_sock) else: # just a civilian socket try: sock.on_read()