New submission from Nir Soffer <nir...@gmail.com>: When using asynchat.async_chat channel, and connection is refused, asyncore fail incorrectly.
First, instead of ECONNREFUSED, you get EPIPE, second, you also get a EBADF exception, and finally, the channel handle_close is called twice. The problem is the way asyncore detect a connect event. On the first read event, asyncore set the connected flag to true, and invoke the channel handle_connect method. Typically, the channel will try to push something to the remote endpoint at this point. Since "connected" is true, push() will try to send to the socket, and fail with EPIPE, because the socket is not connected. The socket error in push will invoke the channel handle_error, which typically will call handle_close to close the socket. handle_connect_event will return without any error, because the error was handled inside push. Now asyncore will invoke the channel handle_read method, which fails with bad file descriptor, since the channel closed the socket on the previous error. How should this work correctly? 1. We want to get a connection refused error in this case 2. The failure should cause only single exception 3. The channel should be close once I added these test to test_asyncore.py, and all of them fail with current code. Turns out that single line change fix all the failing tests: set the "connected" state after the call to handle_connect, just like it used to be in 2.5. With this change, when the channel try to push something to the remote endpoint, it will keep it in the fifo, since connected is false. This is also correct, since we will know that we are connected only after handle_read is called. In handle_read, we fail with ECONNREFUSED and close the channel. The fix is tested currently only on Mac OS X 10.5. I have seen this issue also on Ubuntu 9.04. ---------- components: Library (Lib) files: asyncore-handle-connect-event.patch keywords: patch messages: 90830 nosy: nirs severity: normal status: open title: asyncore incorrect failure when connection is refused and using async_chat channel type: behavior versions: Python 2.6 Added file: http://bugs.python.org/file14543/asyncore-handle-connect-event.patch _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue6550> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com