Content server: Fix dual stack sockets not working on Windows

This commit is contained in:
Kovid Goyal 2019-01-16 10:10:36 +05:30
parent b00246070e
commit 5eafba6889
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 6 additions and 3 deletions

View File

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

View File

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