nx_mcp_http_gate_t174.nx source
↩ module page · 50 lines · 4102 B
1import "nx_mcp_pending_http_t174.nx"
2import "nx_gate_verdict.nx"
3func h174_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 h174_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=h174_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",h174_has(d,n[0],"\"status\":503")==1&&h174_has(d,n[0],"\"upstream_stage\":\"read-after-accept\"")==1&&h174_has(d,n[0],"\"upstream_retry\":\"unsafe\"")==1,ctr)
22 gv_check("retry hint is observation not autoretry",h174_has(d,n[0],"\"retry_after\":\"5\"")==1&&h174_has(d,n[0],"\"automatic_retry\":false")==1,ctr)
23 gv_check("request witness retained",h174_has(d,n[0],"\"request_id\":\"witness-174\"")==1,ctr)
24 gv_check("raw body and secrets omitted",h174_has(d,n[0],"PRIVATE_BODY")==0&&h174_has(d,n[0],"SECRET_COOKIE")==0&&h174_has(d,n[0],"SECRET_AUTH")==0,ctr)
25 gv_check("body framing and digest reported",h174_has(d,n[0],"content-length-complete")==1&&h174_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 fd:i64=sys_openat_exclusive("/tmp/mcp-http-error-t174-b.json",384)
29 gv_check("exclusive error fixture",fd>=0,ctr)
30 if fd<0{return 1}
31 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)
32 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)
33 let parsed:*NxValue=nx_value_parse_json(error,count[0],&v)
34 gv_check("detailed error valid JSON",v==NX_VAL_PARSE_OK,ctr)
35 gv_check("JSON-RPC request id preserved",h174_has(error,count[0],"\"id\":\"request-174\"")==1&&h174_has(error,count[0],"\"http\":{")==1,ctr)
36 d=h174_response("{\"stage\":\"connect\"}","Retry-After: 5\r\nRetry-After: 9\r\n",0,n)
37 gv_check("duplicate retry hint reported ambiguous",h174_has(d,n[0],"\"retry_after\":null")==1&&h174_has(d,n[0],"ambiguous-duplicate")==1,ctr)
38 d=h174_response(body,"",1,n)
39 gv_check("truncated body not treated as known stage",h174_has(d,n[0],"length-mismatch")==1&&h174_has(d,n[0],"\"upstream_stage\":null")==1,ctr)
40 d=h174_response("{\"stage\":\"connect\",\"stage\":\"read\"}","",0,n)
41 gv_check("ambiguous stage not asserted",h174_has(d,n[0],"\"upstream_stage\":null")==1,ctr)
42 d=h174_response("<html>PRIVATE_BODY</html>","",0,n)
43 gv_check("HTML remains digest only",h174_has(d,n[0],"PRIVATE_BODY")==0&&h174_has(d,n[0],"\"upstream_stage\":null")==1,ctr)
44 let raw429:*u8="HTTP/1.1 429 Too Many Requests\r\nContent-Length: 2\r\nRetry-After: 17\r\n\r\n{}"
45 let p429:*i64=nx_http_resp_alloc()
46 gv_check("429 fixture parses",nx_http_response_parse(raw429,mpe_slen(raw429),p429)==0,ctr)
47 d=mpe_http_evidence(raw429,mpe_slen(raw429),p429,n)
48 gv_check("429 preserved without retry",h174_has(d,n[0],"\"status\":429")==1&&h174_has(d,n[0],"\"retry_after\":\"17\"")==1&&h174_has(d,n[0],"\"automatic_retry\":false")==1,ctr)
49 return gv_verdict("MCP-HTTP-SELECTIVE-DIAGNOSTICS",ctr,"safe HTTP evidence preserves uncertainty and never retries")
50}