44 lines
1.6 KiB
Python
44 lines
1.6 KiB
Python
"""Dump request URL + response body for flows matching a filter substring."""
|
|
import sys, json
|
|
from mitmproxy import io as miio
|
|
from mitmproxy.exceptions import FlowReadException
|
|
|
|
flow_file = sys.argv[1]
|
|
filter_substr = sys.argv[2]
|
|
max_dumps = int(sys.argv[3]) if len(sys.argv) > 3 else 1
|
|
|
|
dumps = 0
|
|
with open(flow_file, "rb") as f:
|
|
reader = miio.FlowReader(f)
|
|
try:
|
|
for flow in reader.stream():
|
|
if not hasattr(flow, "request"):
|
|
continue
|
|
url = flow.request.pretty_url
|
|
if filter_substr not in url:
|
|
continue
|
|
if not flow.response:
|
|
continue
|
|
dumps += 1
|
|
print(f"\n=== {flow.request.method} {url} ===")
|
|
print(f"Status: {flow.response.status_code}")
|
|
print(f"Content-Type: {flow.response.headers.get('Content-Type', '?')}")
|
|
print("--- response (first 4000 chars) ---")
|
|
try:
|
|
body = flow.response.get_text(strict=False)
|
|
if body:
|
|
try:
|
|
parsed = json.loads(body)
|
|
body = json.dumps(parsed, indent=2, ensure_ascii=False)
|
|
except (json.JSONDecodeError, ValueError):
|
|
pass
|
|
print(body[:4000])
|
|
else:
|
|
print("(binary or empty)")
|
|
except Exception as e:
|
|
print(f"[error decoding body: {e}]")
|
|
if dumps >= max_dumps:
|
|
break
|
|
except FlowReadException as e:
|
|
print(f"[warn] flow truncated: {e}", file=sys.stderr)
|