Handle more DNS requests via one TCP connection

This commit is contained in:
spm committed 2026-01-29 15:58:32 +01:00
1 parent a9dbbe8c88
commit 0d041a0830
1 file changed
+27 -15
@@ -1,5 +1,6 @@
import logging import logging
import socketserver import socketserver
import socket
import os import os
import threading import threading
import dns.query import dns.query
@@ -61,7 +62,7 @@ class CatalogZone:
cls._serial_obj = 1 cls._serial_obj = 1
cls._serial_obj.save() cls._serial_obj.save()
logger.debug( logger.debug(
f"Catalog zone SOA serial number incremented to {_serial_obj.value}" f"Catalog zone SOA serial number incremented to {cls._serial_obj.value}"
) )
@classmethod @classmethod
@@ -550,22 +551,33 @@ class TCPRequestHandler(DNSBaseRequestHandler):
def handle(self): def handle(self):
peer = self.client_address[0] peer = self.client_address[0]
sock = self.request # TCP socket
sock.settimeout(10.0) # Default 10 second timeout for inactivity
try: try:
# Receive the entire message.... while True:
sock = self.request # TCP socket # Read 2-byte length prefix
# Read 2-byte length prefix length_data = sock.recv(2)
length_data = sock.recv(2) if not length_data:
if len(length_data) < 2: return # connection closed by peer
return if len(length_data) < 2:
length = int.from_bytes(length_data, byteorder="big") # Incomplete length data, wait for more or fail
wire = b"" while len(length_data) < 2:
while len(wire) < length: chunk = sock.recv(2 - len(length_data))
chunk = sock.recv(length - len(wire)) if not chunk:
if not chunk: return
return # connection closed length_data += chunk
wire += chunk
self.handle_dns_query(wire)
length = int.from_bytes(length_data, byteorder="big")
wire = b""
while len(wire) < length:
chunk = sock.recv(length - len(wire))
if not chunk:
return # connection closed
wire += chunk
self.handle_dns_query(wire)
except socket.timeout:
logger.debug(f"Connection from {peer} timed out")
except Exception as e: except Exception as e:
logger.error(f"Error handling request from {peer}: {e}") logger.error(f"Error handling request from {peer}: {e}")
import traceback import traceback