nx_mcp_https_gate.nx source
↩ module page · 53 lines · 4393 B
1import "nx_mcp_pending.nx"
2import "nx_gate_verdict.nx"
3func mhg_has(b:*u8,n:i64,s:*u8)->i64 {
4 let z:i64=mpe_slen(s);var i:i64=0
5 while i+z<=n {var k:i64=0;while k<z{if b[i+k]!=s[k]{break};k=k+1};if k==z{return 1};i=i+1};return 0
6}
7func mhg_path(base:*u8,suffix:*u8)->*u8{let p:*u8=sys_mmap(1024);var n:i64=mpe_cat(p,0,base);n=mpe_cat(p,n,suffix);p[n]=0 as u8;return p}
8func mhg_file(path:*u8,body:*u8)->i64{
9 let fd:i64=sys_openat_exclusive(path,384);if fd<0{return fd}
10 let r:i64=rp_write(fd,body,mpe_slen(body));sys_close(fd);return r
11}
12func mhg_run(elf:*u8,base:*u8,prefix:*u8,capfile:*u8,body:*u8,out:*u8,nout:*i64)->i64{
13 let inp:*u8=mhg_path(prefix,".in");let op:*u8=mhg_path(prefix,".out");let ep:*u8=mhg_path(prefix,".err")
14 if mhg_file(inp,body)!=0{return -1}
15 let inf:i64=sys_openat_rd(inp);let outf:i64=sys_openat_exclusive(op,384);let errf:i64=sys_openat_exclusive(ep,384)
16 if inf<0||outf<0||errf<0{return -2}
17 let av:*i64=sys_mmap(64) as *i64
18 av[0]=elf as i64;av[1]=base as i64;av[2]=capfile as i64;av[3]="4096" as i64;av[4]="16384" as i64;av[5]="4096" as i64;av[6]="15" as i64;av[7]=0
19 let env:*i64=sys_mmap(8) as *i64;env[0]=0
20 let pid:i64=sys_fork()
21 if pid==0 {sys_alarm(40);sys_dup3(inf,0,0);sys_dup3(outf,1,0);sys_dup3(errf,2,0);sys_execve(elf,av,env);sys_exit(127)}
22 sys_close(inf);sys_close(outf);sys_close(errf)
23 if pid<0{return -3}
24 let st:*i64=sys_mmap(8) as *i64;if sys_wait4(pid,st,0)!=pid{return -4}
25 let fd:i64=sys_openat_rd(op);if fd<0{return -5};nout[0]=sys_read(fd,out,16384);sys_close(fd)
26 if (st[0]&127)!=0{return 128+(st[0]&127)};return (st[0]>>8)&255
27}
28func mhg_lines(b:*u8,n:i64)->i64{
29 var p:i64=0;var count:i64=0
30 while p<n{var e:i64=p;while e<n{if b[e]==10 as u8{break};e=e+1}
31 if e>p{var verdict:i64=0;let v:*NxValue=nx_value_parse_json(b+p,e-p,&verdict);if verdict!=NX_VAL_PARSE_OK{return -1};if v.kind!=NX_VAL_OBJECT{return -2};count=count+1};p=e+1};return count
32}
33func main(argc:i64,argv:*i64)->i64{
34 if argc!=4{return 2}
35 let c:*i64=gv_ctr();gv_head("MCP-REAL-HTTPS-ERROR-INTEGRATION")
36 let prefix:*u8=sys_mmap(256);var z:i64=mpe_cat(prefix,0,"/tmp/nishi-mcp-https-gate-");z=mpe_catn(prefix,z,sys_now_ms());prefix[z]=0 as u8
37 let cp:*u8=mhg_path(prefix,".public-init-marker")
38 gv_check("noncredential fixture",mhg_file(cp,"public-protocol-initialize-probe-not-a-credential\n")==0,c)
39 let first:*u8="{\"jsonrpc\":\"2.0\",\"id\":\"missing-a\",\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"nishi-transport-gate\",\"version\":\"1\"}}}\n{\"jsonrpc\":\"2.0\",\"id\":\"missing-b\",\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"nishi-transport-gate\",\"version\":\"1\"}}}\n"
40 let b:*u8=sys_mmap(16384);let n:*i64=sys_mmap(8) as *i64
41 let rc:i64=mhg_run(argv[1] as *u8,argv[2] as *u8,mhg_path(prefix,".missing"),cp,first,b,n)
42 gv_check("missing-base process survives and exits cleanly",rc==0,c)
43 gv_check("two complete correlated errors",mhg_lines(b,n[0])==2&&mhg_has(b,n[0],"\"id\":\"missing-a\"")==1&&mhg_has(b,n[0],"\"id\":\"missing-b\"")==1,c)
44 gv_check("actual TLS HTTP404 preserved",mhg_has(b,n[0],"\"status\":404")==1&&mhg_has(b,n[0],"\"code\":-32002")==1,c)
45 gv_check("selective HTTP evidence used by actual bridge",mhg_has(b,n[0],"nishi.mcp-http-observation.v1")==1&&mhg_has(b,n[0],"\"automatic_retry\":false")==1,c)
46 gv_check("fixture capability not echoed",mhg_has(b,n[0],"public-protocol-initialize-probe-not-a-credential")==0,c)
47 gv_kv("missing_process_exit",rc);gv_kv("missing_output_bytes",n[0]);sys_write(1,b,n[0])
48 let good:*u8="{\"jsonrpc\":\"2.0\",\"id\":\"valid-c\",\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"nishi-transport-gate\",\"version\":\"1\"}}}\n"
49 let rc2:i64=mhg_run(argv[1] as *u8,argv[3] as *u8,mhg_path(prefix,".valid"),cp,good,b,n)
50 gv_check("separate valid-base invocation succeeds",rc2==0&&mhg_lines(b,n[0])==1&&mhg_has(b,n[0],"\"id\":\"valid-c\"")==1&&mhg_has(b,n[0],"\"result\"")==1&&mhg_has(b,n[0],"\"error\"")==0,c)
51 gv_kv("valid_process_exit",rc2);gv_kv("valid_output_bytes",n[0]);sys_write(1,b,n[0])
52 return gv_verdict("MCP-REAL-HTTPS-ERROR-INTEGRATION",c,"Actual compiled bridge; missing-base request sequence and separate valid-base initialize; no TLS bypass, no credential copying.")
53}