mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Content server: Fix dual stack sockets not working on Windows
This commit is contained in:
parent
b00246070e
commit
5eafba6889
@ -28,6 +28,7 @@ from calibre.utils.mdns import get_external_ip
|
|||||||
|
|
||||||
READ, WRITE, RDWR, WAIT = 'READ', 'WRITE', 'RDWR', 'WAIT'
|
READ, WRITE, RDWR, WAIT = 'READ', 'WRITE', 'RDWR', 'WAIT'
|
||||||
WAKEUP, JOB_DONE = bytes(bytearray(xrange(2)))
|
WAKEUP, JOB_DONE = bytes(bytearray(xrange(2)))
|
||||||
|
IPPROTO_IPV6 = getattr(socket, "IPPROTO_IPV6", 41)
|
||||||
|
|
||||||
|
|
||||||
class ReadBuffer(object): # {{{
|
class ReadBuffer(object): # {{{
|
||||||
@ -485,8 +486,7 @@ class ServerLoop(object):
|
|||||||
if (hasattr(socket, 'AF_INET6') and self.socket.family == socket.AF_INET6 and
|
if (hasattr(socket, 'AF_INET6') and self.socket.family == socket.AF_INET6 and
|
||||||
self.bind_address[0] in ('::', '::0', '::0.0.0.0')):
|
self.bind_address[0] in ('::', '::0', '::0.0.0.0')):
|
||||||
try:
|
try:
|
||||||
self.socket.setsockopt(
|
self.socket.setsockopt(IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
|
||||||
socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
|
|
||||||
except (AttributeError, socket.error):
|
except (AttributeError, socket.error):
|
||||||
# Apparently, the socket option is not available in
|
# Apparently, the socket option is not available in
|
||||||
# this machine's TCP stack
|
# this machine's TCP stack
|
||||||
|
@ -127,15 +127,18 @@ class LoopTest(BaseTest):
|
|||||||
self.assertTrue(b.stopped.wait(5), 'BonJour not stopped')
|
self.assertTrue(b.stopped.wait(5), 'BonJour not stopped')
|
||||||
|
|
||||||
def test_dual_stack(self):
|
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:
|
with TestServer(lambda data:(data.path[0] + data.read()), listen_on='::') as server:
|
||||||
self.ae(server.address[0], '::')
|
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'):
|
for interface in ('::1', '127.0.0.1'):
|
||||||
conn = server.connect(interface=interface)
|
conn = server.connect(interface=interface)
|
||||||
conn.request('GET', '/test', 'body')
|
conn.request('GET', '/test', 'body')
|
||||||
r = conn.getresponse()
|
r = conn.getresponse()
|
||||||
self.ae(r.status, httplib.OK)
|
self.ae(r.status, httplib.OK)
|
||||||
self.ae(r.read(), b'testbody')
|
self.ae(r.read(), b'testbody')
|
||||||
|
r.close()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
def test_ring_buffer(self):
|
def test_ring_buffer(self):
|
||||||
'Test the ring buffer used for reads'
|
'Test the ring buffer used for reads'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user