Datatoy Logo

Serveur HTTP

Chaque requête devient un item du pipeline

Pipeline.server(routes) démarre un petit serveur HTTP et l'utilise comme source. Chaque route est un tuple (méthode, chemin, handler) ; handler reçoit le corps JSON décodé (None si absent ou invalide) et sa valeur de retour part dans le pipeline sous la forme (socket, valeur). Une étape en aval répond avec send_json_response(socket, dict), qui envoie la réponse JSON et ferme la connexion.

Signature

Pipeline.server(route_handlers, port=8000, host="localhost",
                debug=False, inactivity_timeout=None) -> Pipeline[tuple[socket, OutPacket]]
send_json_response(connection, response: dict, status=200, reason="OK") -> None
# route_handlers: list of (method, path, handler); handler(json_body) -> value
python
from olympipe import Pipeline
from olympipe.helpers.server import send_json_response

def handle(pair):
    connection, body = pair          # (socket, valeur renvoyée par le handler de route)
    result = {"square": body["x"] ** 2}
    send_json_response(connection, result)   # répond puis ferme la connexion
    return result

results = (
    Pipeline.server(
        [("POST", "/square", lambda body: body)],   # (méthode, chemin, handler)
        port=8000,
        inactivity_timeout=5.0,      # arrêt après 5 s sans requête
    )
    .task(handle, count=2)
    .wait_for_result()
)
print("served:", results)
Sortie
$ curl -X POST localhost:8000/square -d '{"x": 3}'
{"square": 9}
$ curl -X POST localhost:8000/square -d '{"x": 4}'
{"square": 16}
$ curl localhost:8000/nope
{"error": "Path not found"}

# côté serveur, après 5 s sans requête :
No route handler for GET /nope
Closing server due to inactivity
served: [{'square': 9}, {'square': 16}]

Comment ça fonctionne

Le serveur écoute sur host:port (par défaut localhost:8000) dès l'appel, avant même que les étapes suivantes soient ajoutées. Une requête sans route correspondante reçoit un 404 {"error": "Path not found"}. Sans inactivity_timeout, le serveur tourne indéfiniment ; avec, il s'arrête après ce nombre de secondes sans requête et le pipeline se termine. debug=True affiche chaque route traitée.