chore: initial commit — recon artifacts + design spec + Phase 1 plan
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
"""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)
|
||||
Reference in New Issue
Block a user