code wiki / _hdl_build / nx_site_intake_serve.nx

nx_site_intake_serve.nx source

↩ module page · 129 lines · 5677 B

1// nx_site_intake_serve.nx -- the DEPLOYABLE ops shell around the gated pure core nx_site_intake 2// (thin-daemon discipline, nx_survey_daemon precedent: ALL decision logic lives in the 8/8-gated core, 3// this file only binds/reads/writes). LOOPBACK-ONLY 127.0.0.1:8033 -- public traffic must arrive via 4// the sovereign edge proxy row (/intake/ -> 127.0.0.1:8033, debt 1785936366), never directly; binding 5// loopback (tighter than the survey daemon's 0.0.0.0) means a firewall slip cannot expose the raw port. 6// Store plane knowledge/store/siteintake- + evidence log knowledge/status/site_intake.log; store dirs 7// self-healed on startup (the relate-daemon lesson). SO_REUSEADDR so the reconcile cron can rebind 8// instantly after a crash (the office TIME_WAIT lesson). The read helper mirrors sv2_read_req -- 2nd 9// use in the estate; extract to a shared nx_http_read lib on the 3rd (rule 15). Build with 10// --build-only; started deliberately by the mount hook, never as a build side-effect. 11// license_tier: ORIGINAL No hw writes (Rule 26). 12import "nx_site_intake.nx" 13 14const SIS_PORT: i64 = 0x1f61 15const SIS_REQ: i64 = 8192 16const SIS_RESP: i64 = 4096 17const SIS_BACKLOG: i64 = 16 18const SIS_ADDRSZ: i64 = 16 19const SIS_CL_KEYLEN: i64 = 15 20const SIS_B127: i64 = 127 21const SIS_DMODE: i64 = 493 22 23func sis_p(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 24 25func sis_addr(out: *u8, port: i64) -> i64 { 26 out[0] = 2 as u8 27 out[1] = 0 as u8 28 out[2] = ((port >> 8) & 0xff) as u8 29 out[3] = (port & 0xff) as u8 30 out[4] = SIS_B127 as u8 31 out[5] = 0 as u8 32 out[6] = 0 as u8 33 out[7] = 1 as u8 34 var i: i64 = 8 35 while i < SIS_ADDRSZ { out[i] = 0 as u8; i = i + 1 } 36 return 0 37} 38 39// bounded HTTP request read: headers to CRLFCRLF, then Content-Length more bytes (the sv2_read_req shape) 40func sis_read_req(fd: i64, buf: *u8, cap: i64) -> i64 { 41 var n: i64 = 0 42 var hdr_end: i64 = 0 - 1 43 var want: i64 = 0 - 1 44 var go: i64 = 1 45 while go == 1 { 46 if n >= cap - 1 { go = 0 } else { 47 let r: i64 = sys_read(fd, (buf as i64 + n) as *u8, cap - 1 - n) 48 if r <= 0 { go = 0 } else { 49 n = n + r 50 if hdr_end < 0 { 51 var i: i64 = 0 52 while i + 3 < n { 53 if buf[i] == (SI_B_CR as u8) { if buf[i+1] == (SI_B_LF as u8) { if buf[i+2] == (SI_B_CR as u8) { if buf[i+3] == (SI_B_LF as u8) { hdr_end = i + 4; i = n } } } } 54 i = i + 1 55 } 56 if hdr_end >= 0 { 57 var cl: i64 = 0 - 1 58 let key: *u8 = "Content-Length:" as *u8 59 var j: i64 = 0 60 while j + SIS_CL_KEYLEN < hdr_end { 61 var m: i64 = 1 62 var q: i64 = 0 63 while q < SIS_CL_KEYLEN { if buf[j+q] != key[q] { m = 0; q = SIS_CL_KEYLEN } else { q = q + 1 } } 64 if m == 1 { 65 var v: i64 = 0 66 var t: i64 = j + SIS_CL_KEYLEN 67 while t < hdr_end { 68 let c: i64 = buf[t] as i64 69 if c >= SI_B_0 { if c <= SI_B_9 { v = v * SI_TEN + (c - SI_B_0) } } 70 if c == SI_B_CR { t = hdr_end } 71 t = t + 1 72 } 73 cl = v 74 j = hdr_end 75 } 76 j = j + 1 77 } 78 if cl < 0 { want = hdr_end } else { want = hdr_end + cl } 79 } 80 } 81 if want >= 0 { if n >= want { go = 0 } } 82 } 83 } 84 } 85 return n 86} 87 88func sis_write_all(fd: i64, buf: *u8, n: i64) -> i64 { 89 var off: i64 = 0 90 while off < n { 91 let w: i64 = sys_write(fd, (buf as i64 + off) as *u8, n - off) 92 if w <= 0 { return off } 93 off = off + w 94 } 95 return off 96} 97 98func main() -> i64 { 99 sys_mkdir("knowledge" as *u8, SIS_DMODE) 100 sys_mkdir("knowledge/store" as *u8, SIS_DMODE) 101 sys_mkdir("knowledge/status" as *u8, SIS_DMODE) 102 let plane: *u8 = "knowledge/store/siteintake-" as *u8 103 let logf: *u8 = "knowledge/status/site_intake.log" as *u8 104 let addr: *u8 = sys_mmap(SIS_ADDRSZ) 105 sis_addr(addr, SIS_PORT) 106 let lfd: i64 = sys_socket(AF_INET, SOCK_STREAM, 0) 107 if lfd < 0 { sis_p("NX-SITE-INTAKE-SERVE socket FAILED -- fail loud\n" as *u8); return 1 } 108 let one: *i64 = (sys_mmap(8)) as *i64 109 one[0] = 1 110 sys_setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, one as *u8, 4) 111 if sys_bind(lfd, addr, SIS_ADDRSZ) < 0 { sis_p("NX-SITE-INTAKE-SERVE bind 127.0.0.1:8033 FAILED (port busy?) -- fail loud\n" as *u8); return 1 } 112 if sys_listen(lfd, SIS_BACKLOG) < 0 { sis_p("NX-SITE-INTAKE-SERVE listen FAILED -- fail loud\n" as *u8); return 1 } 113 sis_p("NX-SITE-INTAKE-SERVE serving http://127.0.0.1:8033/intake/<slug> plane=knowledge/store/siteintake- (accept loop)\n" as *u8) 114 let reqb: *u8 = sys_mmap(SIS_REQ) 115 let resb: *u8 = sys_mmap(SIS_RESP) 116 var go: i64 = 1 117 while go == 1 { 118 let cfd: i64 = sys_accept(lfd) 119 if cfd >= 0 { 120 let rn: i64 = sis_read_req(cfd, reqb, SIS_REQ) 121 if rn > 0 { 122 let on: i64 = si_route(reqb, rn, resb, plane, logf) 123 if on > 0 { sis_write_all(cfd, resb, on) } 124 } 125 sys_close(cfd) 126 } 127 } 128 return 0 129}