Files
Noja/examples/http_server/server.noja
T

57 lines
1.3 KiB
Plaintext

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);
}
};