#!/usr/bin/env catnip
# Requêtes HTTP avec httpx
# httpx est un client HTTP moderne (sync/async, HTTP/2)
#
# Services HTTP echo interchangeables (même API) :
#   - https://httpbin.org   (original, parfois instable)
#   - https://httpbin.dev   (clone fiable)
#   - https://httpcan.org   (clone Rust)
#
# DEPS: httpx
# INTERNET: oui (service echo httpbin)

httpx = import('httpx')
json = import('json')

# Service de test (changer ici si besoin)
BASE_URL = "https://httpbin.dev"

# GET simple

print("⇒ Requête GET")
response = httpx.get(f"{BASE_URL}/get")
print("  Statut:", response.status_code)
print("  Content-Type:", response.headers['content-type'])

# Parsing JSON de la réponse

print()
print("⇒ Parsing JSON")
data = response.json()
print("  IP origine:", data['origin'])
print("  URL:", data['url'])

# GET avec paramètres

print()
print("⇒ GET avec paramètres")
params = dict(name="catnip", version="0.1")
response = httpx.get(f"{BASE_URL}/get", params=params)
data = response.json()
print("  Args reçus:", data['args'])

# GET avec en-têtes

print()
print("⇒ GET avec en-têtes personnalisés")
headers = dict(("X-Custom-Header", "catnip-test"), Accept="application/json")
response = httpx.get(f"{BASE_URL}/headers", headers=headers)
data = response.json()
print("  Headers envoyés:")
for key in data['headers'].keys() {
    if key.startswith('X-') {
        print("    ", key, ":", data['headers'][key])
    }
}

# POST avec JSON

print()
print("⇒ POST JSON")
payload = dict(message="Hello from Catnip", count=42)
response = httpx.post(f"{BASE_URL}/post", json=payload)
data = response.json()
print("  JSON envoyé:", data['json'])

# POST avec données de formulaire

print()
print("⇒ POST avec données de formulaire")
form_data = dict(username="alice", password="secret123")
response = httpx.post(f"{BASE_URL}/post", data=form_data)
data = response.json()
print("  Données de formulaire:", data['form'])

# Accès aux bytes bruts

print()
print("⇒ Réponse en bytes")
response = httpx.get(f"{BASE_URL}/bytes/16")
print("  Bytes reçus:", len(response.content), "octets")
print("  Brut:", response.content)

# Gestion des erreurs HTTP

print()
print("⇒ Gestion erreurs")
response = httpx.get(f"{BASE_URL}/status/404")
print("  Statut 404:", response.status_code)
print("  Est une erreur:", response.status_code >= 400)

# Timeout

print()
print("⇒ Timeout")
try {
    response = httpx.get(f"{BASE_URL}/delay/10", timeout=2.0)
    print("  Réponse reçue:", response.status_code)
} except {
    e: RuntimeError => { print("  Timeout attrapé:", e) }
}

# Réseau injoignable

print()
print("⇒ Hôte injoignable")
try {
    httpx.get("http://192.0.2.1/nope", timeout=1.0)
} except {
    _ => { print("  Connexion échouée (attrapé)") }
}

print()
print("⇒ Terminé")