commit d2e043118258db815d4811515d80032d12111f7a
parent 66a4548cbd232e5a4f2f53871c71e1ddc1597095
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 13:46:18 +0000
provider: integrate bounded client retry and budget behavior
Diffstat:
2 files changed, 49 insertions(+), 0 deletions(-)
diff --git a/src/hyf_provider/jev_client.mojo b/src/hyf_provider/jev_client.mojo
@@ -1,6 +1,8 @@
from flare.http import HttpClient
from flare.tls import TlsConfig, TlsVerify
from json import Value, dumps
+from hyf_provider.jev_failures import map_jev_failure
+from hyf_provider.jev_retry import RetryPolicy, should_retry
@fieldwise_init
@@ -84,3 +86,31 @@ def assert_tls_verification_required(config: TlsConfig) raises:
def redirects_forward_credentials() -> Bool:
return False
+
+
+def failure_kind_for_status(status: Int) -> String:
+ if status == 401:
+ return "authentication"
+ if status == 400 or status == 422 or status == 404:
+ return "validation"
+ if status == 408:
+ return "request_timeout"
+ if status == 429:
+ return "rate_limit"
+ if status == 529:
+ return "overloaded"
+ if status == 500 or status == 502 or status == 503 or status == 504:
+ return "internal_server"
+ return "unexpected_status"
+
+
+def retry_decision(
+ policy: RetryPolicy, attempt: Int, elapsed_ms: Int, status: Int
+) raises -> Bool:
+ if status >= 200 and status < 300:
+ raise Error("retry_decision requires a failure status")
+ var kind = failure_kind_for_status(status)
+ var failure = map_jev_failure(
+ kind if kind != "unexpected_status" else "transport"
+ )
+ return should_retry(policy, attempt, elapsed_ms, failure.retryable)
diff --git a/tests/test_jev.mojo b/tests/test_jev.mojo
@@ -348,3 +348,22 @@ def test_tls_and_redirect_policy() raises:
"http://127.0.0.1:" + String(port) + "/v1/systemone", "{}"
)
stub.wait()
+
+
+from hyf_provider.jev_client import failure_kind_for_status, retry_decision
+
+
+def test_bounded_retry_and_budget_behavior() raises:
+ assert_equal(failure_kind_for_status(401), "authentication")
+ assert_equal(failure_kind_for_status(429), "rate_limit")
+ assert_equal(failure_kind_for_status(500), "internal_server")
+ assert_equal(failure_kind_for_status(529), "overloaded")
+ var policy = retry_policy(2, 50, 200, 400)
+ assert_true(retry_decision(policy, 0, 0, 429))
+ assert_true(retry_decision(policy, 0, 0, 500))
+ assert_true(not retry_decision(policy, 0, 0, 401))
+ assert_true(not retry_decision(policy, 0, 0, 422))
+ assert_true(not retry_decision(policy, 2, 0, 429))
+ assert_true(not retry_decision(policy, 0, 390, 429))
+ with assert_raises():
+ _ = retry_decision(policy, 0, 0, 200)