|
@@ -103,32 +103,10 @@ class TestProxy(unittest.TestCase): |
|
|
self.assertEqual(cm.exception.args[0], 5) |
|
|
self.assertEqual(cm.exception.args[0], 5) |
|
|
|
|
|
|
|
|
@async_test |
|
|
@async_test |
|
|
async def test_many_of_responses_with_small_socket_buffer(self): |
|
|
|
|
|
|
|
|
async def test_many_responses_with_small_socket_buffer(self): |
|
|
resolve, clear_cache = get_resolver(53) |
|
|
resolve, clear_cache = get_resolver(53) |
|
|
self.add_async_cleanup(clear_cache) |
|
|
self.add_async_cleanup(clear_cache) |
|
|
|
|
|
|
|
|
def get_small_socket(): |
|
|
|
|
|
sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM) |
|
|
|
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2000) |
|
|
|
|
|
sock.setblocking(False) |
|
|
|
|
|
sock.bind(('', 53)) |
|
|
|
|
|
return sock |
|
|
|
|
|
|
|
|
|
|
|
def get_fixed_resolver(): |
|
|
|
|
|
async def get_host(_, fqdn, qtype): |
|
|
|
|
|
hosts = { |
|
|
|
|
|
b'www.google.com': { |
|
|
|
|
|
TYPES.A: IPv4AddressExpiresAt('1.2.3.4', expires_at=0), |
|
|
|
|
|
}, |
|
|
|
|
|
} |
|
|
|
|
|
try: |
|
|
|
|
|
return hosts[fqdn.lower()][qtype] |
|
|
|
|
|
except KeyError: |
|
|
|
|
|
print('NONE!') |
|
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
|
|
return Resolver(get_host=get_host) |
|
|
|
|
|
|
|
|
|
|
|
start = DnsProxy(rules=((r'(^.*$)', r'\1'),), get_socket=get_small_socket, |
|
|
start = DnsProxy(rules=((r'(^.*$)', r'\1'),), get_socket=get_small_socket, |
|
|
get_resolver=get_fixed_resolver) |
|
|
get_resolver=get_fixed_resolver) |
|
|
stop = await start() |
|
|
stop = await start() |
|
@@ -139,11 +117,13 @@ class TestProxy(unittest.TestCase): |
|
|
for _ in range(0, 100000) |
|
|
for _ in range(0, 100000) |
|
|
] |
|
|
] |
|
|
|
|
|
|
|
|
responses = [] |
|
|
|
|
|
for task in tasks: |
|
|
|
|
|
responses.append(await task) |
|
|
|
|
|
|
|
|
responses = await asyncio.gather(*tasks) |
|
|
|
|
|
|
|
|
|
|
|
for response in responses: |
|
|
|
|
|
self.assertEqual(str(response[0]), '1.2.3.4') |
|
|
|
|
|
|
|
|
self.assertEqual(str(responses[0][0]), '1.2.3.4') |
|
|
|
|
|
|
|
|
bing_responses = await resolve('www.bing.com', TYPES.A) |
|
|
|
|
|
self.assertTrue(isinstance(bing_responses[0], IPv4AddressExpiresAt)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_socket(port): |
|
|
def get_socket(port): |
|
@@ -155,9 +135,33 @@ def get_socket(port): |
|
|
return _get_socket |
|
|
return _get_socket |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_small_socket(): |
|
|
|
|
|
# For linux, the minimum buffer size is 1024 |
|
|
|
|
|
sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM) |
|
|
|
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024) |
|
|
|
|
|
sock.setblocking(False) |
|
|
|
|
|
sock.bind(('', 53)) |
|
|
|
|
|
return sock |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_resolver(port, timeout=0.5): |
|
|
def get_resolver(port, timeout=0.5): |
|
|
async def get_nameservers(_, __): |
|
|
async def get_nameservers(_, __): |
|
|
for _ in range(0, 5): |
|
|
for _ in range(0, 5): |
|
|
yield (timeout, ('127.0.0.1', port)) |
|
|
yield (timeout, ('127.0.0.1', port)) |
|
|
|
|
|
|
|
|
return Resolver(get_nameservers=get_nameservers) |
|
|
return Resolver(get_nameservers=get_nameservers) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_fixed_resolver(): |
|
|
|
|
|
async def get_host(_, fqdn, qtype): |
|
|
|
|
|
hosts = { |
|
|
|
|
|
b'www.google.com': { |
|
|
|
|
|
TYPES.A: IPv4AddressExpiresAt('1.2.3.4', expires_at=0), |
|
|
|
|
|
}, |
|
|
|
|
|
} |
|
|
|
|
|
try: |
|
|
|
|
|
return hosts[fqdn.lower()][qtype] |
|
|
|
|
|
except KeyError: |
|
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
|
|
return Resolver(get_host=get_host) |