greendns: Python3 compatibility

This commit is contained in:
Sergey Shepelev
2015-02-25 04:36:46 +03:00
parent 3de49aef13
commit 20a5645aba
3 changed files with 48 additions and 34 deletions

View File

@@ -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

View File

@@ -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()

View File

@@ -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