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