mirror of
https://github.com/buger/goreplay.git
synced 2024-04-21 12:32:02 +00:00
77 lines
1.9 KiB
Python
77 lines
1.9 KiB
Python
#! /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()
|