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}