|
|
|
|
|
"""mitmproxy addon to capture Kiro IDE AWS requests/responses. |
|
|
|
|
|
This is a development helper (not used by the main KiroProxy app). |
|
|
|
|
|
Install: |
|
|
pip install mitmproxy |
|
|
|
|
|
Run: |
|
|
mitmproxy --mode regular@8888 -s scripts/capture_kiro.py |
|
|
or (no UI): |
|
|
mitmdump --mode regular@8888 -s scripts/capture_kiro.py |
|
|
|
|
|
Then configure your Kiro IDE / system proxy to `127.0.0.1:8888` and install the |
|
|
mitmproxy CA certificate if required (visit http://mitm.it). |
|
|
|
|
|
Output: |
|
|
./kiro_requests/*_request.json |
|
|
./kiro_requests/*_response.json |
|
|
""" |
|
|
|
|
|
from __future__ import annotations |
|
|
|
|
|
import json |
|
|
import os |
|
|
from datetime import datetime |
|
|
|
|
|
from mitmproxy import ctx, http |
|
|
|
|
|
OUTPUT_DIR = "kiro_requests" |
|
|
os.makedirs(OUTPUT_DIR, exist_ok=True) |
|
|
|
|
|
request_count = 0 |
|
|
|
|
|
|
|
|
def request(flow: http.HTTPFlow) -> None: |
|
|
global request_count |
|
|
|
|
|
if "q.us-east-1.amazonaws.com" not in flow.request.host: |
|
|
return |
|
|
|
|
|
request_count += 1 |
|
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") |
|
|
|
|
|
request_data = { |
|
|
"timestamp": timestamp, |
|
|
"method": flow.request.method, |
|
|
"url": flow.request.url, |
|
|
"headers": dict(flow.request.headers), |
|
|
"body": None, |
|
|
} |
|
|
|
|
|
if flow.request.content: |
|
|
try: |
|
|
request_data["body"] = json.loads(flow.request.content.decode("utf-8")) |
|
|
except Exception: |
|
|
request_data["body_raw"] = flow.request.content.decode("utf-8", errors="replace") |
|
|
|
|
|
filename = f"{OUTPUT_DIR}/{timestamp}_{request_count:04d}_request.json" |
|
|
with open(filename, "w", encoding="utf-8") as f: |
|
|
json.dump(request_data, f, indent=2, ensure_ascii=False) |
|
|
|
|
|
ctx.log.info(f"[Kiro] Captured request #{request_count}: {flow.request.method} {flow.request.path}") |
|
|
|
|
|
|
|
|
def response(flow: http.HTTPFlow) -> None: |
|
|
if "q.us-east-1.amazonaws.com" not in flow.request.host: |
|
|
return |
|
|
|
|
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") |
|
|
|
|
|
response_data = { |
|
|
"timestamp": timestamp, |
|
|
"status_code": flow.response.status_code, |
|
|
"headers": dict(flow.response.headers), |
|
|
"body": None, |
|
|
} |
|
|
|
|
|
if flow.response.content: |
|
|
try: |
|
|
response_data["body"] = json.loads(flow.response.content.decode("utf-8")) |
|
|
except Exception: |
|
|
response_data["body_raw_length"] = len(flow.response.content) |
|
|
response_data["body_preview"] = flow.response.content[:2000].decode("utf-8", errors="replace") |
|
|
|
|
|
filename = f"{OUTPUT_DIR}/{timestamp}_{request_count:04d}_response.json" |
|
|
with open(filename, "w", encoding="utf-8") as f: |
|
|
json.dump(response_data, f, indent=2, ensure_ascii=False) |
|
|
|
|
|
ctx.log.info(f"[Kiro] Captured response: {flow.response.status_code}") |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
print( |
|
|
"This file is a mitmproxy addon.\n" |
|
|
"Run: mitmproxy --mode regular@8888 -s scripts/capture_kiro.py\n" |
|
|
"(or mitmdump --mode regular@8888 -s scripts/capture_kiro.py)" |
|
|
) |
|
|
|