fix(harfanglab): retry transient API errors (1.7.3)
HarfangLab answers a 500 now and then on a call that passes when sent again. Each script's request() now retries up to three times (1, 2, 4 s): GET on 429/500/502/503/504, writes only on 429/502/503 so an isolation, a kill or a job is never sent twice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,12 +1,31 @@
|
||||
import json, os, sys, urllib.request, urllib.parse, urllib.error
|
||||
import json, os, sys, time, urllib.request, urllib.parse, urllib.error
|
||||
|
||||
|
||||
RETRIES = 3
|
||||
|
||||
|
||||
def retryable(method, status):
|
||||
# HarfangLab answers a 500 now and then on a call that passes when sent again.
|
||||
# A read is safe to resend; a write only on an answer that says the action was
|
||||
# not run (rate limit, gateway down), so an isolation or a job is never sent twice.
|
||||
if status in (429, 502, 503):
|
||||
return True
|
||||
return method == "GET" and status in (500, 504)
|
||||
|
||||
|
||||
def request(method, url, headers, body=None):
|
||||
data = json.dumps(body).encode("utf-8") if body is not None else None
|
||||
req = urllib.request.Request(url, data=data, headers=headers, method=method)
|
||||
with urllib.request.urlopen(req, timeout=60) as resp:
|
||||
raw = resp.read()
|
||||
return json.loads(raw) if raw else {}
|
||||
for attempt in range(RETRIES + 1):
|
||||
req = urllib.request.Request(url, data=data, headers=headers, method=method)
|
||||
try:
|
||||
with urllib.request.urlopen(req, timeout=60) as resp:
|
||||
raw = resp.read()
|
||||
return json.loads(raw) if raw else {}
|
||||
except urllib.error.HTTPError as e:
|
||||
if attempt == RETRIES or not retryable(method, e.code):
|
||||
raise
|
||||
e.close()
|
||||
time.sleep(2 ** attempt)
|
||||
|
||||
|
||||
def qs(params):
|
||||
|
||||
Reference in New Issue
Block a user