diff --git a/examples/middleware/echo.py b/examples/middleware/echo.py new file mode 100644 index 0000000..f8b7c99 --- /dev/null +++ b/examples/middleware/echo.py @@ -0,0 +1,76 @@ +#! /usr/bin/env python3 +# -*- coding: utf-8 -*- + +import sys +import fileinput +import binascii + +# Used to find end of the Headers section +EMPTY_LINE = b'\r\n\r\n' + + +def log(msg): + """ + Logging to STDERR as STDOUT and STDIN used for data transfer + @type msg: str or byte string + @param msg: Message to log to STDERR + """ + try: + msg = str(msg) + '\n' + except: + pass + sys.stderr.write(msg) + sys.stderr.flush() + + +def find_end_of_headers(byte_data): + """ + Finds where the header portion ends and the content portion begins. + @type byte_data: str or byte string + @param byte_data: Hex decoded req or resp string + """ + return byte_data.index(EMPTY_LINE) + 4 + + +def process_stdin(): + """ + Process STDIN and output to STDOUT + """ + for raw_line in fileinput.input(): + + line = raw_line.rstrip() + + # Decode base64 encoded line + decoded = bytes.fromhex(line) + + # Split into metadata and payload, the payload is headers + body + (raw_metadata, payload) = decoded.split(b'\n', 1) + + # Split into headers and payload + headers_pos = find_end_of_headers(payload) + raw_headers = payload[:headers_pos] + raw_content = payload[headers_pos:] + + log('===================================') + request_type_id = int(raw_metadata.split(b' ')[0]) + log('Request type: {}'.format({ + 1: 'Request', + 2: 'Original Request', + 3: 'Replayed Response' + }[request_type_id])) + log('===================================') + + log('Original data:') + log(line) + + log('Decoded request:') + log(decoded) + + encoded = binascii.hexlify(raw_metadata + b'\n' + raw_headers + raw_content).decode('ascii') + log('Encoded data:') + log(encoded) + + sys.stdout.write(encoded + '\n') + +if __name__ == '__main__': + process_stdin()