Stop wsgi server from blowing up when given an ipv6 socket

This commit is contained in:
redbo
2011-01-07 12:44:41 +00:00
parent 5f4ed2ba97
commit a743592a6a
2 changed files with 22 additions and 3 deletions

View File

@@ -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'

View File

@@ -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()