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
+15 -3
@@ -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,13 +551,22 @@ class TCPRequestHandler(DNSBaseRequestHandler):
def handle(self): def handle(self):
peer = self.client_address[0] peer = self.client_address[0]
try:
# Receive the entire message....
sock = self.request # TCP socket sock = self.request # TCP socket
sock.settimeout(10.0) # Default 10 second timeout for inactivity
try:
while True:
# Read 2-byte length prefix # Read 2-byte length prefix
length_data = sock.recv(2) length_data = sock.recv(2)
if not length_data:
return # connection closed by peer
if len(length_data) < 2: if len(length_data) < 2:
# Incomplete length data, wait for more or fail
while len(length_data) < 2:
chunk = sock.recv(2 - len(length_data))
if not chunk:
return return
length_data += chunk
length = int.from_bytes(length_data, byteorder="big") length = int.from_bytes(length_data, byteorder="big")
wire = b"" wire = b""
while len(wire) < length: while len(wire) < length:
@@ -566,6 +576,8 @@ class TCPRequestHandler(DNSBaseRequestHandler):
wire += chunk wire += chunk
self.handle_dns_query(wire) 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