from http.server import BaseHTTPRequestHandler,HTTPServer
from pathlib import Path
from threading import Thread
from urllib.request import urlopen
from urllib.error import HTTPError
import json,time
class Handler(BaseHTTPRequestHandler):
 count=0
 def do_GET(self):
  Handler.count+=1
  status=429 if Handler.count==1 else 200
  self.send_response(status);self.send_header('Content-Type','application/json');self.send_header('Retry-After','0');self.end_headers()
  self.wfile.write(json.dumps({'fixture':True,'message':'local rate-limit exercise; no translation','attempt':Handler.count}).encode())
 def log_message(self,*args):pass
server=HTTPServer(('127.0.0.1',0),Handler);thread=Thread(target=server.serve_forever,daemon=True);thread.start();rows=[]
try:
 for attempt in range(1,4):
  try:
   with urlopen(f'http://127.0.0.1:{server.server_port}/fixture',timeout=5) as response:
    rows.append({'attempt':attempt,'status':response.status,'body':json.load(response)})
    break
  except HTTPError as e:
   rows.append({'attempt':attempt,'status':e.code,'retry_after':e.headers.get('Retry-After'),'body':json.loads(e.read())})
   if e.code!=429:raise
   time.sleep(min(float(e.headers.get('Retry-After','0')),1))
finally:server.shutdown();server.server_close();thread.join()
result={'fixture':True,'network':'localhost only','translation_model_executed':False,'requests':rows}
Path(__file__).with_name('retry-log.json').write_text(json.dumps(result,ensure_ascii=False,indent=2)+'\n');print(json.dumps(result,ensure_ascii=False,indent=2))
