diff --git a/eventlet/support/greendns.py b/eventlet/support/greendns.py index 5a3f906..5e4d1a4 100644 --- a/eventlet/support/greendns.py +++ b/eventlet/support/greendns.py @@ -251,7 +251,7 @@ class HostsResolver(object): else: cannon = hostname aliases.append(cannon) - for alias, cname in self._aliases.iteritems(): + for alias, cname in six.iteritems(self._aliases): if cannon == cname: aliases.append(alias) aliases.remove(hostname) @@ -385,19 +385,19 @@ def _getaddrinfo_lookup(host, family, flags): addrs = [] if family == socket.AF_UNSPEC: for qfamily in [socket.AF_INET6, socket.AF_INET]: - answer = resolve(host, qfamily, 0) + answer = resolve(host, qfamily, False) if answer.rrset: addrs.extend([rr.address for rr in answer.rrset]) elif family == socket.AF_INET6 and flags & socket.AI_V4MAPPED: - answer = resolve(host, socket.AF_INET6, 0) + answer = resolve(host, socket.AF_INET6, False) if answer.rrset: addrs = [rr.address for rr in answer.rrset] if not addrs or flags & socket.AI_ALL: - answer = resolve(host, socket.AF_INET, 0) + answer = resolve(host, socket.AF_INET, False) if answer.rrset: addrs = ['::ffff:' + rr.address for rr in answer.rrset] else: - answer = resolve(host, family, 0) + answer = resolve(host, family, False) if answer.rrset: addrs = [rr.address for rr in answer.rrset] return str(answer.qname), addrs @@ -412,7 +412,7 @@ def getaddrinfo(host, port, family=0, socktype=0, proto=0, flags=0): allows us to respect all the other arguments like the native OS. """ if isinstance(host, six.string_types): - host = host.encode('idna') + host = host.encode('idna').decode('ascii') if host is not None and not is_ip_addr(host): qname, addrs = _getaddrinfo_lookup(host, family, flags) else: @@ -437,7 +437,7 @@ def getaddrinfo(host, port, family=0, socktype=0, proto=0, flags=0): raise socket.gaierror(socket.EAI_NONAME, 'No address found') if flags & socket.AI_CANONNAME: if not is_ip_addr(qname): - qname = resolve_cname(qname).decode('idna') + qname = resolve_cname(qname).encode('ascii').decode('idna') ai = res[0] res[0] = (ai[0], ai[1], ai[2], qname, ai[4]) return res diff --git a/tests/greendns_test.py b/tests/greendns_test.py index a188f0f..d8112c9 100644 --- a/tests/greendns_test.py +++ b/tests/greendns_test.py @@ -1,3 +1,4 @@ +# coding: utf-8 """Tests for the eventlet.support.greendns module""" import os @@ -7,7 +8,6 @@ import time import tests from tests import mock - try: import dns.rdatatype import dns.rdtypes.IN.A @@ -50,15 +50,15 @@ class TestHostsResolver(tests.LimitedTestCase): @tests.skip_unless(greendns_requirement) def test_readlines_lines(self): hr = self._make_host_resolver() - hr.hosts.write('line0\n') + hr.hosts.write(b'line0\n') hr.hosts.flush() assert hr._readlines() == ['line0'] hr._last_stat = 0 - hr.hosts.write('line1\n') + hr.hosts.write(b'line1\n') hr.hosts.flush() assert hr._readlines() == ['line0', 'line1'] hr._last_stat = 0 - hr.hosts.write('#comment0\nline0\n #comment1\nline1') + hr.hosts.write(b'#comment0\nline0\n #comment1\nline1') assert hr._readlines() == ['line0', 'line1'] @tests.skip_unless(greendns_requirement) @@ -79,8 +79,8 @@ class TestHostsResolver(tests.LimitedTestCase): @tests.skip_unless(greendns_requirement) def test_load_v4_v6_cname_aliases(self): hr = self._make_host_resolver() - hr.hosts.write('1.2.3.4 v4.example.com v4\n' - 'dead:beef::1 v6.example.com v6\n') + hr.hosts.write(b'1.2.3.4 v4.example.com v4\n' + b'dead:beef::1 v6.example.com v6\n') hr.hosts.flush() hr._load() assert hr._v4 == {'v4.example.com': '1.2.3.4', 'v4': '1.2.3.4'} @@ -92,8 +92,8 @@ class TestHostsResolver(tests.LimitedTestCase): @tests.skip_unless(greendns_requirement) def test_load_v6_link_local(self): hr = self._make_host_resolver() - hr.hosts.write('fe80:: foo\n' - 'fe80:dead:beef::1 bar\n') + hr.hosts.write(b'fe80:: foo\n' + b'fe80:dead:beef::1 bar\n') hr.hosts.flush() hr._load() assert not hr._v4 @@ -509,6 +509,37 @@ class TestGetaddrinfo(tests.LimitedTestCase): greendns.resolve_cname = self._old_resolve_cname greendns.socket.getaddrinfo = self._old_orig_getaddrinfo + @tests.skip_unless(greendns_requirement) + def test_getaddrinfo(self): + greendns.resolve = _make_mock_resolve() + greendns.resolve.add('example.com', '127.0.0.2') + greendns.resolve.add('example.com', '::1') + res = greendns.getaddrinfo('example.com', 'ssh') + addr = ('127.0.0.2', 22) + tcp = (socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP, addr) + udp = (socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP, addr) + addr = ('::1', 22, 0, 0) + tcp6 = (socket.AF_INET6, socket.SOCK_STREAM, socket.IPPROTO_TCP, addr) + udp6 = (socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDP, addr) + filt_res = [ai[:3] + (ai[4],) for ai in res] + assert tcp in filt_res + assert udp in filt_res + assert tcp6 in filt_res + assert udp6 in filt_res + + @tests.skip_unless(greendns_requirement) + def test_getaddrinfo_idn(self): + greendns.resolve = _make_mock_resolve() + idn_name = u'евентлет.com' + greendns.resolve.add(idn_name.encode('idna').decode('ascii'), '127.0.0.2') + res = greendns.getaddrinfo(idn_name, 'ssh') + addr = ('127.0.0.2', 22) + tcp = (socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP, addr) + udp = (socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP, addr) + filt_res = [ai[:3] + (ai[4],) for ai in res] + assert tcp in filt_res + assert udp in filt_res + @tests.skip_unless(greendns_requirement) def test_getaddrinfo_inet(self): greendns.resolve = _make_mock_resolve() @@ -531,24 +562,6 @@ class TestGetaddrinfo(tests.LimitedTestCase): assert tcp in [ai[:3] + (ai[4],) for ai in res] assert udp in [ai[:3] + (ai[4],) for ai in res] - @tests.skip_unless(greendns_requirement) - def test_getaddrinfo(self): - greendns.resolve = _make_mock_resolve() - greendns.resolve.add('example.com', '127.0.0.2') - greendns.resolve.add('example.com', '::1') - res = greendns.getaddrinfo('example.com', 'ssh') - addr = ('127.0.0.2', 22) - tcp = (socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP, addr) - udp = (socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP, addr) - addr = ('::1', 22, 0, 0) - tcp6 = (socket.AF_INET6, socket.SOCK_STREAM, socket.IPPROTO_TCP, addr) - udp6 = (socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDP, addr) - filt_res = [ai[:3] + (ai[4],) for ai in res] - assert tcp in filt_res - assert udp in filt_res - assert tcp6 in filt_res - assert udp6 in filt_res - @tests.skip_unless(greendns_requirement) def test_getaddrinfo_only_a_ans(self): greendns.resolve = _make_mock_resolve() diff --git a/tox.ini b/tox.ini index 0795bf7..9aa7070 100644 --- a/tox.ini +++ b/tox.ini @@ -42,8 +42,9 @@ basepython = deps = nose==1.3.1 setuptools==5.4.1 - dns: dnspython==1.12.0 + py27-dns: dnspython==1.12.0 py{26,27}-{selects,poll,epolls}: MySQL-python==1.2.5 + py{34,py}-dns: dnspython3==1.12.0 {selects,poll,epolls}: psycopg2cffi-compat==1.1 {selects,poll,epolls}: pyopenssl==0.13 {selects,poll,epolls}: pyzmq==13.1.0