1+ module:
2+
3+ import fmt
4+ import os
5+
6+ global gPort = 8181_u16
7+
8+ global gReply = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 12\r\n\r\nHello World!";
9+
10+ pub fun htons(x u16) u16:
11+ return x << 8 | x >> 8
12+
13+
14+ macro make_blob# EXPR ($e EXPR) []:
15+ make_span(bitwise_as(@$e, ^u8), size_of(type_of($e)))
16+
17+ macro make_mut_blob# EXPR ($e EXPR) []:
18+ make_span(bitwise_as(@$e, ^!u8), size_of(type_of($e)))
19+
20+ fun main(argc s32, argv ^^u8) s32:
21+ trylet server_fd os\FD = os\Socket(os\AddressFamily.INET, os\SocketType.STREAM, 0), err:
22+ return 1
23+
24+ fmt\print#("Server fd: ", unwrap(server_fd), "\n")
25+ let! res void
26+
27+ ref let val = 1_u32
28+ tryset res = os\SetSocketOptions(server_fd, os\SocketLevel.SOCKET, os\SocketOption.SO_REUSEADDR,
29+ make_blob#(val)), err:
30+ return 1
31+
32+ ref let addr = {os\SockAddrIn: os\AddressFamily.INET, htons(gPort), {[4]u8: 0, 0, 0, 0}}
33+
34+ tryset res = os\Bind(server_fd, make_blob#(addr)), err:
35+ return 1
36+
37+ tryset res = os\Listen(server_fd, 3), err:
38+ return 1
39+
40+ fmt\print#("Listening on port: ", gPort, "\n")
41+
42+ while true:
43+ fmt\print#("Waiting for connection\n")
44+ ref let addr os\SockAddrIn = undef
45+ trylet client_fd os\FD = os\AcceptWithAddr(server_fd, make_mut_blob#(addr), 0), err:
46+ return 1
47+ trylet n uint = os\SendTo(client_fd, gReply, 0), err:
48+ return 1
49+ trylet n2 uint = os\SendTo(client_fd, "\r\n COOL\n\n\n", 0), err:
50+ return 1
51+ fmt\print#("Sent ", n, " bytes\n")
52+ tryset res = os\Close(client_fd), err:
53+ return 1
54+
55+ tryset res = os\Shutdown(server_fd, os\SHUT.RDWR), err:
56+ return 1
57+
58+ tryset res = os\Close(server_fd), err:
59+ return 1
60+
61+ return 0
0 commit comments