http server
This commit is contained in:
63
examples/32-http-server.sx
Normal file
63
examples/32-http-server.sx
Normal file
@@ -0,0 +1,63 @@
|
||||
// HTTP server example (macOS only)
|
||||
|
||||
#import "modules/std.sx";
|
||||
#import "modules/socket.sx";
|
||||
|
||||
main :: () -> s32 {
|
||||
PORT :: 8080;
|
||||
|
||||
fd := socket(AF_INET, SOCK_STREAM, 0);
|
||||
if fd < 0 {
|
||||
print("error: socket()\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
opt : s32 = 1;
|
||||
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, @opt, 4);
|
||||
|
||||
addr := SockAddr.{
|
||||
sin_len = 16,
|
||||
sin_family = 2,
|
||||
sin_port = htons(PORT),
|
||||
sin_addr = 0,
|
||||
sin_zero = 0
|
||||
};
|
||||
|
||||
if bind(fd, @addr, 16) < 0 {
|
||||
print("error: bind()\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if listen(fd, 10) < 0 {
|
||||
print("error: listen()\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
print("listening on http://localhost:{}\n", PORT);
|
||||
|
||||
while true {
|
||||
client := accept(fd, null, null);
|
||||
if client < 0 { continue; }
|
||||
|
||||
// Read request
|
||||
buf := alloc(4096);
|
||||
read(client, buf, 4096);
|
||||
|
||||
// Send response
|
||||
body := "<html><body><h1>Hello from sx!</h1></body></html>";
|
||||
response := format("HTTP/1.1 200 OK\r
|
||||
Content-Type: text/html\r
|
||||
Connection: close\r
|
||||
Content-Length: {}\r
|
||||
\r
|
||||
{}", body.len, body);
|
||||
|
||||
write(client, response, response.len);
|
||||
|
||||
close(client);
|
||||
print(" served request\n");
|
||||
}
|
||||
|
||||
close(fd);
|
||||
0;
|
||||
}
|
||||
Reference in New Issue
Block a user