nx_mcp_http_gate.nx source
↩ module page · 51 lines · 4167 B
1import "nx_mcp_pending.nx"
2import "nx_gate_verdict.nx"
3func mht_has(q:*u8,n:i64,lit:*u8)->i64{
4 var i:i64=0;let ln:i64=mpe_slen(lit)
5 while i+ln<=n{var k:i64=0;while k<ln{if q[i+k]!=lit[k]{break};k=k+1};if k==ln{return 1};i=i+1};return 0
6}
7func mht_response(body:*u8,headers:*u8,delta:i64,result:*i64)->*u8{
8 let b:*u8=sys_mmap(8192);var o:i64=mpe_cat(b,0,"HTTP/1.1 503 Service Unavailable\r\n")
9 o=mpe_cat(b,o,headers);o=mpe_cat(b,o,"Content-Type: application/problem+json\r\nContent-Length: ")
10 o=mpe_catn(b,o,mpe_slen(body)+delta);o=mpe_cat(b,o,"\r\n\r\n");o=mpe_cat(b,o,body)
11 let p:*i64=nx_http_resp_alloc();if nx_http_response_parse(b,o,p)!=0{return 0 as *u8}
12 return mpe_http_evidence(b,o,p,result)
13}
14func main()->i64{
15 let ctr:*i64=gv_ctr();gv_head("MCP-HTTP-SELECTIVE-DIAGNOSTICS")
16 let n:*i64=sys_mmap(8) as *i64
17 let body:*u8="{\"status\":503,\"stage\":\"read-after-accept\",\"retry\":\"unsafe\",\"detail\":\"PRIVATE_BODY_NOT_FOR_ERROR\"}"
18 var d:*u8=mht_response(body,"Retry-After: 5\r\nX-Request-Id: witness-174\r\nSet-Cookie: SECRET_COOKIE\r\nAuthorization: SECRET_AUTH\r\n",0,n)
19 gv_check("diagnostic allocated",(d as i64)>0,ctr)
20 if (d as i64)<=0{return 1}
21 gv_check("status and unsafe stage retained",mht_has(d,n[0],"\"status\":503")==1&&mht_has(d,n[0],"\"upstream_stage\":\"read-after-accept\"")==1&&mht_has(d,n[0],"\"upstream_retry\":\"unsafe\"")==1,ctr)
22 gv_check("retry hint is observation not autoretry",mht_has(d,n[0],"\"retry_after\":\"5\"")==1&&mht_has(d,n[0],"\"automatic_retry\":false")==1,ctr)
23 gv_check("request witness retained",mht_has(d,n[0],"\"request_id\":\"witness-174\"")==1,ctr)
24 gv_check("raw body and secrets omitted",mht_has(d,n[0],"PRIVATE_BODY")==0&&mht_has(d,n[0],"SECRET_COOKIE")==0&&mht_has(d,n[0],"SECRET_AUTH")==0,ctr)
25 gv_check("body framing and digest reported",mht_has(d,n[0],"content-length-complete")==1&&mht_has(d,n[0],"\"observed_body_sha256\":\"")==1,ctr)
26 var v:i64=0;let obj:*NxValue=nx_value_parse_json(d,n[0],&v)
27 gv_check("diagnostic valid JSON",v==NX_VAL_PARSE_OK&&obj.kind==NX_VAL_OBJECT,ctr)
28 let path:*u8=sys_mmap(128);var po:i64=mpe_cat(path,0,"/tmp/nishi-mcp-http-gate-");po=mpe_catn(path,po,sys_now_ms());path[po]=0 as u8
29 let fd:i64=sys_openat_exclusive(path,384)
30 gv_check("exclusive error fixture",fd>=0,ctr)
31 if fd<0{return 1}
32 gv_check("correlated detailed error write",mpe_write_error_detail(fd,NX_JSON_STRING,"request-174",11,1,0-32002,"http-status","non-2xx status",503,"inspect evidence",d,n[0])==0,ctr)
33 sys_close(fd);let count:*i64=sys_mmap(8) as *i64;let error:*u8=sys_read_file("/tmp/mcp-http-error-t174-a.json",count)
34 let parsed:*NxValue=nx_value_parse_json(error,count[0],&v)
35 gv_check("detailed error valid JSON",v==NX_VAL_PARSE_OK,ctr)
36 gv_check("JSON-RPC request id preserved",mht_has(error,count[0],"\"id\":\"request-174\"")==1&&mht_has(error,count[0],"\"http\":{")==1,ctr)
37 d=mht_response("{\"stage\":\"connect\"}","Retry-After: 5\r\nRetry-After: 9\r\n",0,n)
38 gv_check("duplicate retry hint reported ambiguous",mht_has(d,n[0],"\"retry_after\":null")==1&&mht_has(d,n[0],"ambiguous-duplicate")==1,ctr)
39 d=mht_response(body,"",1,n)
40 gv_check("truncated body not treated as known stage",mht_has(d,n[0],"length-mismatch")==1&&mht_has(d,n[0],"\"upstream_stage\":null")==1,ctr)
41 d=mht_response("{\"stage\":\"connect\",\"stage\":\"read\"}","",0,n)
42 gv_check("ambiguous stage not asserted",mht_has(d,n[0],"\"upstream_stage\":null")==1,ctr)
43 d=mht_response("<html>PRIVATE_BODY</html>","",0,n)
44 gv_check("HTML remains digest only",mht_has(d,n[0],"PRIVATE_BODY")==0&&mht_has(d,n[0],"\"upstream_stage\":null")==1,ctr)
45 let raw429:*u8="HTTP/1.1 429 Too Many Requests\r\nContent-Length: 2\r\nRetry-After: 17\r\n\r\n{}"
46 let p429:*i64=nx_http_resp_alloc()
47 gv_check("429 fixture parses",nx_http_response_parse(raw429,mpe_slen(raw429),p429)==0,ctr)
48 d=mpe_http_evidence(raw429,mpe_slen(raw429),p429,n)
49 gv_check("429 preserved without retry",mht_has(d,n[0],"\"status\":429")==1&&mht_has(d,n[0],"\"retry_after\":\"17\"")==1&&mht_has(d,n[0],"\"automatic_retry\":false")==1,ctr)
50 return gv_verdict("MCP-HTTP-SELECTIVE-DIAGNOSTICS",ctr,"safe HTTP evidence preserves uncertainty and never retries")
51}