code wiki / (root) / nx_mcp_https_gate.nx

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}