51 / Redes

Servidor HTTP

Un servidor HTTP mínimo usando http_serve de std/http. La función handler recibe un array de request ya parseado [type, method, path, headers, body] y retorna un string de respuesta HTTP construido con http_response. El servidor se bloquea en un bucle de accept, manejando una petición a la vez.

51-http-server.nxFuente →
// Minimal HTTP server using std/http
// Servidor HTTP mínimo usando std/http

import "std/http"

fn on_request(req: Array) -> String {
    let method: String = req[1]
    let path: String = req[2]

    if path == "/" {
        return http_response(200, "Hello from Nyx!")
    }
    if path == "/time" {
        let t: int = time()
        return http_response(200, "timestamp: " + int_to_string(t))
    }
    return http_response(404, "not found: " + path)
}

fn main() -> int {
    print("listening on :8080")
    // http_serve blocks, accepting connections in a loop
    // Each request calls on_request and sends the response
    // Siempre se chequea el retorno del bind: si el puerto esta ocupado,
    // http_serve devuelve -1 y el programa seguiria "corriendo" sin servidor.
    if http_serve(8080, on_request) < 0 {
        print("no se pudo bindear el puerto 8080")
        return 1
    }
    return 0
}
Salida ilustrativastdout
listening on :8080

Cómo funciona

http_serve(port, handler) escucha en el puerto indicado y entra en un bucle de accept infinito. Para cada conexión, parsea la petición HTTP en un array, llama a la función handler, envía la respuesta y cierra la conexión. Solo retorna en caso de fallo — un valor negativo cuando el puerto no se puede enlazar —, así que este ejemplo revisa ese retorno y sale con estado 1 en vez de aparentar que está sirviendo.

http_response(status, body) construye una respuesta HTTP/1.1 correctamente formateada con los headers Content-Length y Connection: close. Para headers personalizados (como Content-Type: application/json), usa http_response_with_headers.

Para servir con múltiples hilos, usa http_serve_mt(port, num_workers, handler), que despacha las conexiones a un pool de hilos mediante channels — el mismo camino que toma un servidor HTTP de producción escrito en Nyx.