Files
Noja/examples/http_server/server.noja
T

80 lines
1.6 KiB
Plaintext

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