From 754a1c580f818975d227033748dd0d1a18a16e96 Mon Sep 17 00:00:00 2001 From: Michael Woods Date: Sat, 4 Jan 2025 19:56:57 -0500 Subject: [PATCH] Adjusted connection class. overrode send_data data, to break up large frames into chunks of 2k bytes. --- src/packetserver/common/__init__.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/packetserver/common/__init__.py b/src/packetserver/common/__init__.py index 12e8e69..edfbdeb 100644 --- a/src/packetserver/common/__init__.py +++ b/src/packetserver/common/__init__.py @@ -14,6 +14,7 @@ class PacketServerConnection(Connection): connection_subscribers = [] receive_subscribers = [] + max_send_size = 2000 def __init__(self, port, call_from, call_to, incoming=False): super().__init__(port, call_from, call_to, incoming=incoming) @@ -62,7 +63,20 @@ class PacketServerConnection(Connection): def send_data(self, data: Union[bytes, bytearray]): logging.debug(f"sending data: {data}") self.connection_last_activity = datetime.datetime.now(datetime.UTC) - super().send_data(data) + if len(data) > self.max_send_size: + logging.debug(f"Large frame detected {len(data)} breaking it up into chunks") + index = 0 + counter = 0 + while index <= len(data): + logging.debug(f"Sending chunk {counter}") + if (len(data) - index) < self.max_send_size: + super().send_data(data[index:]) + break + super().send_data(data[index:index + self.max_send_size]) + index = index + self.max_send_size + counter = counter + 1 + else: + super().send_data(data) @classmethod def query_accept(cls, port, call_from, call_to): @@ -289,20 +303,27 @@ def send_response(conn: PacketServerConnection, response: Response, original_req if conn.state.name == "CONNECTED" and not conn.closing: # figure out compression setting based on request + logging.debug("Determining compression of response") comp = compression - + logging.debug(f"Default comp: {comp}") + logging.debug(f"Original vars: {original_request.vars}") if 'C' in original_request.vars: + logging.debug(f"Detected compression header in original request: {original_request.vars['C']}") val = original_request.vars['C'] for i in Message.CompressionType: + logging.debug(f"Checking type: {i}") if str(val).strip().upper() == i.name: comp = i + logging.debug(f"matched compression with var to {comp}") break try: if int(val) == i.value: comp = i + logging.debug(f"matched compression with var to {comp}") except ValueError: pass response.compression = comp + logging.debug(f"Final compression: {response.compression}") logging.debug(f"sending response: {response}, {response.compression}, {response.payload}") conn.send_data(response.pack())