diff options
| author | Declan Hoare <[email protected]> | 2020-04-16 22:58:21 +1000 |
|---|---|---|
| committer | Declan Hoare <[email protected]> | 2020-04-16 23:10:44 +1000 |
| commit | 7000fce72fbec34c6f4957a59d4146cc7148ee59 (patch) | |
| tree | 5affe93d68a7fbcc6cf85a4d9a3eedecc730d1f7 /payload.py | |
| download | shiftgears-7000fce72fbec34c6f4957a59d4146cc7148ee59.tar.gz shiftgears-7000fce72fbec34c6f4957a59d4146cc7148ee59.tar.bz2 shiftgears-7000fce72fbec34c6f4957a59d4146cc7148ee59.zip | |
Initial Release
Diffstat (limited to 'payload.py')
| -rw-r--r-- | payload.py | 30 |
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) + |
