request = import("request.noja"); response = import("response.noja"); respond = response.new; Router = import("router.noja").Router; fun handleClient(fd: int, router: Router) { req, error, error_is_internal = request.fromSocket(fd); if error != none: { if error_is_internal: res = respond(500, error); else res = respond(400, error); } else { if req.version.major != 1: res = respond(505, "HTTP version not supported"); else res = router->solve(req); } return response.toSocket(fd, res); } return { fun serve(addr: ?String, port: int = 8080, router: Router, backlog=32) { server_fd, error = net.socket(net.AF_INET, net.SOCK_STREAM, 0, true); if error != none: return none, error; error = net.bind(server_fd, net.AF_INET, port, addr); if error != none: { net.close(server_fd); return none, error; } error = net.listen(server_fd, backlog); if error != none: { net.close(server_fd); return none, error; } while true: { new_fd, addr_or_err, port = net.accept(server_fd); if new_fd == none: error = addr_or_err; else { error = handleClient(new_fd, router); net.close(new_fd); } if error != none: print(error); } net.close(server_fd); } };