From 16559725b09cd95c7f73cf32e38643ecfc15ba4c Mon Sep 17 00:00:00 2001 From: henrietta <piotr.maslanka@henrietta.com.pl> Date: Mon, 7 Jan 2013 01:06:05 +0100 Subject: [PATCH] failures on accept() resolved nicely --- network/selectloop.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/network/selectloop.py b/network/selectloop.py index 2808ca24..9e3bdef2 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() -- GitLab