From a743592a6ad328196bb443986b9d43ca4be44989 Mon Sep 17 00:00:00 2001 From: redbo Date: Fri, 7 Jan 2011 12:44:41 +0000 Subject: [PATCH] Stop wsgi server from blowing up when given an ipv6 socket --- eventlet/wsgi.py | 4 ++-- tests/wsgi_test.py | 21 ++++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/eventlet/wsgi.py b/eventlet/wsgi.py index 54adf02..a098628 100644 --- a/eventlet/wsgi.py +++ b/eventlet/wsgi.py @@ -417,7 +417,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler): env['CONTENT_LENGTH'] = length env['SERVER_PROTOCOL'] = 'HTTP/1.0' - host, port = self.request.getsockname() + host, port = self.request.getsockname()[:2] env['SERVER_NAME'] = host env['SERVER_PORT'] = str(port) env['REMOTE_ADDR'] = self.client_address[0] @@ -569,7 +569,7 @@ def server(sock, site, else: pool = greenpool.GreenPool(max_size) try: - host, port = sock.getsockname() + host, port = sock.getsockname()[:2] port = ':%s' % (port, ) if hasattr(sock, 'do_handshake'): scheme = 'https' diff --git a/tests/wsgi_test.py b/tests/wsgi_test.py index 6ca068b..c6fc3af 100644 --- a/tests/wsgi_test.py +++ b/tests/wsgi_test.py @@ -1138,7 +1138,26 @@ class TestChunkedInput(_TestBase): assert not got_signal, "caught alarm signal. infinite loop detected." - + def test_ipv6(self): + try: + sock = eventlet.listen(('::1', 0), family=socket.AF_INET6) + except (socket.gaierror, socket.error): # probably no ipv6 + return + log = StringIO() + # first thing the server does is try to log the IP it's bound to + def run_server(): + try: + server = wsgi.server(sock=sock, log=log, site=Site()) + except ValueError: + log.write('broked') + eventlet.spawn_n(run_server) + logval = log.getvalue() + while not logval: + eventlet.sleep(0.0) + logval = log.getvalue() + if 'broked' in logval: + self.fail('WSGI server raised exception with ipv6 socket') + if __name__ == '__main__': main()