From 9904eff50082227552f0c58a4a026d4fe53e905d Mon Sep 17 00:00:00 2001 From: Oleksander Piskun Date: Fri, 14 Aug 2026 11:57:51 +0000 Subject: [PATCH] fix: write each SPOP frame with a single socket write Signed-off-by: Oleksander Piskun --- haproxyspoa/spoa_frame.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/haproxyspoa/spoa_frame.py b/haproxyspoa/spoa_frame.py index a36583e..5248904 100644 --- a/haproxyspoa/spoa_frame.py +++ b/haproxyspoa/spoa_frame.py @@ -103,9 +103,10 @@ async def write_frame(self, writer: asyncio.StreamWriter): frame_payload_bytes = self.payload.getvalue() frame_length = len(frame_header_bytes) + len(frame_payload_bytes) - writer.write(frame_length.to_bytes(4, byteorder='big')) - writer.write(frame_header_bytes) - writer.write(frame_payload_bytes) + # Emit the whole frame in a single write so it leaves as one TCP segment + # whenever it fits: HAProxy 3.2+ (rewritten SPOP mux) intermittently resets + # connections whose AGENT-HELLO arrives split across several segments. + writer.write(frame_length.to_bytes(4, byteorder='big') + frame_header_bytes + frame_payload_bytes) await writer.drain()