code wiki / _hdl_build / nx_apistack_content_gate.nx
nx_apistack_content_gate.nx source
↩ module page · 46 lines · 2926 B
1// nx_apistack_content_gate.nx -- hermetic gate for CAP-API-CONTENT. Proves Accept matching, first-supported choice,
2// wildcard, and 406 on no acceptable type. expect_exit: 0
3import "nx_syscalls.nx"
4import "nx_apistack_content.nx"
5import "nx_gate_verdict.nx"
6
7func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
8func gn(v: i64) -> i64 { var t: i64=v; if t<0{sys_write(1,"-" as *u8,1);t=0-t} let tm:*u8=sys_mmap(24); var k:i64=0; if t==0{tm[0]=48 as u8;k=1} while t>0{tm[k]=(48+(t%10)) as u8;t=t/10;k=k+1} let b:*u8=sys_mmap(24); var j:i64=0; while j<k{b[j]=tm[k-1-j];j=j+1} sys_write(1,b,k); return 0 }
9func g_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
10
11func main(argc: i64, argv: *i64) -> i64 {
12 gp("=== nx_apistack_content_gate (content-negotiation) ===\n" as *u8)
13 let sup: *i64 = sys_mmap(64) as *i64
14 sup[0] = "application/json" as *u8 as i64
15 sup[1] = "text/plain" as *u8 as i64
16 var pass: i64 = 0; var fail: i64 = 0
17
18 let aj: *u8 = "application/json" as *u8
19 if cn_accepts(aj, g_slen(aj), "application/json" as *u8) == 1 { pass=pass+1; gp(" T1 accepts exact PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL\n" as *u8) }
20
21 let ah: *u8 = "text/html" as *u8
22 if cn_accepts(ah, g_slen(ah), "application/json" as *u8) == 0 { pass=pass+1; gp(" T2 non-match -> not accepted PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL\n" as *u8) }
23
24 let both: *u8 = "application/json, text/plain" as *u8
25 if cn_choose(both, g_slen(both), sup, 2) == 0 { pass=pass+1; gp(" T3 choose json (first supported) PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL\n" as *u8) }
26
27 let tp: *u8 = "text/plain" as *u8
28 if cn_choose(tp, g_slen(tp), sup, 2) == 1 { pass=pass+1; gp(" T4 choose text/plain PASS\n" as *u8) } else { fail=fail+1; gp(" T4 FAIL\n" as *u8) }
29
30 let star: *u8 = "*/*" as *u8
31 if cn_choose(star, g_slen(star), sup, 2) == 0 { pass=pass+1; gp(" T5 wildcard -> first supported PASS\n" as *u8) } else { fail=fail+1; gp(" T5 FAIL\n" as *u8) }
32
33 let xml: *u8 = "application/xml" as *u8
34 if cn_choose(xml, g_slen(xml), sup, 2) == (0-1) { pass=pass+1; gp(" T6 none acceptable -> -1 (406) PASS\n" as *u8) } else { fail=fail+1; gp(" T6 FAIL\n" as *u8) }
35
36 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
37 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
38 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
39 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
40 let ctr__dry: *i64 = gv_ctr()
41 ctr__dry[0] = pass
42 ctr__dry[1] = pass + fail
43 let rc__dry: i64 = gv_verdict("APISTACK-CONTENT-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
44 sys_exit(rc__dry)
45 return rc__dry
46}