On Fri, 2014-05-23 at 14:42 +0200, Samuel Thibault wrote: > Svante Signell, le Fri 23 May 2014 14:28:49 +0200, a écrit : > > On Fri, 2014-05-23 at 13:58 +0200, Samuel Thibault wrote: > > > Svante Signell, le Fri 23 May 2014 13:45:50 +0200, a écrit : > > > > Index: python-tornado-3.2.0/tornado/iostream.py > > > > =================================================================== > > > > --- python-tornado-3.2.0.orig/tornado/iostream.py > > > > +++ python-tornado-3.2.0/tornado/iostream.py > > > > @@ -748,7 +748,11 @@ class IOStream(BaseIOStream): > > > > self._add_io_state(self.io_loop.WRITE) > > > > > > > > def _handle_connect(self): > > > > - err = self.socket.getsockopt(socket.SOL_SOCKET, > > > > socket.SO_ERROR) > > > > + try: > > > > + err = self.socket.getsockopt(socket.SOL_SOCKET, > > > > socket.SO_ERROR) > > > > + except socket.error as e: > > > > + if e.args[0] == errno.ENOPROTOOPT: > > > > + err = 0 > > > > if err != 0: > > > > self.error = socket.error(err, os.strerror(err)) > > > > # IOLoop implementations may vary: some of them return > > > > > > But if it's another error, err and self.error will not be set. Rather > > > use: > > > > > > @@ -748,7 +748,12 @@ class IOStream(BaseIOStream): > > > self._add_io_state(self.io_loop.WRITE) > > > > > > def _handle_connect(self): > > > - err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) > > > + try: > > > + err = self.socket.getsockopt(socket.SOL_SOCKET, > > > socket.SO_ERROR) > > > + except socket.error as e: > > > + err = e.args[0] > > > + if err == errno.ENOPROTOOPT: > > > + err = 0 > > > if err != 0: > > > self.error = socket.error(err, os.strerror(err)) > > > # IOLoop implementations may vary: some of them return > > > > I thoughts it did exactly the same before, indentation stops at err = 0, > > i.e. outside the exception, so other errors are not affected. > > Other exceptions (with different e.args[0]) will still be caught by > except. Those need to be handled too. > > > But I can do as you wish, just let me know. Otherwise al else > > statement would be needed. > > You can go with an else, yes, but it's simpler the way I proposed.
I still don't see the difference: with try: err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) except socket.error as e: if e.args[0] == errno.ENOPROTOOPT: err = 0 if err != 0: ... the exception handling is only treating the case when e.args[0] == errno.ENOPROTOOPT and an else case would not be needed. For other exceptions there is no explicit handler defined in _handle_connect(self) and err is unchanged, or is python different? In C: if (condition) {do something} do something else No need for an else here Anyway, an updated patch attached.
Index: python-tornado-3.2.0/tornado/netutil.py =================================================================== --- python-tornado-3.2.0.orig/tornado/netutil.py +++ python-tornado-3.2.0/tornado/netutil.py @@ -119,7 +119,11 @@ if hasattr(socket, 'AF_UNIX'): """ sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) set_close_exec(sock.fileno()) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + try: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + except socket.error as e: + if e.args[0] != errno.ENOPROTOOPT: + raise sock.setblocking(0) try: st = os.stat(file) Index: python-tornado-3.2.0/tornado/iostream.py =================================================================== --- python-tornado-3.2.0.orig/tornado/iostream.py +++ python-tornado-3.2.0/tornado/iostream.py @@ -748,7 +748,12 @@ class IOStream(BaseIOStream): self._add_io_state(self.io_loop.WRITE) def _handle_connect(self): - err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) + try: + err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) + except socket.error as e: + err = e.args[0] + if err == errno.ENOPROTOOPT: + err = 0 if err != 0: self.error = socket.error(err, os.strerror(err)) # IOLoop implementations may vary: some of them return