diff --git a/src/calibre/srv/loop.py b/src/calibre/srv/loop.py index 2d489b7c5a..1a60c1adc3 100644 --- a/src/calibre/srv/loop.py +++ b/src/calibre/srv/loop.py @@ -28,6 +28,7 @@ from calibre.utils.mdns import get_external_ip READ, WRITE, RDWR, WAIT = 'READ', 'WRITE', 'RDWR', 'WAIT' WAKEUP, JOB_DONE = bytes(bytearray(xrange(2))) +IPPROTO_IPV6 = getattr(socket, "IPPROTO_IPV6", 41) class ReadBuffer(object): # {{{ @@ -485,8 +486,7 @@ class ServerLoop(object): if (hasattr(socket, 'AF_INET6') and self.socket.family == socket.AF_INET6 and self.bind_address[0] in ('::', '::0', '::0.0.0.0')): try: - self.socket.setsockopt( - socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) + self.socket.setsockopt(IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) except (AttributeError, socket.error): # Apparently, the socket option is not available in # this machine's TCP stack diff --git a/src/calibre/srv/tests/loop.py b/src/calibre/srv/tests/loop.py index a3b1dbb962..695f8f85b7 100644 --- a/src/calibre/srv/tests/loop.py +++ b/src/calibre/srv/tests/loop.py @@ -127,15 +127,18 @@ class LoopTest(BaseTest): self.assertTrue(b.stopped.wait(5), 'BonJour not stopped') def test_dual_stack(self): + from calibre.srv.loop import IPPROTO_IPV6 with TestServer(lambda data:(data.path[0] + data.read()), listen_on='::') as server: self.ae(server.address[0], '::') - self.ae(server.loop.socket.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY), 0) + self.ae(server.loop.socket.getsockopt(IPPROTO_IPV6, socket.IPV6_V6ONLY), 0) for interface in ('::1', '127.0.0.1'): conn = server.connect(interface=interface) conn.request('GET', '/test', 'body') r = conn.getresponse() self.ae(r.status, httplib.OK) self.ae(r.read(), b'testbody') + r.close() + conn.close() def test_ring_buffer(self): 'Test the ring buffer used for reads'