code wiki / _hdl_build / nx_serve_roadmap.nx
nx_serve_roadmap.nx source
↩ module page · 60 lines · 2932 B
1// nx_serve_roadmap.nx -- the team SERVES the /roadmap/andelinwest page over a real socket using its OWN
2// sovereign HTTP server (nx_http_server), bits-up: socket -> bind -> listen -> accept -> read request ->
3// send the roadmap HTML. No Python, no third-party. This is "3 live" on the sovereign stack; mapping the
4// public nishifamily.com/roadmap/andelinwest URL to it is the container/NAS deploy step. license_tier: ORIGINAL
5
6import "nx_http_server.nx"
7import "nx_syscalls.nx"
8const K_MAGIC_1024: i64 = 1024
9const K_MAGIC_8088: i64 = 8088
10const K_MAGIC_8192: i64 = 8192
11const K_MAGIC_100000: i64 = 100000
12
13func sv_w(dst: *u8, pos: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { dst[pos + i] = s[i]; i = i + 1 } return pos + i }
14func sv_itoa(dst: *u8, pos: i64, v: i64) -> i64 {
15 if v == 0 { dst[pos] = 48; return pos + 1 }
16 let t: *u8 = sys_mmap(28); var m: i64 = v; var k: i64 = 0
17 while m > 0 { t[k] = 48 + (m % 10); m = m / 10; k = k + 1 }
18 var i: i64 = 0; while i < k { dst[pos + i] = t[k - 1 - i]; i = i + 1 }
19 return pos + k
20}
21
22func main() -> i64 {
23 // read the roadmap page the team's web-builder emitted
24 let lenp: *i64 = sys_mmap(16) as *i64
25 let body: *u8 = sys_read_file("knowledge/projects/andelinwest_roadmap.html" as *u8, lenp)
26 let blen: i64 = lenp[0]
27 if blen <= 0 { sys_write(1, "no page\n" as *u8, 8); sys_exit(1); return 1 }
28
29 // build the full HTTP/1.1 response once (static page)
30 let resp: *u8 = sys_mmap(blen + K_MAGIC_1024)
31 var p: i64 = 0
32 p = sv_w(resp, p, "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: " as *u8)
33 p = sv_itoa(resp, p, blen)
34 p = sv_w(resp, p, "\r\nConnection: close\r\n\r\n" as *u8)
35 var i: i64 = 0; while i < blen { resp[p] = body[i]; p = p + 1; i = i + 1 }
36 let resp_n: i64 = p
37
38 // listen on 0.0.0.0:8088 with the team's sovereign HTTP server
39 let addr: *u8 = sys_mmap(32)
40 nx_http_server_addr_any(addr, K_MAGIC_8088)
41 let v: *i64 = sys_mmap(16) as *i64
42 let lfd: i64 = nx_http_server_listen(addr, 16, v)
43 if lfd < 0 { sys_write(1, "listen failed\n" as *u8, 14); sys_exit(2); return 2 }
44 sys_write(1, "serving /roadmap/andelinwest on :8088\n" as *u8, 38)
45
46 // accept loop -- serve the page to each client
47 let reqbuf: *u8 = sys_mmap(K_MAGIC_8192)
48 let om: *i64 = sys_mmap(16) as *i64; let opo: *i64 = sys_mmap(16) as *i64; let opl: *i64 = sys_mmap(16) as *i64
49 let ocl: *i64 = sys_mmap(16) as *i64; let obo: *i64 = sys_mmap(16) as *i64; let orn: *i64 = sys_mmap(16) as *i64
50 var served: i64 = 0
51 while served < K_MAGIC_100000 {
52 let cfd: i64 = nx_http_server_accept_one(lfd, v)
53 if cfd >= 0 {
54 nx_http_server_read_request(cfd, reqbuf, K_MAGIC_8192, om, opo, opl, ocl, obo, orn)
55 nx_http_server_send_response(cfd, resp, resp_n)
56 served = served + 1
57 }
58 }
59 sys_exit(0); return 0
60}