request = import("request.noja"); response = import("response.noja"); Server = { fd: int, callback: Callable, loop : Callable, close: Callable }; fun handleClient(fd: int, server: Server) { req, error, error_is_internal = request.fromSocket(fd); if error != none: { if error_is_internal: { if debug: res = response.new(500, error); else res = response.new(500); } else res = response.new(400, error); } else { if req.version.major != 1: res = response.new(505, "HTTP version not supported"); else res = server.callback(req); } return response.toSocket(fd, res); } fun fallback_callback(request: Request) return response.new(500, "No callback provided"); return { Server: Server, fun new(callback: Callable = fallback_callback, addr : String = "127.0.0.1", port : int = 8080, backlog : int = 32) { fd, err = net.socket(net.AF_INET, net.SOCK_STREAM, 0, true); if err != none: return none, err; if (err = net.bind(fd, net.AF_INET, port, addr)) != none: { net.close(fd); return none, err; } if (err = net.listen(fd, backlog)) != none: { net.close(fd); return none, err; } return { fd: fd, callback: callback, fun loop(server: Server) { while true: { fd, addr_or_err, port = net.accept(server.fd); if fd == none: error = addr_or_err; else { error = handleClient(fd, server); net.close(fd); } if error != none: print(error); } } fun close(server: Server) net.close(server.fd); }; } };