Expanded to support large responses.

This commit is contained in:
Discsearcher
2026-08-11 23:37:35 -04:00
parent c3fcf8b3e7
commit 77066ec15f
+14 -3
View File
@@ -10,6 +10,7 @@ from dns import message
from dns import query from dns import query
from dns import rdatatype from dns import rdatatype
from dns import name from dns import name
from dns import flags
# Get list of supported record types # Get list of supported record types
supported_types = sorted([rdatatype.to_text(rdtype) for rdtype in rdatatype.RdataType]) supported_types = sorted([rdatatype.to_text(rdtype) for rdtype in rdatatype.RdataType])
@@ -91,8 +92,14 @@ def perform_query(full_domain, ns, record_type):
try: try:
qname = name.from_text(full_domain) qname = name.from_text(full_domain)
q = message.make_query(qname, record_type) q = message.make_query(qname, record_type)
# Try UDP first
r = query.udp(q, ns) r = query.udp(q, ns)
# If truncated, retry with TCP to get all results
if r.flags & flags.TC:
r = query.tcp(q, ns)
results = [] results = []
answers = r.answer answers = r.answer
if answers: if answers:
@@ -145,7 +152,7 @@ with ThreadPoolExecutor(max_workers=thread_count) as executor:
for future in futures: for future in futures:
full_domain, ns, resolved_ips = future.result() full_domain, ns, resolved_ips = future.result()
if resolved_ips: if resolved_ips:
results_map[(full_domain, ns)] = resolved_ips[0] # Use first result results_map[(full_domain, ns)] = resolved_ips
# Build the output structure # Build the output structure
output = {} output = {}
@@ -170,12 +177,16 @@ for full_domain in full_domains:
for ns in all_nameservers: for ns in all_nameservers:
provider = nameserver_map.get(ns) provider = nameserver_map.get(ns)
if (full_domain, ns) in results_map: if (full_domain, ns) in results_map:
output[full_domain]["records"][provider][ns] = results_map[(full_domain, ns)] results = sorted(results_map[(full_domain, ns)])
# Store as single value if only one result, otherwise as array
output[full_domain]["records"][provider][ns] = results[0] if len(results) == 1 else results
else: else:
# Flat structure for manual nameservers only # Flat structure for manual nameservers only
for ns in all_nameservers: for ns in all_nameservers:
if (full_domain, ns) in results_map: if (full_domain, ns) in results_map:
output[full_domain]["records"][ns] = results_map[(full_domain, ns)] results = sorted(results_map[(full_domain, ns)])
# Store as single value if only one result, otherwise as array
output[full_domain]["records"][ns] = results[0] if len(results) == 1 else results
# Calculate and add timing information # Calculate and add timing information
end_time = time.time() end_time = time.time()