diff --git a/eventlet/wsgi.py b/eventlet/wsgi.py index a158b20..e68aa41 100644 --- a/eventlet/wsgi.py +++ b/eventlet/wsgi.py @@ -428,6 +428,7 @@ class Server(BaseHTTPServer.HTTPServer): def log_message(self, message): self.log.write(message + '\n') +ACCEPT_SOCK = set((errno.EPIPE, errno.EBADF)) def server(sock, site, log=None, @@ -477,7 +478,7 @@ def server(sock, site, try: client_socket = sock.accept() except socket.error, e: - if getattr(e, 'errno', 0) not in BAD_SOCK + BROKEN_SOCK: + if getattr(e, 'errno', 0) not in ACCEPT_SOCK: raise pool.execute_async(serv.process_request, client_socket) except (KeyboardInterrupt, SystemExit): diff --git a/tests/wsgi_test.py b/tests/wsgi_test.py index 615d64f..c938f16 100644 --- a/tests/wsgi_test.py +++ b/tests/wsgi_test.py @@ -1,12 +1,15 @@ import cgi +import errno import os import socket +import sys from tests import skipped, LimitedTestCase from unittest import main from eventlet import api from eventlet import util from eventlet import greenio +from eventlet.green import socket as greensocket from eventlet import wsgi from eventlet import processes @@ -553,6 +556,31 @@ class TestHttpd(LimitedTestCase): self.assertEquals(fd.read(7), 'testing') fd.close() - + def test_025_accept_errors(self): + api.kill(self.killer) + listener = greensocket.socket() + listener.bind(('localhost', 0)) + # NOT calling listen, to trigger the error + self.port = listener.getsockname()[1] + self.killer = api.spawn( + wsgi.server, + listener, + self.site, + max_size=128, + log=self.logfile) + old_stderr = sys.stderr + try: + sys.stderr = self.logfile + try: + api.connect_tcp(('localhost', self.port)) + self.fail("Didn't expect to connect") + except socket.error, exc: + self.assertEquals(exc.errno, errno.ECONNREFUSED) + + self.assert_('Invalid argument' in self.logfile.getvalue(), + self.logfile.getvalue()) + finally: + sys.stderr = old_stderr + if __name__ == '__main__': main()