Implement a basic getaddrinfo() method
Really only properly supports the most basic (IPv4/6) use cases right now
This commit is contained in:
parent
e0ec052e4c
commit
0a76d3a222
35
greendns.py
35
greendns.py
|
@ -4,23 +4,46 @@ import random
|
|||
import socket
|
||||
import sys
|
||||
|
||||
import dns.ipv6
|
||||
import dns.resolver
|
||||
import dns.reversename
|
||||
|
||||
def _gethostsbyname(name):
|
||||
for rdata in dns.resolver.query(name, 'A'):
|
||||
def _records(name, mode):
|
||||
for rdata in dns.resolver.query(name, mode):
|
||||
yield rdata.address
|
||||
|
||||
def _Arecords(name):
|
||||
return _records(name, 'A')
|
||||
|
||||
def _AAAArecords(name):
|
||||
return _records(name, 'AAAA')
|
||||
|
||||
def gethostbyname(name):
|
||||
## NOTE: Still not entirely sure how `socket.gethostbyname`
|
||||
## returns a single A record for an address with multiple records
|
||||
return random.choice(list(_gethostsbyname(name)))
|
||||
return random.choice(list(_Arecords(name)))
|
||||
|
||||
def gethostbyname_ex(name):
|
||||
return (name, [], list(_gethostsbyname(name)))
|
||||
return (name, [], list(_Arecords(name)))
|
||||
|
||||
def getaddrinfo(host, port, family=0, socktype=0, proto=0, flags=0):
|
||||
pass
|
||||
info = []
|
||||
socktype = socktype or socket.SOCK_STREAM
|
||||
proto = proto or socket.IPPROTO_TCP
|
||||
|
||||
if family == 0 or family == socket.AF_INET:
|
||||
for record in _Arecords(host):
|
||||
entry = (socket.AF_INET, socktype, proto, '', (record, port))
|
||||
info.append(entry)
|
||||
|
||||
if not socket.has_ipv6 or not family == socket.AF_INET6:
|
||||
return info
|
||||
|
||||
for record in _AAAArecords(host):
|
||||
entry = (socket.AF_INET6, socktype, proto, '', (record, port))
|
||||
info.append(entry)
|
||||
|
||||
return info
|
||||
|
||||
def getfqdn(name=None):
|
||||
if name is None:
|
||||
|
@ -41,7 +64,7 @@ def gethostbyaddr(address):
|
|||
return (name, [], [address])
|
||||
|
||||
_monkeypatchable = ('gethostbyname', 'gethostbyname_ex',
|
||||
'gethostbyaddr',)
|
||||
'gethostbyaddr', 'getaddrinfo', 'getfqdn',)
|
||||
_monkeypatched = None
|
||||
|
||||
def monkeypatch():
|
||||
|
|
|
@ -29,6 +29,9 @@ class GetFQDNTests(unittest.TestCase):
|
|||
class GetAddrInfoTests(unittest.TestCase):
|
||||
def runTest(self):
|
||||
original = socket.getaddrinfo('www.python.org', 80, 0, 0, socket.SOL_TCP)
|
||||
if not socket.has_ipv6:
|
||||
## Filter AF_INET6
|
||||
original = [f for f in original if not f[0] == socket.AF_INET6]
|
||||
new = greendns.getaddrinfo('www.python.org', 80, 0, 0, socket.SOL_TCP)
|
||||
self.assertEquals(new, original)
|
||||
|
||||
|
|
Loading…
Reference in New Issue