diff --git a/mopidy/frontends/mpd/server.py b/mopidy/frontends/mpd/server.py index 231bdf40..8507e266 100644 --- a/mopidy/frontends/mpd/server.py +++ b/mopidy/frontends/mpd/server.py @@ -9,6 +9,20 @@ from .session import MpdSession logger = logging.getLogger('mopidy.frontends.mpd.server') +def _try_ipv6_socket(): + """Determine if system really supports IPv6""" + if not socket.has_ipv6: + return False + try: + socket.socket(socket.AF_INET6).close() + return True + except IOError, e: + logger.debug(u'Platform supports IPv6, but socket ' + 'creation failed, disabling: %s', e) + return False + +has_ipv6 = _try_ipv6_socket() + class MpdServer(asyncore.dispatcher): """ The MPD server. Creates a :class:`mopidy.frontends.mpd.session.MpdSession` @@ -21,7 +35,7 @@ class MpdServer(asyncore.dispatcher): def start(self): """Start MPD server.""" try: - if socket.has_ipv6: + if has_ipv6: self.create_socket(socket.AF_INET6, socket.SOCK_STREAM) # Explicitly configure socket to work for both IPv4 and IPv6 self.socket.setsockopt( @@ -53,7 +67,7 @@ class MpdServer(asyncore.dispatcher): self.close() def _format_hostname(self, hostname): - if (socket.has_ipv6 + if (has_ipv6 and re.match('\d+.\d+.\d+.\d+', hostname) is not None): hostname = '::ffff:%s' % hostname return hostname diff --git a/tests/frontends/mpd/server_test.py b/tests/frontends/mpd/server_test.py index ef963347..32e90450 100644 --- a/tests/frontends/mpd/server_test.py +++ b/tests/frontends/mpd/server_test.py @@ -10,20 +10,22 @@ class MpdServerTest(unittest.TestCase): self.backend = DummyBackend.start().proxy() self.mixer = DummyMixer.start().proxy() self.server = server.MpdServer() + self.has_ipv6 = server.has_ipv6 def tearDown(self): self.backend.stop().get() self.mixer.stop().get() + server.has_ipv6 = self.has_ipv6 def test_format_hostname_prefixes_ipv4_addresses_when_ipv6_available(self): - server.socket.has_ipv6 = True + server.has_ipv6 = True self.assertEqual(self.server._format_hostname('0.0.0.0'), '::ffff:0.0.0.0') self.assertEqual(self.server._format_hostname('127.0.0.1'), '::ffff:127.0.0.1') def test_format_hostname_does_nothing_when_only_ipv4_available(self): - server.socket.has_ipv6 = False + server.has_ipv6 = False self.assertEquals(self.server._format_hostname('0.0.0.0'), '0.0.0.0') class MpdSessionTest(unittest.TestCase):