utility functions for implementing noja functions in c; built-ins for socket management; http server draft in noja
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
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);
|
||||
};
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user