from __future__ import annotations import json import time from typing import Any import httpx class HttpHealthCheckExecutor: def execute(self, params: dict[str, Any]) -> tuple[bool, str, dict[str, Any], dict[str, Any]]: url = params["url"] method = str(params.get("method", "GET")).upper() timeout_ms = int(params.get("timeout_ms", 3000)) expected_status = params.get("expected_status", 200) body_contains = params.get("body_contains") headers = params.get("headers", {}) started_at = time.perf_counter() with httpx.Client(timeout=timeout_ms / 1000.0) as client: response = client.request(method, url, headers=headers) latency_ms = max(int((time.perf_counter() - started_at) * 1000), 0) success = response.status_code == int(expected_status) if success and body_contains is not None: success = str(body_contains) in response.text message = f"{response.status_code} {response.reason_phrase}" data: dict[str, Any] = { "status_code": response.status_code, "latency_ms": latency_ms, "method": method, "expected_status": int(expected_status), } evidence = { "response_body": response.text, } try: evidence["response_json"] = json.loads(response.text) except Exception: pass return success, message, data, evidence