Add core modules: CLI, recorder, server, snapshot manager
This commit is contained in:
85
api_snapshot/recorder/recorder.py
Normal file
85
api_snapshot/recorder/recorder.py
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
import time
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from requests import PreparedRequest, Response
|
||||||
|
|
||||||
|
|
||||||
|
def record_session(
|
||||||
|
url: str,
|
||||||
|
method: str,
|
||||||
|
headers: dict[str, Any] | None = None,
|
||||||
|
body: str | dict[str, Any] | None = None,
|
||||||
|
) -> dict[str, Any]:
|
||||||
|
"""Record a single HTTP request/response session."""
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
|
session = requests.Session()
|
||||||
|
|
||||||
|
req = PreparedRequest()
|
||||||
|
req.prepare_method(method)
|
||||||
|
req.prepare_url(url, None)
|
||||||
|
req.prepare_headers(headers or {})
|
||||||
|
|
||||||
|
if body:
|
||||||
|
if isinstance(body, dict):
|
||||||
|
import json
|
||||||
|
|
||||||
|
req.prepare_body(data=None, json=body)
|
||||||
|
else:
|
||||||
|
req.prepare_body(data=body, json=None)
|
||||||
|
|
||||||
|
response: Response = session.send(request=req, timeout=30)
|
||||||
|
|
||||||
|
end_time = time.time()
|
||||||
|
latency_ms = int((end_time - start_time) * 1000)
|
||||||
|
|
||||||
|
response_body = response.text
|
||||||
|
try:
|
||||||
|
response_body = response.json()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return {
|
||||||
|
"request": {
|
||||||
|
"method": method,
|
||||||
|
"url": url,
|
||||||
|
"headers": dict(req.headers),
|
||||||
|
"body": body,
|
||||||
|
"timestamp": time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime(start_time)),
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"status_code": response.status_code,
|
||||||
|
"headers": dict(response.headers),
|
||||||
|
"body": response_body,
|
||||||
|
"latency_ms": latency_ms,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def record_multiple(
|
||||||
|
requests_config: list[dict[str, Any]],
|
||||||
|
delay: float = 1.0,
|
||||||
|
) -> list[dict[str, Any]]:
|
||||||
|
"""Record multiple HTTP request/response sessions."""
|
||||||
|
results = []
|
||||||
|
|
||||||
|
for req_config in requests_config:
|
||||||
|
url = req_config.get("url", "")
|
||||||
|
method = req_config.get("method", "GET")
|
||||||
|
headers = req_config.get("headers", {})
|
||||||
|
body = req_config.get("body")
|
||||||
|
|
||||||
|
result = record_session(
|
||||||
|
url=url,
|
||||||
|
method=method,
|
||||||
|
headers=headers,
|
||||||
|
body=body,
|
||||||
|
)
|
||||||
|
|
||||||
|
results.append(result)
|
||||||
|
|
||||||
|
if delay > 0:
|
||||||
|
time.sleep(delay)
|
||||||
|
|
||||||
|
return results
|
||||||
Reference in New Issue
Block a user