Format IP address to bind to according to available protocol family

This commit is contained in:
Stein Magnus Jodal 2010-06-30 21:49:48 +02:00
parent 22f011d57f
commit 5916646eca
2 changed files with 17 additions and 10 deletions

View File

@ -33,13 +33,14 @@ class MpdServer(asyncore.dispatcher):
def start(self): def start(self):
try: try:
if socket.has_ipv6: if socket.has_ipv6:
protocol_family = socket.AF_INET6 self.create_socket(socket.AF_INET6, socket.SOCK_STREAM)
else: else:
protocol_family = socket.AF_INET self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.create_socket(protocol_family, socket.SOCK_STREAM)
self.set_reuse_addr() self.set_reuse_addr()
self.bind((self._format_hostname(settings.SERVER_HOSTNAME), hostname = self._format_hostname(settings.SERVER_HOSTNAME)
settings.SERVER_PORT)) port = settings.SERVER_PORT
logger.debug(u'Binding to [%s]:%s', hostname, port)
self.bind((hostname, port))
self.listen(1) self.listen(1)
logger.info(u'MPD server running at [%s]:%s', logger.info(u'MPD server running at [%s]:%s',
self._format_hostname(settings.SERVER_HOSTNAME), self._format_hostname(settings.SERVER_HOSTNAME),
@ -58,7 +59,8 @@ class MpdServer(asyncore.dispatcher):
self.close() self.close()
def _format_hostname(self, hostname): def _format_hostname(self, hostname):
if re.match('\d+.\d+.\d+.\d+', hostname) is not None: if (socket.has_ipv6
and re.match('\d+.\d+.\d+.\d+', hostname) is not None):
hostname = '::ffff:%s' % hostname hostname = '::ffff:%s' % hostname
return hostname return hostname

View File

@ -1,20 +1,25 @@
import unittest import unittest
from mopidy.mpd.server import MpdServer, MpdSession from mopidy.mpd import server
class MpdServerTest(unittest.TestCase): class MpdServerTest(unittest.TestCase):
def setUp(self): def setUp(self):
self.server = MpdServer(None) self.server = server.MpdServer(None)
def test_format_hostname_prefixes_ipv4_addresses(self): def test_format_hostname_prefixes_ipv4_addresses_when_ipv6_available(self):
server.socket.has_ipv6 = True
self.assertEqual(self.server._format_hostname('0.0.0.0'), self.assertEqual(self.server._format_hostname('0.0.0.0'),
'::ffff:0.0.0.0') '::ffff:0.0.0.0')
self.assertEqual(self.server._format_hostname('127.0.0.1'), self.assertEqual(self.server._format_hostname('127.0.0.1'),
'::ffff: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
self.assertEquals(self.server._format_hostname('0.0.0.0'), '0.0.0.0')
class MpdSessionTest(unittest.TestCase): class MpdSessionTest(unittest.TestCase):
def setUp(self): def setUp(self):
self.session = MpdSession(None, None, (None, None), None) self.session = server.MpdSession(None, None, (None, None), None)
def test_found_terminator_catches_decode_error(self): def test_found_terminator_catches_decode_error(self):
# Pressing Ctrl+C in a telnet session sends a 0xff byte to the server. # Pressing Ctrl+C in a telnet session sends a 0xff byte to the server.