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):
try:
if socket.has_ipv6:
protocol_family = socket.AF_INET6
self.create_socket(socket.AF_INET6, socket.SOCK_STREAM)
else:
protocol_family = socket.AF_INET
self.create_socket(protocol_family, socket.SOCK_STREAM)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.bind((self._format_hostname(settings.SERVER_HOSTNAME),
settings.SERVER_PORT))
hostname = self._format_hostname(settings.SERVER_HOSTNAME)
port = settings.SERVER_PORT
logger.debug(u'Binding to [%s]:%s', hostname, port)
self.bind((hostname, port))
self.listen(1)
logger.info(u'MPD server running at [%s]:%s',
self._format_hostname(settings.SERVER_HOSTNAME),
@ -58,7 +59,8 @@ class MpdServer(asyncore.dispatcher):
self.close()
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
return hostname

View File

@ -1,20 +1,25 @@
import unittest
from mopidy.mpd.server import MpdServer, MpdSession
from mopidy.mpd import server
class MpdServerTest(unittest.TestCase):
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'),
'::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
self.assertEquals(self.server._format_hostname('0.0.0.0'), '0.0.0.0')
class MpdSessionTest(unittest.TestCase):
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):
# Pressing Ctrl+C in a telnet session sends a 0xff byte to the server.