aboutsummaryrefslogtreecommitdiff
path: root/payload.py
diff options
context:
space:
mode:
authorDeclan Hoare <[email protected]>2020-04-16 22:58:21 +1000
committerDeclan Hoare <[email protected]>2020-04-16 23:10:44 +1000
commit7000fce72fbec34c6f4957a59d4146cc7148ee59 (patch)
tree5affe93d68a7fbcc6cf85a4d9a3eedecc730d1f7 /payload.py
downloadshiftgears-7000fce72fbec34c6f4957a59d4146cc7148ee59.tar.gz
shiftgears-7000fce72fbec34c6f4957a59d4146cc7148ee59.tar.bz2
shiftgears-7000fce72fbec34c6f4957a59d4146cc7148ee59.zip
Initial Release
Diffstat (limited to 'payload.py')
-rw-r--r--payload.py30
1 files changed, 30 insertions, 0 deletions
diff --git a/payload.py b/payload.py
new file mode 100644
index 0000000..36f33ba
--- /dev/null
+++ b/payload.py
@@ -0,0 +1,30 @@
+
+import struct
+
+from twisted.internet.protocol import Protocol
+
+s32 = struct.Struct("<i")
+
+class PayloadStream(Protocol):
+ """'Payloads' are length-prefixed binary blobs used in NetSockets."""
+ def __init__(self):
+ self.__length = None
+ self.__buffer = b""
+ def dataReceived(self, data):
+ self.__buffer += data
+ while True:
+ if self.__length is None and len(self.__buffer) >= 4:
+ self.__length = s32.unpack(self.__buffer[:4])[0]
+ self.__buffer = self.__buffer[4:]
+ if self.__length < 0:
+ raise ValueError(f"Invalid (negative) payload length {self.__length}")
+ if self.__length is not None and len(self.__buffer) >= self.__length:
+ payload = self.__buffer[:self.__length]
+ self.__buffer = self.__buffer[self.__length:]
+ self.__length = None
+ self.payloadReceived(payload)
+ continue
+ break
+ def sendPayload(self, data):
+ self.transport.write(s32.pack(len(data)) + data)
+