80 lines
1.6 KiB
Plaintext
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, 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);
|
|
};
|
|
}
|
|
}; |