#!/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é")