57 lines
1.3 KiB
Plaintext
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);
|
|
}
|
|
}; |