Handle more DNS requests via one TCP connection
This commit is contained in:
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
|
||||||
|
|||||||
Reference in new issue
Block a user